2014-09-03 180 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上定義了索引(如果沒有,現在考慮這一點非常重要),這個解決方案纔有意義。

希望這會幫助你。