Что делает SQL Server между возвращением моей первой записи и возвращением моей последней записи? - PullRequest
3 голосов
/ 28 января 2010

Скажем, у меня есть запрос, который возвращает 10000 записей. Когда вернется первая запись, что я могу предположить о состоянии моего запроса?

  1. Закончил ли он и только возвращает записи с сервера в мой экземпляр SSMS?
  2. Сам запрос все еще выполняется на сервере?
  3. Что заставляет медленно возвращать 10000 записей для одного запроса и почти мгновенно для другого?

Ответы [ 3 ]

1 голос
/ 28 января 2010

Возможно некоторое сочетание прогрессивной обработки на стороне сервера, сетевой передачи данных и визуализации клиентом.

Если один запрос возвращает 10000 строк быстро, а другой - медленно, - и ониимеют одинаковый размер строки, типы данных и т. д. и оба предназначены для результатов в сетке или для результатов в тексте - мы мало что можем сделать, чтобы проанализировать различия, если вы не покажете нам планы выполнения и / или статистику клиента для каждого из них.,Это параметры, которые вы можете установить в SSMS при выполнении запроса.

Кроме того, при переключении между результатами в сетку и результатами в текст вы можете заметить немного отличающиеся времена выполнения.Это связано с тем, что в одном случае Management Studio нужно больше работать, чтобы выровнять столбцы и т. Д.

0 голосов
/ 28 января 2010

Ответ на каждый из ваших индивидуальных вопросов «зависит».

Например, рассмотрите, включаете ли вы предложение order by, и нет индекса для столбцов, по которым вы упорядочиваете. В этом случае сервер должен найти все записи, которые удовлетворяют вашему запросу, а затем отсортировать их, прежде чем он сможет вернуть первую запись. Это вызывает долгую паузу, прежде чем вы получите свою первую запись, но вы (как правило) должны получить их довольно быстро, как только вы начнете получать.

Без условия order by сервер обычно отправляет каждую запись как найденную, поэтому первая запись часто появляется раньше, но вы можете увидеть длинную паузу между одной записью и следующей.

Что касается просто «почему один запрос быстрее другого», многое зависит от того, какие индексы доступны и могут ли они использоваться для конкретного запроса. Например, что-то вроде some_column like '%something' почти всегда будет довольно медленным. Ведущий «%» означает, что он не сможет использовать индекс, даже если у some_column он есть. Поиск something% вместо %something% может легко быть в 100 или 1000 раз быстрее. Если вам действительно нужно первое, вы действительно хотите вместо этого использовать полнотекстовый поиск (создайте полнотекстовый индекс и используйте contains() вместо like.

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

0 голосов
/ 28 января 2010

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

Если какой-либо запрос содержит операцию, основанную на множестве, ему требуются все записи, прежде чем он сможет вывести результаты (т. Е. Предложение по выражению в пределах вашего оператора.) Но если у вас нет итераторов, основанных на множестве, вы можете ожидать, что строки будут потоковыми вам, когда они станут доступны.

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