Is EntityFieldQuery really this inefficient?
The EntityFieldQuery class is as efficient as its requirements allow it to be. It needs to be compatible with any field storage classes, even with those that use a NoSQL engine to store the field data, such as the one that uses MongoDB. For that reason, EntityFieldQuery cannot directly query the database, because the current field storage backend might not use an SQL database at all.

Even in the case the field storage uses a SQL engine to store its data, the equivalent of $query-&gt;leftJoin('field_data_field_user_role', 'role', 'n.nid = role.entity_id'); $query-&gt;condition('role.field_user_role_value', $some_value); for the EntityFieldQuery class requires:


Code to build the database table name from the field name
Code to build the condition to use to join the table containing the field data with the table containing the entity data
Code to build the name of the database row containing the field data


The difference is immediately visible: In one case you are using three litteral strings, while in the other case there is code that (in the simplest of the cases) is concatenating strings.

As per your comment about code that checks if the user has the permission to access the fields, you can bypass that using the following line to the code using the EntityFieldQuery class.

$query-&gt;addTag('DANGEROUS_ACCESS_CHECK_OPT_OUT');


This works if you are using Drupal 7.15, or higher; for earlier versions, you should use the following code.

$account = user_load(1);
$query-&gt;addMetaData('account', $account);


As usual, you should not bypass the access permission if the code could show to the user information to which the user should not have access. This is similar to what is done from Drupal when an unpublished node is only shown to the users who have the permission to see unpublished nodes. If the code's purpose is, for example, selecting some entities that are successively deleted (e.g. during cron tasks), then by-passing the access control doesn't make any harm, and it is the only way to proceed.