Какой запрос NHibernate / SQL "Exists" более эффективен (и как узнать)? - PullRequest
0 голосов
/ 17 ноября 2011

Я профилировал SQL-запрос, сгенерированный NHibernate для следующих фрагментов ниже. Я думаю, что код № 1 будет более эффективным, однако сгенерированный SQL вызывает у меня сомнения.

1) bool any = Query.Where(user => user.Id == 1).Any(); создает:

select 
    *
from 
    users
where exists
        (select id
         from users
         where id = 1)
and rownum <= 1

2) bool any = Query.Where(user => user.Id == 1).Count() > 1; генерирует:

select 
    count(*)
from 
    users 
where 
    id = 1

Что является более эффективным? В будущем, как бы я это определил? Я использую Oracle.

1 Ответ

0 голосов
/ 17 ноября 2011

Если предположить, что ID является первичным ключом (или, по крайней мере, уникальным), второй запрос может быть несколько более эффективным, поскольку ему нужно только прочитать индекс в столбце ID таблицы USERS.Первый запрос должен будет выполнить ту же работу для чтения индекса, но затем должен будет извлечь соответствующие данные из таблицы.Если вы посмотрите на два плана запросов, то увидите, что первый запрос выполняет дополнительное чтение таблицы.

С другой стороны, если вы выполняли поиск по столбцу, для которого не было уникального индекса.так, второй запрос будет менее эффективным, потому что он потенциально должен прочитать несколько блоков из индекса или выполнить полное сканирование таблицы, чтобы получить счетчик, в то время как первый запрос может прекратить обработку, когда обнаружит первую подходящую строку.

...