Рейтинг:
0
Richard Deeming
Здесь есть пара проблем.
Во-первых, индекс находится на Name
колонка. Он может быть использован для удовлетворения запросов на Name
столбец, но будет бесполезен для запросов на Transaction
колонка.
Представьте себе адресную книгу, которая сортируется по фамилии. Вы создали вторичный индекс, основанный на первом имени, и включили город в этот индекс. Теперь вы хотите найти все записи в определенном городе. Вторичный индекс не поможет, так как вам все равно придется пройти через каждую запись, чтобы найти соответствующие.
Другая проблема заключается в том, что вы используете запрос "содержит" - WHERE column LIKE '% ... %'
Нет никакого разумного способа для индекса, чтобы помочь с этим запросом. Опять же, дан список городов в алфавитном порядке, если вы хотите найти какой-либо город, который содержит буква "Р", вам все равно придется пройти через каждую запись, чтобы найти ее.
Если вы выполняли запрос "начинается с" - WHERE column LIKE '... %'
- тогда индекс может помочь.
Даже для запроса "заканчивается на" - WHERE column LIKE '% ...'
- можно было бы использовать индекс.
Но для запроса "содержит" вы мало что можете сделать, кроме как создать отдельную таблицу с каждой подстрокой из вашего столбца.
Sargability: почему строки %% медленно - Брент Озар неограниченное®[^]
Один из способов получения индекса-поиск ведущего подстановочного знака %в SQL Server[^]
Heba Kamel
- индекс находится в столбце "имя". Он может использоваться для удовлетворения запросов по столбцу Name, но не будет использоваться для запросов по столбцу Transaction.
"
Я сделал индекс в столбце Name с помощью столбца include Transaction
из-за того, что я не могу создать индекс непосредственно в столбце транзакции, потому что это nvarchar(2000)
Richard Deeming
И, как я уже объяснял, индекс на Name
столбец не поможет вам найти записи с определенным значением в таблице. Transaction
колонка. Это поможет вам только найти записи с определенным именем. Name
. В том числе Transaction
столбец просто означает, что SQL не должен возвращаться к исходной записи, если ему нужно прочитать Transaction
столбец для записи, найденной с помощью этого индекса.
И даже если бы вы создали индекс на Transaction
колонка, это не поможет вам с запросом "содержит".
Heba Kamel
Хорошо
есть какие-нибудь предложения, как это сделать ?
для меня вся строка должна быть помещена в один столбец.
Richard Deeming
Взгляните на вторую ссылку в моем ответе. Это потребует гораздо больше места и сделает добавление или обновление записей намного медленнее; но это почти единственный способ заставить индекс работать с запросом "содержит".
Основываясь на тексте, который вы ищете, я предполагаю, что вы храните несколько значений в одном столбце? Если это так, то вам действительно следует рассмотреть возможность разбиения их на отдельные таблицы и поиска по ним. Кроме того, если вы используете SQL Server 2016, вы можете попробовать сохранить данные в формате JSON и создание индекса по этому вопросу[^].
Heba Kamel
потому что это объект JSON, а его свойства динамичны
Richard Deeming
Тогда ты можешь идти. Прочтите статью Microsoft, на которую я ссылался, в которой объясняется, как создать вычисляемый столбец для извлечения значения из ваших данных JSON, создать индекс для этого столбца, а затем запросить этот столбец вместо необработанного текста JSON.
Heba Kamel
хорошо, Спасибо за Вашу поддержку
Я постараюсь :)