powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Clustered Index Scan (Top Order) из-за формата даты в условии
19 сообщений из 19, страница 1 из 1
Clustered Index Scan (Top Order) из-за формата даты в условии
    #39690118
nvv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
nvv
Гость
Все доброго дня.
Поставила меня в ступор следующая ситуация.

Имеем таблицу с кластерным уникальным индексам по полям Period+ID
Period - datetime2, ID - binary(16). Колонок > 2 (с десяток).
Таблица и кластерный индекс одинаково секционированы (одной функцией, по кварталам) по полю Period.
в таблице под 40 млн записей.

Имеем запрос вида
Код: sql
1.
2.
3.
SELECT TOP 45 * FROM [dbo].[Table] t
  WHERE t._Period >= {ts '2018-08-01 00:00:00'}
  order by t._Period, t._ID



На совместимостях 110, 120 - работает прекрасно (CIseek).
При переключении на совместимость 130 - CIscan.
"Хм", подумал я... и пошел забавляться с флагами трассировки, статистикой, перестроением индекса и т.д.
Самое странное, что это даже не новый оптимизатор, т.к. на 120 - все ок (хотя как знать - новый активно развивают).

Оказывается, скуль (130) невзлюбил формат даты!
Любые другие варианты работают отлично
WHERE T._Period >= convert(datetime2, {ts '2018-08-01 00:00:00'})
WHERE T._Period >= '2018-08-01'
и т.п. - всегда CIseek

Может кто-нибудь объяснить В ЧЕМ ФИШКА?
Что случилось, если на более ранних совместимостях все прекрасно работало? Какие-то изменения может были правилах применения форматов дат?

PS: СУБД - mssql 2016 (enterprise) sp1 cu8
...
Рейтинг: 0 / 0
Clustered Index Scan (Top Order) из-за формата даты в условии
    #39690122
Гавриленко Сергей Алексеевич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кто не делает явного преобразования литералов/констант в нужный тип, тот страдает.
Вы же смотрели, что там в Predicate написано, когда CIscan?
...
Рейтинг: 0 / 0
Clustered Index Scan (Top Order) из-за формата даты в условии
    #39690163
nvv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
nvv
Гость
Гавриленко Сергей Алексеевич,
Содержимым запроса, текстом, параметрами управляет приложение. Я тут никак не повлияю.
Какой предикат в скане? Их там нет.
Поясните свои слова.
Преобразования над самим столбцомп (периодом) ведь не выполняются.
Попробовал воспроизвести на других данных без секционирования- пока не получается получить скан.
...
Рейтинг: 0 / 0
Clustered Index Scan (Top Order) из-за формата даты в условии
    #39690181
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nvvКакой предикат в скане? Их там нет.Их там есть.
Свойства итератора смотрите. Должны увидеть примерно это - https://littlekendra.com/2016/03/10/the-case-of-datetime2-and-partition-elimination/
...
Рейтинг: 0 / 0
Clustered Index Scan (Top Order) из-за формата даты в условии
    #39690234
nvv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
nvv
Гость
invm, виноват... ИхТамЕсть
......Period >= '2018-08-06 00:00:00.000'
При том что при "поиске по индексу" поиск по предикату выглядит так:
......Period >= Скалярный оператор('2018-08-06 00:00:00.0000000')

Значит ли это, что в первом случае СУБД не выполнила неявное преобразование значения и выполняется сравнение разных типов?

То, что нужно самому беспокоится о правильном преобразовании и что отсутствие такого является моветоном - я уже понял.

Какова вероятная причина такого поведения СУБД? Ошибка движка? До совместимости 130 этого косяка не было.
...
Рейтинг: 0 / 0
Clustered Index Scan (Top Order) из-за формата даты в условии
    #39690237
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nvv,

в 130 поменялось преобpазование
сравните для 120 и 130
Код: sql
1.
2.
3.
4.
DECLARE @datetime datetime = '2018-04-29 10:30:30.553';
DECLARE @datetime2 datetime2 = @datetime;

SELECT @datetime2 AS '@datetime2', @datetime AS '@datetime'



как это влияет на предикат индекса я не знаю. Но правильный ответ как всегда: преобразовуйте явно.
Ну и есть масса ссылок на баг, но коннект убит и искать лень :)
...
Рейтинг: 0 / 0
Clustered Index Scan (Top Order) из-за формата даты в условии
    #39690264
