Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Оптимизация select top 100  [new]
Goapsy
Member

Откуда: г. Чебоксары
Сообщений: 47
Microsoft SQL Server 2008 R2 (SP1) - 10.50.2500.0 (X64) Jun 17 2011 00:54:03 Copyright (c) Microsoft Corporation Developer Edition (64-bit) on Windows NT 6.1 <X64> (Build 7600: )


dbcc dropcleanbuffers
go
select * from Product where id <= 94528
go
Возвращает 1000 строк
Время выполнения 1 сек
|--Clustered Index Seek(OBJECT:([dbo].[Product].[PK_Product]), SEEK:([dbo].[Product].[Id] <= [@1]) ORDERED FORWARD)


dbcc dropcleanbuffers
go
select top 1000 * from Product
go
Возвращает 1000 строк
Время выполнения 14 сек
|--Top(TOP EXPRESSION:((1000)))
|--Clustered Index Scan(OBJECT:([dbo].[Product].[PK_Product]))


Почему второй запрос выполняется так медленно? И как сделать чтобы второй запрос выполнялся также быстро как первый? Куда читать?

Спасибо!
24 янв 14, 08:55    [15460703]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация select top 100  [new]
dwqdwd
Guest
Goapsy,

ожидания смотрите.

sys.dm_os_wats_stats
sys.dm_exec_requests (suspended)
sys.dm_exec_cached_plans
24 янв 14, 09:20    [15460803]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация select top 100  [new]
baracs
Member

Откуда: Москва
Сообщений: 7217
Goapsy
Почему второй запрос выполняется так медленно?
В первом случае - Index Seek, во втором - Index Scan.
Goapsy
И как сделать чтобы второй запрос выполнялся также быстро как первый?
Запросы разные. С чего бы им выполняться одинаково быстро?
Можно попробовать хинт OPTION (FAST 1000)... См. Подсказки в запросах (Transact-SQL).
24 янв 14, 09:37    [15460877]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация select top 100  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31960
baracs
Goapsy
И как сделать чтобы второй запрос выполнялся также быстро как первый?
Запросы разные. С чего бы им выполняться одинаково быстро?
Второй должен выполнятся быстрее, это же чтение произвольных страниц, пока не будет прочитано 100 записей.
А первый запрос - это поиск в таблице записей, отвечающих условиям, пока не будет найдено 100 записей.
Очевидно второе быстрее.
Какой то глюк.
24 янв 14, 10:51    [15461282]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация select top 100  [new]
Glory
Member

Откуда:
Сообщений: 104751
alexeyvg
Очевидно второе быстрее.
Какой то глюк.

Фрагментация ?
24 янв 14, 10:53    [15461294]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация select top 100  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31960
Glory
alexeyvg
Очевидно второе быстрее.
Какой то глюк.

Фрагментация ?
А, ну да, если логически более близкие страницы будут физически далеко друг от друга...

Допустим, эти 100 записей расположены на 100 страницах.
В первом запросе нашли страницу id = 94528, прочитали её и 100 соседних, одной дисковой операцией.
Во втором читаем 100 страниц в начале таблицы, но они физически разнесены, получаем 100 дисковых операций...
24 янв 14, 11:37    [15461568]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация select top 100  [new]
Goapsy
Member

Откуда: г. Чебоксары
Сообщений: 47
alexeyvg
Glory
пропущено...

Фрагментация ?
А, ну да, если логически более близкие страницы будут физически далеко друг от друга...

Допустим, эти 100 записей расположены на 100 страницах.
В первом запросе нашли страницу id = 94528, прочитали её и 100 соседних, одной дисковой операцией.
Во втором читаем 100 страниц в начале таблицы, но они физически разнесены, получаем 100 дисковых операций...



Возвращаемый набор данных полностью одинаковый для обоих запросов
24 янв 14, 11:51    [15461702]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация select top 100  [new]
invm
Member

Откуда: Москва
Сообщений: 9836
Goapsy,

Посмотрите статистику io. Скорее всего для второго запроса будет существенно больше упреждающих чтений.
24 янв 14, 12:03    [15461835]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация select top 100  [new]
SomewhereSomehow
Member

