У меня есть 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])
Как выглядит план выполнения? Насколько избирательным является 'WHERE' на таблице' A'? Вероятно, он не использует индексы, поскольку они не охватывают все столбцы в списке SELECT. –