我有两个表格:
表格1:100行
表格2:1000万行
示例:
表格1:
注意: 我想在两个表之间匹配名称,如果任何一个单词(John、Smith、Will)在另一个表中出现。例如,
我的尝试:
首先,我创建了用于将
函数:
上述查询需要超过20分钟才能执行完。
表格1:100行
表格2:1000万行
示例:
表格1:
tb100
create table tb100
(
name varchar(50)
);
insert into tb100 values('Mak John'),('Will Smith'),('Luke W')......100 rows.
表格2:tb10mil
create table tb10mil
(
name varchar(50)
);
insert into tb10mil values('John A Mak'),('K Smith Will'),('James Henry')......10 millions rows.
create nonclustered index nci_tb10mil_name on tb10mil(name);
注意: 我想在两个表之间匹配名称,如果任何一个单词(John、Smith、Will)在另一个表中出现。例如,
John
在John A Mark
中出现。我的尝试:
首先,我创建了用于将
tb100
的name
拆分为行的用户定义函数。函数:
udf_Split
CREATE FUNCTION [dbo].[udf_Split]
(
@InputString VARCHAR(8000),
@Delimiter VARCHAR(50)
)
RETURNS @Items TABLE (ID INTEGER IDENTITY(1,1), Item VARCHAR(8000))
AS
BEGIN
IF @Delimiter = ' '
BEGIN
SET @Delimiter = ','
SET @InputString = REPLACE(@InputString, ' ', @Delimiter)
END
IF (@Delimiter IS NULL OR @Delimiter = '')
SET @Delimiter = ','
DECLARE @Item VARCHAR(8000)
DECLARE @ItemList VARCHAR(8000)
DECLARE @DelimIndex INT
SET @ItemList = @InputString
SET @DelimIndex = CHARINDEX(@Delimiter, @ItemList, 0)
WHILE (@DelimIndex != 0)
BEGIN
SET @Item = SUBSTRING(@ItemList, 0, @DelimIndex)
INSERT INTO @Items VALUES (@Item)
SET @ItemList = SUBSTRING(@ItemList, @DelimIndex+1, LEN(@ItemList)-@DelimIndex)
SET @DelimIndex = CHARINDEX(@Delimiter, @ItemList, 0)
END
IF @Item IS NOT NULL
BEGIN
SET @Item = @ItemList
INSERT INTO @Items VALUES (@Item)
END
ELSE INSERT INTO @Items VALUES (@InputString)
RETURN
END
接着我写了以下查询语句:
;with splitdata as
(
select f.item as data
from tb100 t
cross apply dbo.udf_split(t.name,' ') f
)
select t2.name
from tb10mil t2
inner join splitdata c on charindex(c.data,t2.name)>0
group by t2.name
上述查询需要超过20分钟才能执行完。
WHILE
循环来进行分割?有很多数据集解决方案可以更快地完成。我建议使用XML分割器或delimitedsplit8k(如果不是nvarchar(MAX)
)。那个分割器很可能是你的(第一个)问题所在。 - Thom A