Настройка запросов выбора SQL-сервера - PullRequest
1 голос
/ 21 марта 2019

У нас есть таблица базы данных SQL Server с около 60 миллионами записей.Это записи имен и адресов конкретных лиц.Таблица содержит следующие столбцы:

[Name] [nvarchar](425) NOT NULL,
[Street] [nvarchar](900) NULL,
[City] [nvarchar](900) NULL,
[State] [nvarchar](900) NULL,
[PostalCode] [nvarchar](100) NULL

Что нам нужно сделать, так это уметь выполнять конкретный оператор выбора менее чем за 1 секунду.

Мы должны иметь возможность выбирать записи в зависимости от того, ''Имя] 'содержит одно или несколько введенных слов (не «точное совпадение» и не «начинается с») и затем применяет следующую логику приоритизации:

  1. Отображение в верхних записях, которые расположены в данном [State]и [Город]
  2. Показать элементы, которые находятся в данном [Штате], но другом городе
  3. Показать элементы, которые находятся в других штатах

Вот что мы имеемпробовал:

  1. Мы пытались перестроить таблицу различными способами, извлекая разные столбцы в разные таблицы, разные наборы индексов, извлекая каждое слово в качестве токена в отдельную папку
  2. SQL Server fullтекстовый поиск.(для сопоставления записей с функцией «Содержит»)
  3. Azure Cosmos DB.Мы перенесли туда данные, чтобы оценить, можем ли мы выполнить выборки достаточно эффективно

Проблема всегда в том, чтобы расставить приоритеты в записях на основе состояния + город

Вопрос в том, как мы можем достичь способности выполнятьвыбирает менее 1 секунды для этого случая, используя SQL Server или любой другой источник данных (предпочтительно доступный в Azure)

1 Ответ

1 голос
/ 21 марта 2019

Единственное, что я могу придумать, помимо нормализации City, State и Zip и правильного определения размера этих полей, это составить таблицу со списком слов:

Create Table tbl_Entity
(
    [ID] [Int] Identity Not Null,
    [Name] [nvarchar](425) NOT NULL,
    [Street] [nvarchar](900) NULL,
    [City] [nvarchar](900) NULL,
    [State] [nvarchar](900) NULL,
    [PostalCode] [nvarchar](100) NULL
)

Create Table tbl_Entity_Name_Elements
(
    [ID] [Int] Identity Not Null,
    [Entity_ID] [Int] Not Null,   -- foreign key to tbl_Entity
    [Name_Element] [nvarchar](100) Null
)

Естьподпрограмма (возможно, ночная работа), которая заполняет bl_Entity_Name_Elements путем анализа строк в tbl_Entity.Индексируйте tbl_Entity_Name_Elements в Name_Element, и вы сможете быстро получить значения Entity_ID, которые содержат весь заданный список слов, и которые должны поддерживать SARG.Это дает вам tbl_Entity предметов, которые вам нужны.Имеет ли это смысл?

...