Во-первых, Kudo для фантастического c объяснения вашей проблемы. Это поможет вам быстро получить лучшие ответы. Вы также должны включить DDL, включая индексы, когда это возможно. Это станет ясно, когда я отвечу на ваш вопрос.
Я собираюсь решить пару вопросов с вашим запросом, которые не связаны с тем, как вы сейчас разбираете текст, и поговорим о том, как справиться с проблемой строк позже вечером.
Ответ. Часть 1. Не относится к разбору строк.
Вполне возможно, что поиск по строке является основной проблемой производительности. Давайте начнем с SELECT *
- вам абсолютно нужны все столбцы? В частности, вам абсолютно необходимы все столбцы, включенные в этот поиск ключей? Это самая важная вещь для сортировки. Позвольте мне объяснить.
Ваш запрос выполняет сканирование вашего некластерного индекса с именем outhex-index , а затем выполняет поиск по ключу для получения строк, не включенных в outhex-index. Поиск ключей снижает производительность, , особенно в отношении кластерного и некластеризованного индекса с 40 000 000 строк.
Если вам нужны эти столбцы, то вам следует рассмотреть добавив их в виде включенных столбцов в ваш индекс outhex-index. Я говорю, рассмотрим, потому что я не знаю, сколько столбцов, ни тип данных. Включение столбцов ускоряет запросы, устраняя дорогостоящий поиск ключей, но они замедляют изменение данных, иногда значительно в зависимости от количества / типа индексов. Если вам нужны столбцы, не включенные в outhex-index, и они являются большими столбцами (типы данных MAX / BLOB / LOB, XML, et c), тогда индекс покрытия НЕ является опцией. Если они вам не нужны, тогда вы рефакторируете свое заявление SELECT *
, чтобы включить только те столбцы, которые вам нужны.
Полнотекстовое индексирование здесь не вариант, если только вы не можете найти способ потерять этот вид. Сортировка имеет N log N сложность , что означает, что сортировка становится дороже, чем больше строк вы сортируете. По возможности следует избегать сортировки 40 миллионов строк. Этого будет трудно избежать с помощью полнотекстовой индексации по причинам, которые требуют больше времени для объяснения, чем у меня есть время. Добавление / изменение 40-миллионного индекса строки может быть дорогим и занимать много времени. Если вы делаете go этот маршрут, я предлагаю взять автономную копию этой таблицы, сколько времени потребуется для сборки. Вы также можете рассмотреть возможность создания отфильтрованного индекса, если это возможно, чтобы уменьшить область поиска.
Я также заметил, что оба запроса получают планы последовательного выполнения. Я не знаю, поможет ли параллельный план в первом запросе с поиском ключа, но я знаю, что он, вероятно, поможет со вторым, так как в этом есть какая-то разновидность. Планы параллельного выполнения действительно могут ускорить сортировку. Попробуйте проверить ваш запрос с помощью OPTION (QUERYTRACEON 8649) или make_parallel () Адама Мачани c.
Сегодня вечером я обновлю этот пост с некоторыми идеями, чтобы быстрее разобрать вашу строку. Одной вещью, которую вы могли бы рассмотреть в это время, является хитрый триггерный поиск строки Trigram Wildcard , который может быть вариантом.