SQL Server 2008:使用内部联接的查询性能

SQL Server 2008:使用内部联接的查询性能,sql,sql-server,performance,Sql,Sql Server,Performance,在这里,对于我的查询,在海量数据的内部连接上,我遇到了一个性能问题,如下所示: 例如: /* 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:

在这里,对于我的查询,在海量数据的内部连接上,我遇到了一个性能问题,如下所示:

例如:

/* 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上定义了索引时,此解决方案才有意义。如果没有定义索引,那么现在考虑这一点非常重要


希望这将对您有所帮助。

您尚未在联接列上设置任何索引。这可能会有所帮助。我猜您的连接条件是不可搜索的:convertvarchar,x.coltm,108>t.st和convertvarchar,x.coltm,108