Para responder sua pergunta resumidamente, db_query é o mais rápido! Aqui estão algumas razões, fatos e números compilados a partir de diferentes perguntas, fontes:
Um simples estudo desta questão, apresentou os seguintes resultados:
For simple queries, db_query() is 22% faster than db_select()
For simple queries, db_query() is 124% faster than EFQ
For queries with two joins, db_query() is 29% faster than db_select()
e isto
db_query():
Total Incl. Wall Time (microsec): 796 microsecs
Total Incl. CPU (microsecs): 0 microsecs
Total Incl. MemUse (bytes): 123,352 bytes
Total Incl. PeakMemUse (bytes): 124,248 bytes
Number of Function Calls: 38
db_select()
Total Incl. Wall Time (microsec): 1,118 microsecs
Total Incl. CPU (microsecs): 0 microsecs
Total Incl. MemUse (bytes): 425,216 bytes
Total Incl. PeakMemUse (bytes): 436,392 bytes
Number of Function Calls: 88
Se você notar acima, o db_select faz mais chamadas de função e utiliza mais memória que o db_query.
- Veja aqui os motivos pelos quais usar o db_select
- Veja aqui os motivos pelos quais usar o EntityFieldQuery sobre db_select
- Veja aqui a comparação de desempenho de db_query e db_select
Eu acho que a escolha deve ser baseada exclusivamente em suas necessidades. O EntityFieldQuery pode ser mais lento, mas oferece muitas vantagens, como sintaxe simples, armazenamento em campo que pode ser conectado, acoplamento flexível e muito mais.