[英]SQL Server 2008: Query performance using inner join
在这里,我在查询的海量数据的内部联接上遇到性能问题,如下所示:
例:
/* Creating table */
create table xyz
(
colp1 nvarchar(10),
colp2 nvarchar(10),
coldt date,
coltm datetime,
coldr integer
);
/* Inserting records */
insert into xyz values('A','B','2014-08-02','10:00:00',50);
insert into xyz values('A','C','2014-08-02','11:08:08',120);
insert into xyz values('A','B','2014-08-02','11:08:55',160);
insert into xyz values('A','D','2014-08-03','09:00:15',180);
insert into xyz values('A','E','2014-08-04','11:00:10',600);
insert into xyz values('A','F','2014-08-04','11:05:50',320);
.
.
upto 50000
/* Query */
declare @testtable table(dt date,st time,et time)
insert into @testtable select coldt,coltm,DATEADD(ss,coldr,coltm) from xyz
select distinct colp1,colp2,coldt,
coltm from xyz as x
inner join
@testtable as t on convert(varchar,x.coltm,108) > t.st and
convert(varchar,x.coltm,108)< t.et;
获得大量时间来执行上述查询以获取大量数据。
尝试将查询更改为
create TABLE #testtable (dt date,st time,et time)
insert into #testtable select coldt,coltm,DATEADD(ss,coldr,coltm) from xyz
select distinct colp1,colp2,coldt,
coltm
INTO #tmp2
from xyz as x
inner join #testtable as t on convert(varchar,x.coltm,108) > t.st and
convert(varchar,x.coltm,108)< t.et;
这里的问题是使用表变量而不是临时表。 这是用于比较表变量和临时表的文档。
通常,您会遇到性能问题,正在使用没有索引的表变量来处理大量数据。
我不理解使用此变量来获取结果,直接使用xys表的性能更高:
SELECT DISTINCT X.colp1
,X.colp2
,X.coldt
,X.coltm
FROM xyz X
INNER JOIN (SELECT Y.coldt AS [dt]
,Y.coltm AS [st]
,DATEADD(SS, Y.coldr, Y.coltm) AS [colet]) XT ON XT.st < CONVERT(VARCHAR, X.coltm, 108)
AND XT.et > CONVERT(VARCHAR, X.coltm, 108)
通过使用这种方法,您可以充分利用表索引,并且与使用表变量相比,它的性能要高得多。
当然,仅当您在表xys上定义索引时,此解决方案才有意义(如果没有,则现在考虑这一点非常重要)。
希望这会帮助你。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.