SQL Server: шаблон текстового поиска для повышения производительности - PullRequest
0 голосов
/ 27 июня 2019

У меня есть требование, при котором мне периодически приходится проверять имена 40 КБ по таблице имен 70 КБ (в Azure SQL Server).

Таблица имеет 2 соответствующих столбца

FIRSTNAME (nvarchar(15)) 
LASTNAME (nvarchar(20))

Совпадения имен должны быть точными совпадением имени и фамилии.

Наивно, мой первый подход состоял бы в том, чтобы выполнить 40k select/where firstname='xxx' and lastname='yyy' запросов, но я должен верить, что есть более эффективный способ сделать это. Я думаю, на первый взгляд, это звучит примерно как 280 тыс. Текстовых запросов. Очевидно, что столбец достаточно короткий, чтобы я мог его проиндексировать, но наверняка есть что-то еще, что я мог бы сделать?

Мой первый вопрос: каков наиболее эффективный способ решения такой проблемы в SQL Server?

Мой второй вопрос: кто-нибудь, имеющий опыт работы с чем-то подобным, имеет какое-либо представление о том, сколько времени займет 40-килобайтный поиск текста по 70-строчному запросу, даже на порядок величины? То есть я смотрю на минуты, часы, дни и т. д.

Заранее спасибо за любые идеи.

1 Ответ

1 голос
/ 28 июня 2019

Индекса, который содержит столбцы FIRSTNAME и LASTNAME, должно быть достаточно, если это возможно, сделать его кластеризованным.

CREATE CLUSTERED INDEX [idx_yourTable] ON yourTable (
    FIRSTNAME ASC,
    LASTNAME ASC
)

Если вы не можете создать индекс для своей таблицы, вы можете извлечь все данные во временную таблицу и создать индекс для временной таблицы.

DROP TABLE IF EXISTS #T_Local
DROP TABLE IF EXISTS #T_Azure

SELECT
        ID
--  A seperator is used to avoid case like 
--  'FirstName' + 'LastName' = 'FirstNameLast' + 'Name' 
       ,FIRSTNAME + '|' + LASTNAME AS [FULL_NAME]
       ,FIRSTNAME
       ,LASTNAME
    INTO #T_Local
    FROM server1.DB1.dbo.YourTable

SELECT
        ID
       ,FIRSTNAME + '|' + LASTNAME AS [FULL_NAME]
       ,FIRSTNAME
       ,LASTNAME
    INTO #T_Azure
    FROM server2.DB1.dbo.YourTable

CREATE CLUSTERED INDEX [idx_t_local] ON #T_Local (
[FULL_NAME] ASC)

CREATE CLUSTERED INDEX [idx_t_azure] ON #T_Azure (
[FULL_NAME] ASC)

SELECT
        tl.ID        AS [ID_Local]
       ,tl.FIRSTNAME AS [FIRSTNAME_Local]
       ,tl.LASTNAME  AS [LASTNAME_Local]
       ,ta.ID        AS [ID_Azure]
       ,ta.FIRSTNAME AS [FIRSTNAME_Azure]
       ,ta.LASTNAME  AS [FIRSTNAME_Azure]
    FROM #T_Local tl
    INNER JOIN #T_Azure ta
        ON tl.FULL_NAME = ta.FULL_NAME

Наконец, записи от 40k до 70k - это не так много данных, которые могут вызвать проблемы с производительностью даже без надлежащего индекса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...