SQL Server:性能文本搜索模式

时间:2019-06-27 18:38:47

标签: sql-server azure-sql-database

我有一个要求,我必须定期(在Azure SQL Server上)对照70k名表检查40k名。

表有2个相关列

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

姓名匹配必须与名字和姓氏完全匹配。

天真的,我的第一种方法是运行40k select/where firstname='xxx' and lastname='yyy'个查询,但是我必须相信还有一种更高性能的方法。从表面上看,我想听起来像是大约28万个基于文本的查询。显然,该列足够短,无法索引到我的位置,但是可以确定还有什么可以做的?

我的第一个问题是,在SQL Server中处理此类问题的最有效方法是什么?

我的第二个问题是,任何有类似经验的人都知道在70k行查询中进行40k文本搜索需要多长时间,即使只是数量级?即我在看分钟,小时,天等吗?

预先感谢您提供任何见解。

1 个答案:

答案 0 :(得分:1)

同时包含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记录也不会引起任何性能问题。