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

Вид: 12044|Ответ: 0

[Связь] Проблема использования индекса при обработке sqlserver типа '%keyword%'

[Скопировать ссылку]
Опубликовано 26.11.2014 15:52:19 | | | |

Утверждение 1: префикс процентного знака %-джокера заставит SQL-запросы остановить индекс и вместо этого использовать полное сканирование таблицы. Это утверждение популярно

Вывод неверен

На самом деле это утверждение не очень точно. Префикс wildcard % делает поиск индексов в SQL чрезвычайно эффективным, но в большинстве случаев он всё равно пойдёт в индекс (полный текст не требуется, просто постройте обычный индекс).

СОЗДАТЬ НЕКЛАСТЕРНЫЙ ИНДЕКС [Ix_index NAME] НА [dbo]. [wkf_ Название стола]
(
[db_title]  ASC
)

Казни в это время

ВЫБЕРИТЕ топ-10 [db_id],[db_Summary],[db_AddDate],[db_title] ИЗ [название библиотеки]. [DBO]. [wkf_database] где [db_title] как '%dba%' по 1 desc.

План запроса чётко отображается

Перед индексированием сравнения:


В качестве исключения — сложные запросы. Оптимизатор запросов может отказаться от индекса в пользу полного сканирования таблицы. Это касается не только LIKE '%keyword%', но и сложности запросов




Утверждение 2: Процентный процент префиксов джокера сделает SQL-запросы индексными, а не индексными

Это утверждение очень одностороннее, и 99% индекса снижает IO и повышает эффективность по сравнению с отсутствием индексации, но действие по подбору ключей после обнаружения индекса также частично требует производительности. Как показано на двух рисунках выше, если ключевые слова легко сопоставить, полный скан таблицы быстро находит данные, и индексное сканирование не экономит достаточно времени, чтобы компенсировать время, потраченное на действие сопоставления ключей (большинство онлайн-запросов не имеют такой проблемы).
Лечение:
1. Если вам это не важно, дополнительное расходование производительности не очень велико. И разные ключевые слова имеют разное потребление, но некоторые ключевые слова имеют эту проблему и могут быть проигнорированы
2. Лучший способ — построить индекс переопределения (также известный как индекс INCLUDE), если условия это позволяют. Предпосылка: a. Пространство памяти достаточно, b не влияет существенно на операции DML, и c не имеет больших полей в перезаписанном индексе

СОЗДАТЬ НЕКЛАСТЕРНЫЙ ИНДЕКС [Ix_index NAME] НА [dbo]. [wkf_ Название стола]
(
[db_title]  ASC
)
ВКЛЮЧИТЬ ( [db_id],[db_Summary],[db_AddDate])

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


Приведённое выше — то, что я сейчас могу представить для обработки SQLSERVER: ВЫБЕРИТЕ * ИЗ ИМЕНИ ТАБЛИЦЫ, НАПРИМЕР '%Keyword %'






Предыдущий:Репликация транзакций через SQL Server добавляет новые таблицы без повторной инициализации
Следующий:Практическое SQL-утверждение: оценка даты
Отказ:
Всё программное обеспечение, программные материалы или статьи, публикуемые Code Farmer Network, предназначены исключительно для учебных и исследовательских целей; Вышеуказанный контент не должен использоваться в коммерческих или незаконных целях, иначе пользователи несут все последствия. Информация на этом сайте взята из Интернета, и споры по авторским правам не имеют отношения к этому сайту. Вы должны полностью удалить вышеуказанный контент с компьютера в течение 24 часов после загрузки. Если вам нравится программа, пожалуйста, поддержите подлинное программное обеспечение, купите регистрацию и получите лучшие подлинные услуги. Если есть нарушение, пожалуйста, свяжитесь с нами по электронной почте.

Mail To:help@itsvse.com