2014-09-03 3 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

+0

Мое предположение заключается в том, что ваши условия соединения не подлежат конвертации: convert (varchar, x.coltm, 108)> t.st и convert (varchar, x.coltm, 108)

ответ

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

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 (если нет, очень важно подумать об этом сейчас).

Надеюсь, это вам поможет.

Смежные вопросы