Почему один запрос последовательно на 25 мс быстрее, чем другой в postgres? - PullRequest
1 голос
/ 06 мая 2010

Друг написал запрос со следующим условием:

    AND ( SELECT count(1) FROM users_alerts_status uas 
         WHERE uas.alert_id = context_alert.alert_id 
         AND   uas.user_id = 18309 
         AND   uas.status = 'read' ) = 0

Увидев это, я предложил изменить его на:

    AND NOT EXISTS ( SELECT 1 FROM users_alerts_status uas 
           WHERE uas.alert_id = context_alert.alert_id 
           AND   uas.user_id = 18309 
           AND   uas.status = 'read' )

Но при тестировании первая версия запроса постоянно на 20-30 мс быстрее (мы тестировали после перезапуска сервера). Концептуально, чего мне не хватает?

Ответы [ 2 ]

4 голосов
/ 06 мая 2010

Я думаю, что первый может замкнуть цепь; как только он видит все строки, которые соответствуют критериям, он может вернуть счетчик 1. Второй должен проверять каждую строку (и возвращает строку «1» для каждого результата), поэтому не получает скорость преимущество короткого замыкания.

Как говорится, выполнение EXPLAIN (или того, что поддерживает ваша база данных) может дать лучшее понимание, чем я думаю.

1 голос
/ 06 мая 2010

Концептуально, я бы сказал, что ваш вариант, по крайней мере, так же хорош, как и другой, по крайней мере, немного более элегантный. Я не уверен, должно ли это быть медленнее или быстрее - и соответствуют ли эти 25 мсек. Определенный ответ, как правило, приходит, глядя на вывод EXPLAIN.

Что это за версия Postgresql? PG 8.4 , как говорят, имеет некоторые оптимизации относительно НЕ СУЩЕСТВУЮЩИХ

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...