2014-09-03 126 views
1

在这里,我在内部得到一个性能问题加入对庞大的数据为我的查询,如下所示的查询性能:SQL Server 2008中:使用内部连接

例子:

/* 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; 

获得非常多的时间来对上面的查询执行大量数据。

+0

您尚未在连接列上设置任何索引。这可能有帮助。 – stakx 2014-09-03 05:47:09

+0

我的猜测是你的连接条件是非可变的:convert(varchar,x.coltm,108)> t.st和convert(varchar,x.coltm,108) 2014-09-03 05:53:07

回答

1

尝试查询更改为

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; 

这里的问题是使用表变量,而不是临时表。这是comparing table variable and temp table的文件。

+0

这使得巨大的差异!非常感谢。 – Meem 2014-09-03 06:16:27

0

这是正常的,你有性能问题,你正在使用一个没有索引的表变量来操纵重要的数据量。

我不明白使用这个变量来得到你的结果,它的更高性能的直接使用您的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上定义了索引(如果没有,现在考虑这一点非常重要),这个解决方案才有意义。

希望这会帮助你。