• Lazy initialization
    For collection elements

  • Subselect fetching
    Doctrine knows how to fetch collections efficiently using a subselect.

  • Executing SQL statements later, when needed
    The connection never issues an INSERT or UPDATE until it is actually needed. So if an exception occurs and you need to abort the transaction, some statements will never actually be issued. Furthermore, this keeps lock times in the database as short as possible (from the late UPDATE to the transaction end).

  • Join fetching
    Doctrine knows how to fetch complex object graphs using joins and subselects

  • Multiple collection fetching strategies
    Doctrine has multiple collection fetching strategies for performance tuning.

  • Dynamic mixing of fetching strategies
    Fetching strategies can be mixed and for example users can be fetched in a batch collection while users' phonenumbers are loaded in offset collection using only one query.

  • Driver specific optimizations
    Doctrine knows things like bulk-insert on mysql

  • Transactional single-shot delete
    Doctrine knows how to gather all the primary keys of the pending objects in delete list and performs only one sql delete statement per table.

  • Updating only the modified columns.
    Doctrine always knows which columns have been changed.

  • Never inserting/updating unmodified objects.
    Doctrine knows if the the state of the record has changed.

  • PDO for database abstraction
    PDO is by far the fastest availible database abstraction layer for php.