我有一个要求,我必须定期(在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文本搜索需要多长时间,即使只是数量级?即我在看分钟,小时,天等吗?
预先感谢您提供任何见解。
答案 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记录也不会引起任何性能问题。