2013-11-01 3 views
1

У меня есть 2 больших таблицы: Table_A (10 миллионов строк) и Table_B (7 миллионов строк), соединяющих три разных столбца. Моя ЗЕЬЕСТ следует:Присоединение к нескольким столбцам

SELECT Table_A.* , Table_B.* 
FROM 
    Table_A 
    LEFT OUTER JOIN Table_B ON (Table_A.column_a4=Table_B.column_b4 AND Table_A.column_a5=Table_B.column_b5 AND Table_A.column_a6=Table_B.column_b6) 
WHERE Table_A.column_a1=.... 

I тока имеют композитный индекс Noncluster на TABLE_B: ([column_b4], [column_b5], [column_b6]). Сочетание 3-х столбцов уникально.

Это соединение очень медленно (требуется более 5 минут, чтобы вернуть первую запись). Пожалуйста, сообщите, какой индекс на Table_A и Table_B я должен создать для LEFT OUTER JOIN, чтобы обеспечить лучшую производительность. Будет ли быстрее, если я создам Composite Primary key, который состоит из 3 столбцов?

Спасибо.

CREATE TABLE Table_A 
(
    column_a1 [nvarchar] (20) NULL, 
    column_a2 [nvarchar] (20) NULL, 
    column_a3 [nvarchar] (20) NULL, 
    column_a4 [nvarchar] (20) NULL, 
    column_a5 [nvarchar] (20) NULL, 
    column_a6 [nvarchar] (20) NULL 
) 
CREATE INDEX IDX_a1a2a3 ON [Table_A] ([column_a1],[column_a2],[column_a3]) 
INSERT INTO Table_A values('1','1','1','1','1','1') 
INSERT INTO Table_A values('2','2','2','2','2','2') 
INSERT INTO Table_A values('3','3','3','3','3','3') 
INSERT INTO Table_A values('4','4','4','4','4','4') 
INSERT INTO Table_A values('5','5','5','5','5','5') 

CREATE TABLE Table_B 
(
    column_b1 [nvarchar] (20) NULL, 
    column_b2 [nvarchar] (20) NULL, 
    column_b3 [nvarchar] (20) NULL, 
    column_b4 [nvarchar] (20) NOT NULL, 
    column_b5 [nvarchar] (20) NOT NULL, 
    column_b6 [nvarchar] (20) NOT NULL, 
    column_b7 [nvarchar] (20) NULL 
) 

INSERT INTO Table_B values('11','11','11','1','1','1','11') 
INSERT INTO Table_B values('22','22','22','2','2','2','22') 
INSERT INTO Table_B values('33','33','33','3','3','3','33') 
INSERT INTO Table_B values('44','44','44','4','4','4','44') 
INSERT INTO Table_B values('55','55','55','55','55','55','55') 

CREATE INDEX IDX_b4b5b6 ON [Table_B] ([column_b4],[column_b5],[column_b6]) 
+2

Как выглядит план выполнения? Насколько избирательным является 'WHERE' на таблице' A'? Вероятно, он не использует индексы, поскольку они не охватывают все столбцы в списке SELECT. –

ответ

0

Спасибо за пример. Ответ ниже основан на вашем примере, но, очевидно, с большим количеством записей в таблицах поведение может отличаться. По той же причине это может быть не полное решение.

Одна вещь, которую вы могли бы улучшить, - включить все столбцы из таблицы_B, которые возвращаются из запроса (находятся в списке SELECT) в индексе, который у вас есть IDX_b4b5b6. По крайней мере, в этом примере SQL Server использует индекс (вместо сканирования таблицы).

0

Если таблицы еще не имеют первичного ключа, и если эти таблицы довольно статичны (не так много вставки/обновления), подумайте об определении первичного ключа на этих трех столбцах вместе. ALTER TABLE Таблица_A ADD CONSTRAINT pk_table_a ПЕРВИЧНЫЙ КЛЮЧ ([column_a1], [column_a2], [column_a3])

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