Откуда: Moscow
Сообщений: 2480
Блог
Goapsy,

Во втором запросе точно нет никаких предикатов, условий where и т.д?
Top без order by? Сканирование упорядоченное? Что с фрагментацией индекса?
Почему в названии темы top 100, а в сообщении top 1000, где правда?

А выложили бы действительные планы как файлы .sqlplan, вопросов бы не было.
24 янв 14, 12:04    [15461837]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация select top 100  [new]
Goapsy
Member

Откуда: г. Чебоксары
Сообщений: 47
select * from Product where id <= 94528
reads=535
duration=1417

select top 1000 * from Product
reads=785
duration=16800


Щас устанавливаю mssql2012.
Попробую offset и fetch
24 янв 14, 12:09    [15461883]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация select top 100  [new]
invm
Member

Откуда: Москва
Сообщений: 9836
Goapsy
select * from Product where id <= 94528
reads=535
duration=1417

select top 1000 * from Product
reads=785
duration=16800
Упреждающие чтения нужно смотреть
24 янв 14, 12:33    [15462058]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация select top 100  [new]
Goapsy
Member

Откуда: г. Чебоксары
Сообщений: 47
select * from Product where id <= 94528
Scan count 1, logical reads 535, physical reads 11, read-ahead reads 1778, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.

select top 1000 * from Product
Scan count 1, logical reads 705, physical reads 176, read-ahead reads 10712, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
24 янв 14, 12:59    [15462232]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация select top 100  [new]
invm
Member

Откуда: Москва
Сообщений: 9836
Goapsy
select * from Product where id <= 94528
Scan count 1, logical reads 535, physical reads 11, read-ahead reads 1778, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.

select top 1000 * from Product
Scan count 1, logical reads 705, physical reads 176, read-ahead reads 10712, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Вот вам и разница.
24 янв 14, 13:11    [15462341]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация select top 100  [new]
Goapsy
Member

Откуда: г. Чебоксары
Сообщений: 47
SomewhereSomehow
Во втором запросе точно нет никаких предикатов, условий where и т.д?

точно нет предикатов
SomewhereSomehow
Top без order by?

Без order by
SomewhereSomehow
Сканирование упорядоченное?

не упорядоченное
SomewhereSomehow
Что с фрагментацией индекса?

database_id object_id   index_id    partition_number index_type_desc                                              alloc_unit_type_desc                                         index_depth index_level avg_fragmentation_in_percent fragment_count       avg_fragment_size_in_pages page_count           avg_page_space_used_in_percent record_count         ghost_record_count   version_ghost_record_count min_record_size_in_bytes max_record_size_in_bytes avg_record_size_in_bytes forwarded_record_count compressed_page_count
----------- ----------- ----------- ---------------- ------------------------------------------------------------ ------------------------------------------------------------ ----------- ----------- ---------------------------- -------------------- -------------------------- -------------------- ------------------------------ -------------------- -------------------- -------------------------- ------------------------ ------------------------ ------------------------ ---------------------- ---------------------
26 974626515 1 1 CLUSTERED INDEX IN_ROW_DATA 4 0 84,3733745485889 57584 1,16853639899972 67289 NULL NULL NULL NULL NULL NULL NULL NULL NULL
26 974626515 2 1 NONCLUSTERED INDEX IN_ROW_DATA 4 0 93,0549146285187 8125 1,06683076923077 8668 NULL NULL NULL NULL NULL NULL NULL NULL NULL
26 974626515 3 1 NONCLUSTERED INDEX IN_ROW_DATA 3 0 94,414535666218 4244 1,05042412818096 4458 NULL NULL NULL NULL NULL NULL NULL NULL NULL
26 974626515 4 1 NONCLUSTERED INDEX IN_ROW_DATA 3 0 59,3494790199944 4301 1,65124389676819 7102 NULL NULL NULL NULL NULL NULL NULL NULL NULL
26 974626515 5 1 NONCLUSTERED INDEX IN_ROW_DATA 3 0 95,2574525745257 3553 1,03855896425556 3690 NULL NULL NULL NULL NULL NULL NULL NULL NULL
26 974626515 6 1 NONCLUSTERED INDEX IN_ROW_DATA 5 0 97,2929936305733 19098 1,01937375641428 19468 NULL NULL NULL NULL NULL NULL NULL NULL NULL
26 974626515 17 1 NONCLUSTERED INDEX IN_ROW_DATA 3 0 98,0797101449275 2724 1,01321585903084 2760 NULL NULL NULL NULL NULL NULL NULL NULL NULL

