Влияет ли неявное преобразование на силу индекса сканирования вместо поиска? - PullRequest
0 голосов
/ 27 февраля 2019

Я присоединяюсь к столу A против таблиц B и C.Все три таблицы имеют одинаковые столбцы и индексы, а B и C имеют примерно одинаковое количество строк.Но A и B имеют индексы для столбцов nvarchar, в то время как C имеет индексы для столбцов varchar.

Тестируется отдельно, объединение в B происходит в 30-60 раз быстрее, чем присоединение вC.(4 секунды против 2-4 минут.) Глядя на план выполнения, B использует поиск по индексу, а C использует сканирование по индексу.В деталях для объединения в C упоминается неявное преобразование столбцов varchar, в то время как в объединении в B такое преобразование не упоминается. Вот почему он использует сканирование вместо поиска, и, возможно, поэтому он так медленен? (Другая потенциальная проблема: сканирование индекса на C имеет приблизительное число выполнений 1, нофактическое количество выполнений составляет около 8500.)

C - это статические хронологические данные, поэтому я могу изменить столбцы и перестроить индексы, если это поможет.

1 Ответ

0 голосов
/ 27 февраля 2019

Да, неявные преобразования могут привести к сканированию индекса вместо поиска.Данные преобразуются в тип данных с более высоким приоритетом типа данных .Как вы видели в этом случае, VARCHAR столбец таблицы c преобразуется в значение NVARCHAR.Неявное преобразование защищает от потери данных во время преобразования, т. Е. Столбцы NVARCHAR могут содержать значительно больше различных символов, чем VARCHAR, поэтому неявное преобразование VARCHAR из таблицы C гарантирует, что все значения из таблицы C будут сохранены.Подробности конкретных сценариев неявного преобразования дополнительно изложены здесь .Если у вас есть такая возможность, и это не будет иметь негативных последствий в других местах, я бы предложил сделать этот столбец в таблице C * NVARCHAR тип данных.

...