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

Откуда: Казань
Сообщений: 123
Объясните, пожалуйста, непонятно, но интересно... жуть, сервер 2017

CREATE TABLE dbo.plog
(
	n decimal(15,0) NOT NULL,
...
	i decimal(15,0) NOT NULL identity(1,1),	
CONSTRAINT x_plog PRIMARY KEY NONCLUSTERED (n) 
) WITH (MEMORY_OPTIMIZED = ON, DURABILITY = SCHEMA_ONLY)

(1) select top 1 * from plog (nolock) where n<2265380000 order by n
(2) select top 1 * from plog (nolock) where n>2265380000 order by n desc 
(3) select top 1 * from plog (nolock) where n<2265380000 order by n desc
(4) select top 1 * from plog (nolock) where n>2265380000 order by n

Есть ключ-индекс, и он используется при получении top 1, но только если выборка в том же порядке сортировки - запросы 1 и 4
В запросе 2 видим Top N Sort, а в 3 - вообще полную сортировку

Это абсолютно непонятно)
Вроде как везде в начале плана есть Поиск в индексе/Index Seek (кроме 3, ну там вообще всё как будто специально в назидание тем, кто пишет очень плохие запросы... так лучше забыть от 3 от греха)

Ну ок, поперед всего - нашли запись с нужным значением ключа
Теперь надо взять следующее или предыдущее

Но ведь сортировка то по возрастанию, вроде должно быть проще взять следующее, чем предыдущее
Но нет, (1) и (4) влет проходят
Хотя (1) надо взять предыдущее по ключу, а (4) вообще конец всей географии
Тогда как (2) нужно взять просто следующее по ключу, а там запускается TopN сортировка

Буду рад тыканьям в доку и прочие материалы со ссылками и т.п.
9 апр 19, 16:15    [21857362]     Ответить | Цитировать Сообщить модератору
 Re: Влияние сортировки на select top 1  [new]
invm
Member

Откуда: Москва
Сообщений: 8661
dklim.kzn
Объясните, пожалуйста, непонятно, но интересно
Потому что, в отличие от традиционных, range-индексы in-memory таблиц однонаправленные.
9 апр 19, 17:45    [21857539]     Ответить | Цитировать Сообщить модератору
 Re: Влияние сортировки на select top 1  [new]
dklim.kzn
Member

Откуда: Казань
Сообщений: 123
invm,

да это просто прекрасно
куда направленные то? я и полагаю, что вперед

значит, взять следующее - легко, а предыдущее, как в (1) - сложно

а мы тут видим категорически противоположную картину)))
9 апр 19, 18:45    [21857645]     Ответить | Цитировать Сообщить модератору
 Re: Влияние сортировки на select top 1  [new]
dklim.kzn
Member

Откуда: Казань
Сообщений: 123
ну я полагаю, что сначала по индексу ищем n=2265380000
а потом берем топ 1

но похоже как-то иначе всё)))
9 апр 19, 18:46    [21857647]     Ответить | Цитировать Сообщить модератору
 Re: Влияние сортировки на select top 1  [new]
msLex
Member

Откуда:
Сообщений: 6245
dklim.kzn
а предыдущее, как в (1) - сложно



Зачем при select top 1 * from plog (nolock) where n<2265380000 order by n брать предыдущее?

нужно взять вообще первую запись в индексе, и если n окажется <2265380000 - вывести
9 апр 19, 18:49    [21857649]     Ответить | Цитировать Сообщить модератору
 Re: Влияние сортировки на select top 1  [new]
dklim.kzn
Member

Откуда: Казань
Сообщений: 123
похоже меня уже глючит

select top 1 * from plog with (nolock ) where n<2265380000 order by n
|--Top(TOP EXPRESSION:((1)))
|--Index Seek(OBJECT:([post].[dbo].[plog].[x_plog]), SEEK:([post].[dbo].[plog].[n] < (2265380000.)) ORDERED FORWARD)

он берет весь диапазон индекса по дереву и бродит там. делая TopN
но это же был бы scan, а не seek

явно же что ищет))
9 апр 19, 18:54    [21857651]     Ответить | Цитировать Сообщить модератору
 Re: Влияние сортировки на select top 1  [new]
dklim.kzn
Member

Откуда: Казань
Сообщений: 123
msLex

нужно взять вообще первую запись в индексе, и если n окажется <2265380000 - вывести


ну уж
а order by ?
9 апр 19, 18:55    [21857652]     Ответить | Цитировать Сообщить модератору
 Re: Влияние сортировки на select top 1  [new]
Посетитель
Member

Откуда:
Сообщений: 1277
dklim.kzn,

вот именно
9 апр 19, 18:56    [21857653]     Ответить | Цитировать Сообщить модератору
 Re: Влияние сортировки на select top 1  [new]
msLex
Member

Откуда:
Сообщений: 6245
dklim.kzn
ну уж
а order by ?



top 1 order by n - это запись с минимальными n, т.е. первая в индексе
в where никаких ограничений на n "снизу" нет.
9 апр 19, 18:57    [21857654]     Ответить | Цитировать Сообщить модератору
 Re: Влияние сортировки на select top 1  [new]
invm
Member

Откуда: Москва
Сообщений: 8661
dklim.kzn
значит, взять следующее - легко, а предыдущее, как в (1) - сложно
В (1) не предыдущее, а первое в порядке n, меньшее 2265380000. Разницу ощущаете?

И вообще, Index Scan в (1) от Index Seek в (4) отличаете?
9 апр 19, 18:58    [21857658]     Ответить | Цитировать Сообщить модератору
 Re: Влияние сортировки на select top 1  [new]
msLex
Member

Откуда:
Сообщений: 6245
dklim.kzn
он берет весь диапазон индекса по дереву и бродит там. делая TopN
но это же был бы scan, а не seek


Это не seek, это range scan от начала и до 2265380000, но Top(TOP EXPRESSION:((1))) прерывает его после первой же выданной записи
9 апр 19, 19:01    [21857662]     Ответить | Цитировать Сообщить модератору
 Re: Влияние сортировки на select top 1  [new]
dklim.kzn
Member

Откуда: Казань
Сообщений: 123
msLex

top 1 order by n - это запись с минимальными n, т.е. первая в индексе
в where никаких ограничений на n "снизу" нет.


спасибо
вот я бы влетел то... )))

но почему это топ то))))
по дереву если только

вот не попадалось на глаза раньше это прекрасное)))
9 апр 19, 19:14    [21857674]     Ответить | Цитировать Сообщить модератору
 Re: Влияние сортировки на select top 1  [new]
msLex
Member

Откуда:
Сообщений: 6245
dklim.kzn
msLex
top 1 order by n - это запись с минимальными n, т.е. первая в индексе
в where никаких ограничений на n "снизу" нет.


спасибо
вот я бы влетел то... )))

но почему это топ то))))
по дереву если только

вот не попадалось на глаза раньше это прекрасное)))


вы хотели спросить, почему это seek?

я уже ответил выше 21857662
9 апр 19, 19:39    [21857698]     Ответить | Цитировать Сообщить модератору
 Re: Влияние сортировки на select top 1  [new]
dklim.kzn
Member

Откуда: Казань
Сообщений: 123
msLex,

нет-нет, я про топ

топ должен быть там, куда сортировка
а оказалось наоборот)))

ну бывает на старуху проруха))
раньше только в выдаче использовал, да и давно не брал я в руки шашки

просто я знаю, чем такие простые вещи чреваты - кучей потерянного времени и долбежа об стенку)
так что ещё раз большое спасибо
9 апр 19, 21:08    [21857750]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить