2013-08-12 4 views
-1

У меня есть SQL-запрос, который занимает 4 секунды, чтобы возвращать результаты, однако при добавлении запроса ORDER BY запрос занимает приблизительно 40 секунд, чтобы вернуть результаты. Почему у ORDER BY такая драматическая разница во времени?Почему «ORDER BY» медленный запрос так много?

И если бы у меня не было возможности изменить способ хранения данных в базе данных, были бы у меня другие альтернативы, кроме использования предложения ORDER BY?

+2

Если вы не указали запрос как минимум (и, надеюсь, схему базы данных), то любые ответы - это просто общее руководство или удар в темноте. Помогите нам помочь вам;) –

+0

Сколько записей мы говорим? – Max

+0

Около 400 записей возвращаются в результатах – Simon

ответ

3

При заказе необходимо проанализировать все поля, содержащиеся в предложении order by для каждой строки из оригинального оператора select.

Например, если у вас есть таблица, содержащая 1 миллиона записей, и вы написали что-то вроде:

select top 100 * from tablea 

будет идти очень быстро, потому что, как только он возвращает 100 записей, он останавливает выполнение запроса и показывает результаты.

Теперь, если вы пишете:

select top 100 * from tablea order by tableaid 

Это должно выбрать все 1 миллиона записей из таблицы [которые соответствуют где положение], а затем заказать все 1 миллиона записей, а затем вернуться только первые 100 из них.

+0

«Заказ по обязательному анализу ВСЕХ данных» - нет, если есть индекс. –

+0

Правильно, так что он сначала возвращает ВСЕ результаты, а THEN заказывает их, так что именно здесь происходит замедление. – Simon

+0

@DStanley, я предполагаю, что я должен изменить его, чтобы «проанализировать все поля, содержащиеся в предложении order by для каждой строки». – ganders

2

Может быть много причин:

  1. Какого типа поля вы заказ на? Упорядочение по текстовым (или большим символам) полям может быть медленным, поскольку оно должно сортировать значения
  2. Вы используете предложение TOP n? Если это так, исходный запрос будет быстрым, потому что он должен смотреть только на n записей - но ORDER BY должен будет посмотреть ВСЕ записи, чтобы найти TOP n, если в этом поле (или в полях) нет указателя.
  3. Если в поле заказа нет индекса, он будет медленнее заказать его.
  4. ORDER BY может изменить общий план запроса на что-то гораздо менее эффективное.

В общем случае, если вы часто заказываете по тем же полям, добавьте индексы, соответствующие этим заказам.

Смежные вопросы