Heba Kamel Ответов: 1

Индекс в столбце nvarchar не влияет на производительность


Привет,

У меня есть столбец в таблице, который имеет тип данных nvarchar(200)

а затем я добавляю индекс в другой столбец, включая мой столбец nvarchar(200)

но производительность такая же, когда я делаю запрос select с условием where в столбце nvarchar(200)

Мне нужно знать, почему индекс в столбце nvarchar не влияет на производительность?

Что я уже пробовал:

CREATE TABLE dbo.POS_JSON_Transaction_2000
(
  Id INT IDENTITY PRIMARY KEY,
  [Name] Nvarchar(50),
  [Transaction] nvarchar(2000) 
);

CREATE INDEX POS_JSON_Transaction_2000_Transaction_Index ON 
POS_JSON_Transaction_2000(Name) include ([Transaction]);

select * from POS_JSON_Transaction_2000 where [Transaction] like '%"NAME__STRING":"testKA"%'

#realJSOP

Вы должны задать этот вопрос на одном из форумов. Это скорее дискуссия, чем конкретный вопрос.

Richard Deeming

Мы не можем видеть вашу таблицу; мы не можем видеть ваш индекс; мы не можем видеть ваш запрос; и мы не можем видеть ваши данные. Любой из них может повлиять на план запроса.

Щелкните зеленую ссылку "улучшить вопрос" и обновите свой вопрос, чтобы описать соответствующие части структуры таблицы, определение индекса и выполняемый запрос.

Heba Kamel

хорошо, я обновил вопрос
Спасибо

1 Ответов

Рейтинг:
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

Индексировать данные JSON | Microsoft Docs[^]

Требуется SQL Server 2016 или 2017.

Richard Deeming

Тогда ты можешь идти. Прочтите статью Microsoft, на которую я ссылался, в которой объясняется, как создать вычисляемый столбец для извлечения значения из ваших данных JSON, создать индекс для этого столбца, а затем запросить этот столбец вместо необработанного текста JSON.

Heba Kamel

хорошо, Спасибо за Вашу поддержку
Я постараюсь :)