Каков наиболее эффективный способ индексации в SQL Server трех столбцов nchar в этом случае?

Аннотация:
Я создаю новую таблицу в SQL Server 2012 в рамках проектирования бизнес-системы. В таблице есть 3 столбца (среди прочего) с типом nvarchar различных размеров, моему веб-приложению необходимо запросить эти 3 столбца, используя один строковый поисковый запрос. Эта таблица может содержать записи не более 100К.

Я хотел бы проиндексировать эти столбцы в SQL Server 2012 таким образом, чтобы было наиболее эффективно получать результаты.

Я хотел бы подчеркнуть, что вопросы, которые я собираюсь задать, относятся к моему конкретному случаю, а не к общим вопросам индекса SQL. Хотя ответы на них можно применить и к общим вопросам.

Контекст

  • SQL Server 2012
  • Windows Сервер 2008

Определения столбцов таблицы:

  • ItemNumber :: nvarchar(10)
  • Производитель :: nvarchar(20)
  • Описание :: nvarchar(40)

Возможное количество записей: до 100 тыс.

Случай использования:

Конечный пользователь (один из 1000 или около того) передаст одну строку для поиска в этих трех столбцах, и запрос должен вернуть все строки, в которых любой из этих трех столбцов содержит значение искомой строки (без учета регистра).

Вопросы:

  1. Каков наилучший способ создания индексов, чтобы запрос возвращал данные наиболее эффективным способом (быстро при минимальном использовании ресурсов SQL Server)?
  2. Создать индекс для каждого столбца?
  3. Создать один индекс со всеми тремя столбцами?
  4. Включить полнотекстовый поиск по индексу(ам)?
  5. Какой метод позволит использовать весь потенциал того, что может предложить SQL Server 2012?

person Leo Nix    schedule 02.07.2013    source источник
comment
Я бы НЕ рекомендовал использовать char(n) или nchar(n) для всего, что длиннее 5 или, может быть, макс. 10 символов. не используйте nchar(20) или, что еще хуже, nchar(40) - это огромная пустая трата места, и вы никогда не получите приличной производительности с таким дизайном. Для всего, что превышает 10 символов, я бы всегда рекомендовал использовать varchar/nvarchar(x) вместо версий с фиксированной длиной .....   -  person marc_s    schedule 03.07.2013
comment
Последний комментарий: если вы говорите где любой из трех столбцов содержит искомый текст, то вам либо нужно использовать полнотекстовый поиск, либо вы хотите сделать ... ItemNumber LIKE '%searchterm%' совпадений автоматически гарантирует, что никакие индексы никогда не будут использоваться --› ваша производительность будет ужасной....   -  person marc_s    schedule 03.07.2013
comment
@marc_s спасибо за все полезные комментарии! Я обновил тип данных в своем сообщении. Я хочу, чтобы в этом посте основное внимание уделялось эффективному индексированию в этом сценарии.   -  person Leo Nix    schedule 03.07.2013
comment
Как я уже упоминал: если вы хотите найти три столбца для содержащих поисковое выражение, то вам лучше всего подойдет полнотекстовый поиск. Если вы выполняете поиск с помощью ... WHERE ItemNumber LIKE '%....%', вы гарантируете уверенность, что никакие индексы никогда не будут использоваться, и ваша производительность будет ужасной — независимо от того, какие индексы у вас есть.   -  person marc_s    schedule 03.07.2013


Ответы (1)


Как уже предложил @marc_s, полнотекстовый поиск — единственный эффективный вариант.

person gery128    schedule 03.07.2013