nvv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
nvv
Гость
TaPaK, посмотрел, увидел.
Что-то в таком духе я и ожидал ((

Последний вопрос: MS это никак не исправляла? Так оно все и висит до последних версий?
...
Рейтинг: 0 / 0
Clustered Index Scan (Top Order) из-за формата даты в условии
    #39690266
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nvvTaPaK, посмотрел, увидел.
Что-то в таком духе я и ожидал ((

Последний вопрос: MS это никак не исправляла? Так оно все и висит до последних версий?
что он должен исправить?
...
Рейтинг: 0 / 0
Clustered Index Scan (Top Order) из-за формата даты в условии
    #39690267
Гавриленко Сергей Алексеевич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nvvПоследний вопрос: MS это никак не исправляла? Так оно все и висит до последних версий?Зачем исправлять то, что было сделано специально? Сидите на 120 CL, для того CL и придумали.
...
Рейтинг: 0 / 0
Clustered Index Scan (Top Order) из-за формата даты в условии
    #39690273
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nvv,
авторСодержимым запроса, текстом, параметрами управляет приложение. Я тут никак не повлияю.

влияйте, если в базе datetime2 то и приложение должно отдавать DateTime2, всё остальное это ошибка
...
Рейтинг: 0 / 0
Clustered Index Scan (Top Order) из-за формата даты в условии
    #39690281
nvv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
nvv
Гость
авторЗачем исправлять то, что было сделано специально? Сидите на 120 CL, для того CL и придумали.
Т.е. в 130 они специально отказались от преобразования? Это где-то документировано?
...
Рейтинг: 0 / 0
Clustered Index Scan (Top Order) из-за формата даты в условии
    #39690282
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гавриленко Сергей АлексеевичnvvПоследний вопрос: MS это никак не исправляла? Так оно все и висит до последних версий?Зачем исправлять то, что было сделано специально? Сидите на 120 CL, для того CL и придумали.А не знаете, зачем это было сделано?

Семантически ведь запрос не меняется, при изменении типа константы - "получить записи с значением поля больше заданного".

Тем более причина должна быть веской, потому что последствия - потеря совместимости с предыдущими версиями - достаточно тяжёлые.
...
Рейтинг: 0 / 0
Clustered Index Scan (Top Order) из-за формата даты в условии
    #39690284
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TaPaKnvv,
авторСодержимым запроса, текстом, параметрами управляет приложение. Я тут никак не повлияю.

влияйте, если в базе datetime2 то и приложение должно отдавать DateTime2, всё остальное это ошибкаПриложение то чужое, поменять они его не могут.
Понятно, что приложение совместимо с определённой версией сиквела, и с новой работать не будет, если совместимость версий производитель не поддерживает.
Так что решение перевести приложение на другую версию, конечно, несколько поспешное. Придётся откатывать назад.
...
Рейтинг: 0 / 0
Clustered Index Scan (Top Order) из-за формата даты в условии
    #39690286
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexeyvgTaPaKnvv,
пропущено...

влияйте, если в базе datetime2 то и приложение должно отдавать DateTime2, всё остальное это ошибкаПриложение то чужое, поменять они его не могут.
Понятно, что приложение совместимо с определённой версией сиквела, и с новой работать не будет, если совместимость версий производитель не поддерживает.
Так что решение перевести приложение на другую версию, конечно, несколько поспешное. Придётся откатывать назад.
ну я так подозреваю что вводить тип datetime2 было не решение сопровождателей, а значить это ошибка не приведение в соотвествие клиента и сервера.

авторТ.е. в 130 они специально отказались от преобразования? Это где-то документировано?
где сказано что нет преобразования?
...
Рейтинг: 0 / 0
Clustered Index Scan (Top Order) из-за формата даты в условии
    #39690288
nvv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
nvv
Гость
alexeyvg, приложение совместимо с 2016.
Но тот функционал, на котором это проявилось - это интеграция с внешними базами, т.е. не часто используется и сделан по принципу "чтобы всем было хорошо". Поэтому тут даже не угадаешь и особо не протестируешь.
Конечно же установил 120. С этим нет проблем.

Единственное, что интересовало - причина.
...
Рейтинг: 0 / 0
Clustered Index Scan (Top Order) из-за формата даты в условии
    #39690301
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FYI
http://www.dbdelta.com/sql-server-2016-and-azure-sql-database-v12-breaking-change/

ну и вывод тот же
авторThese datetime behavior changes have the benefit of improved accuracy and performance of datetime conversion/comparison. Affected applications can use a pre-SQL Server 2016 database compatibility level until they can be remediated.
...
Рейтинг: 0 / 0
Clustered Index Scan (Top Order) из-за формата даты в условии
    #39690440
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nvv,

обычная ошибка новобранцев... Несовпадение типа данных аргумента функции секционирования и сравниваемого значения приводит к просмотру всех секций.

Оно и в нативном 110 так работает.
...
Рейтинг: 0 / 0
Clustered Index Scan (Top Order) из-за формата даты в условии
    #39690642
nvv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
nvv
Гость
Владислав Колосов, ну передать вендору ПО, что они новобранцы, я не смогу. До царя далеко. Но в поддержку обращусь )

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

Прикрепил планы. 1-3 на секционированной таблице, 4-6 на не секционированной.
...
Рейтинг: 0 / 0
Clustered Index Scan (Top Order) из-за формата даты в условии
    #39690650
nvv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
nvv
Гость
Оно и в нативном 110 так работает.
Нет. Написал же еще в шапке, что до <130 было все отлично. Прикрепил подтверждение (как и в предыдущем посте: 4-6 без секций)
...
Рейтинг: 0 / 0
19 сообщений из 19, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Clustered Index Scan (Top Order) из-за формата даты в условии
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]