2013-06-28 5 views
0

У меня проблема с производительностью при подключении SQL Server, где есть сравнение нескольких столбцов.Производительность SQL Server JOIN

SELECT T1.* FROM T1, T2 
WHERE T1.LASTNAME = T2.LASTNAME AND 
T1.FIRSTNAME = T2.FIRSTNAME AND 
T1.MIDDLENAME = T2.MIDDLENAME AND 
DAY(T1.DoB) = T2.DOBDay AND 
MONTH(T1.DoB) = T2.DOBMonth 

Каждая из этих таблиц превышает 20000 записей, и это действительно вызывает проблемы с производительностью. Я побежал, и это заняло больше 6 минут, поэтому я отменил его!

Есть ли способ увеличить производительность этого заявления?

+0

Какие индексы у вас есть на обеих таблицах? Что говорит план выполнения? – peterm

+0

Проверяйте индексы во всех полях в разделе where в обеих таблицах! – Anshuman

+0

В худшем случае, без индексов в любой таблице, каждая из 20 000 строк в T1 должна сравниваться с 20 000 строк в T2, в результате чего рабочий набор строк 400MM. Чтобы установить, что эта проблема стоит за экраном, а не перед ним, дайте некоторое описание доступных индексов. –

ответ

0

Вы должны создать ниже, не индекс кластера на обеих таблиц до ..

CREATE NONCLUSTERED INDEX IX_First_Middle_T2 ON T2 (FIRSTNAME,MIDDLENAME); 

Теперь вводного ниже запрос

SELECT T1.*,DAY(T1.DOB) as DOBDay, MONTH(T1.DOB) as DOBMonth INTO #T1 
CREATE NONCLUSTERED INDEX IX_First_Middle_T1 ON #T1 (FIRSTNAME,MIDDLENAME); 

SELECT T1.* 
FROM #T1 T1 
JOIN T2 
ON T1.LASTNAME  = T2.LASTNAME 
and T1.FIRSTNAME = T2.FIRSTNAME 
and T1.MIDDLENAME = T2.MIDDLENAME 
and T1.DOBDay  = T2.DOBDay 
and T1.DOBMonth = T2.DOBMonth 

выше запрос дает два дополнительных столбцы с месяцем и датой, вместо T1. * замените его именами столбцов.

2

Поскольку вам нужны только данные из таблицы T1, вы можете использовать предложение left join или exists.

select T1.* 
    from T1 
    where 
     exists (
        select 1 
        from T2 
        where 
        T1.LASTNAME = T2.LASTNAME 
        and T1.FIRSTNAME = T2.FIRSTNAME 
        and T1.MIDDLENAME = T2.MIDDLENAME 
        and DAY(T1.DoB) = T2.DOBDay 
        and MONTH(T1.DoB) = T2.DOBMonth 
      ) 
+0

Привет, я просто попробовал это, и, похоже, производительность ухудшилась. Удвоение времени выполнения – James

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