COUNT (*) узкое место весь SQL SELECT - PullRequest
1 голос
/ 13 апреля 2011

У меня довольно сложные SELECT с 7 inner joins и как минимум 13 переменными WHERE условиями.

Я создал хранимую процедуру, которая управляет этим выбором и условиями поиска. При каждом поиске мне нужно получить общее количество записей для выбранных условий, поэтому я продублировал SELECT и изменил его на SELECT COUNT (*) с теми же соединениями и условиями.

Без select COUNT(*) в хранимой процедуре выполняется поиск в 260 000 записей в 5 мс .

С select COUNT(*) в хранимой процедуре он ищет 260 000 записей в 122 мс

Есть ли способ ускорить этот процесс? Мне нужно получить это общее количество, вопрос в том, есть ли возможность сделать это быстрее.

Ответы [ 2 ]

1 голос
/ 13 апреля 2011

Причина, по которой запрос без COUNT выполняется быстрее, возможно, состоит в том, что базе данных не нужно фактически находить все результаты, чтобы вернуть первые 20.

Я не думаю, что есть хорошее общее решение проблемы ... но, возможно, вы можете ограничить COUNT также некоторым большим пределом ... скажем, 1001? Если вы когда-нибудь получите 1001, то ваш пользовательский интерфейс может сказать «Более 1000 результатов ...» и позволить пользователю дополнительно ограничить запрос?

0 голосов
/ 13 апреля 2011

Я не знаю, почему подсчет будет медленным в вашем запросе, но для быстрого исправления, возможно, лучше вместо этого подсчитывать возвращаемые строки в вашей программе. Если вы возвращаете результат в массив или какой-либо список, вы можете использовать «.Count ()» (если это был .NET, то есть ..)

Edit: Убедитесь, что все соединенные таблицы используют первичные ключи и индексированные столбцы для вашего запроса.

...