我有兩個表:查詢大(以百萬計)數據的速度更快
TBL1有2列:名稱和狀態
TBL2有有關字段名稱,狀態和其他列
我想匹配tbl1名稱和狀態與tbl2名稱和狀態。我已經刪除了所有完全匹配,但是我發現如果我可以通過使用比較2個名稱的標量函數來解釋拼寫錯誤和名稱變化,我可以匹配更多,並返回一個整數,表示它們匹配程度如何(號碼返回比賽越好)。
問題是Tbl1有超過2M條記錄,而Tbl2有超過4M條記錄 - 在Tbl2中從Tbl1搜索一條記錄大約需要30秒。
有什麼方法可以安排數據或查詢,以便搜索更快完成?
這裏的表結構:
CREATE TABLE Tbl1
(
Id INT NOT NULL IDENTITY(1, 1) PRIMARY KEY,
Name NVARCHAR(255),
[State] VARCHAR(50),
Phone VARCHAR(50),
DoB SMALLDATETIME
)
GO
CREATE INDEX tbl1_Name_indx ON dbo.Tbl1(Name)
GO
CREATE INDEX tbl1_State_indx ON dbo.Tbl1([State])
GO
CREATE TABLE Tbl2
(
Id INT NOT NULL IDENTITY(1, 1) PRIMARY KEY,
Name NVARCHAR(255),
[State] VARCHAR(50)
)
GO
CREATE INDEX tbl2_Name_indx ON dbo.Tbl1(Name)
GO
CREATE INDEX tbl2_State_indx ON dbo.Tbl1([State])
GO
下面是我測試,試圖排除功能複雜的樣本函數:
CREATE FUNCTION [dbo].ScoreHowCloseOfMatch
(
@SearchString VARCHAR(200) ,
@MatchString VARCHAR(200)
)
RETURNS INT
AS
BEGIN
DECLARE @Result INT;
SET @Result = 1;
RETURN @Result;
END;
下面是一些樣本數據:
INSERT INTO Tbl1
SELECT 'Bob Jones', 'WA', '555-333-2222', 'June 10, 1971' UNION
SELECT 'Melcome T Homes', 'CA', '927-333-2222', 'June 10, 1971' UNION
SELECT 'Janet Rengal', 'WA', '555-333-2222', 'June 10, 1971' UNION
SELECT 'Matt Francis', 'TN', '234-333-2222', 'June 10, 1971' UNION
SELECT 'Same Bojen', 'WA', '555-333-2222', 'June 10, 1971' UNION
SELECT 'Frank Tonga', 'NY', '903-333-2222', 'June 10, 1971' UNION
SELECT 'Jill Rogers', 'WA', '555-333-2222', 'June 10, 1971' UNION
SELECT 'Tim Jackson', 'OR', '757-333-2222', 'June 10, 1971'
GO
INSERT INTO Tbl2
SELECT 'BobJonez', 'WA' UNION
SELECT 'Malcome X', 'CA' UNION
SELECT 'Jan Regal', 'WA'
GO
以下爲查詢:
WITH cte as (
SELECT t1Id = t1.Id ,
t1Name = t1.Name ,
t1State = t1.State,
t2Name = t2.Name ,
t2State = t2.State ,
t2.Phone ,
t2.DoB,
Score = dbo.ScoreHowCloseOfMatch(t1.Name, t2.Name)
FROM dbo.Tbl1 t2
JOIN dbo.Tbl2 t1
ON t1.State = t2.State
)
SELECT *
INTO CompareResult
FROM cte
ORDER BY cte.Score ASC
GO
嘗試採取標量函數ScoreHowCloseOfMatch你的查詢。我懷疑這是罪魁禍首。標量函數對於性能來說很可怕。根據功能的不同,它可以重寫許多方法來顯着提供幫助。 –
兩次傳球怎麼樣?首先給每個表Soundex評分或類似,然後加入呢? – SteveCav
你可以讓你的測試函數有nvarchar作爲參數I.e.與表格相同並重新運行?轉換很昂貴。 –