(7 row(s) affected)

SomewhereSomehow
Почему в названии темы top 100, а в сообщении top 1000, где правда?

правда 1000
24 янв 14, 13:15    [15462387]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация select top 100  [new]
Goapsy
Member

Откуда: г. Чебоксары
Сообщений: 47
invm
Вот вам и разница.


а как сделать чтобы оба запроса работали одинаково быстро?
дефрагментировать индексы?
24 янв 14, 13:29    [15462523]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация select top 100  [new]
invm
Member

Откуда: Москва
Сообщений: 9836
Goapsy
а как сделать чтобы оба запроса работали одинаково быстро?
А зачем вы буферный пул очищаете? Не очищайте и будет примерно одинаково.
24 янв 14, 13:33    [15462554]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация select top 100  [new]
Goapsy
Member

Откуда: г. Чебоксары
Сообщений: 47
invm
А зачем вы буферный пул очищаете? Не очищайте и будет примерно одинаково.


Очищаю для эмитации реального рабочего сервера.
На рабочем сервере круглосуточно крутятся куча других запросов и буферный пул как правило постоянно выгружается чтобы обслужить эти другие запросы.
24 янв 14, 13:39    [15462615]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация select top 100  [new]
SomewhereSomehow
Member

Откуда: Moscow
Сообщений: 2480
Блог
Goapsy,

А вот такой запрос сколько будет выполняться?
select top 1000 * from Product with(index(0))
24 янв 14, 13:55    [15462754]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация select top 100  [new]
invm
Member

Откуда: Москва
Сообщений: 9836
Goapsy,

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

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

Почему бы не добавить памяти?
24 янв 14, 14:03    [15462821]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация select top 100  [new]
invm
Member

Откуда: Москва
Сообщений: 9836
А вообще, строго говоря, запросы могут возвращать разные значения.
24 янв 14, 14:07    [15462852]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация select top 100  [new]
Goapsy
Member

Откуда: г. Чебоксары
Сообщений: 47
SomewhereSomehow
Goapsy,

А вот такой запрос сколько будет выполняться?
select top 1000 * from Product with(index(0))


16 секунд
24 янв 14, 16:00    [15463670]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация select top 100  [new]
Goapsy
Member

Откуда: г. Чебоксары
Сообщений: 47
invm
Goapsy,

Почему бы не добавить памяти?
24 янв 14, 16:01    [15463683]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация select top 100  [new]
Goapsy
Member

Откуда: г. Чебоксары
Сообщений: 47
invm
Почему бы не добавить памяти?


И так уже до 24Gb ОП увеличили.
Чтобы ещё увеличить вроде надо windows server 2012 и sql Server 2012 устанавливать (так сказали админы). На сколько это правда не знаю.
24 янв 14, 16:05    [15463713]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация select top 100  [new]
Goapsy
Member

Откуда: г. Чебоксары
Сообщений: 47
И на SQL Server 2012 работает медленно 12 сек

dbcc dropcleanbuffers
go
select * 
from Product
order by Id
OFFSET 0 ROWS
FETCH NEXT 1000 ROWS ONLY;
go
24 янв 14, 16:28    [15463934]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация select top 100  [new]
Glory
Member

Откуда:
Сообщений: 104751
Goapsy
SomewhereSomehow
Goapsy,

А вот такой запрос сколько будет выполняться?
select top 1000 * from Product with(index(0))



16 секунд

А такой select top 1000 * from Product with(index(17)) ?
24 янв 14, 16:37    [15464004]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить