加入多个列

时间:2013-11-01 21:40:24

标签: sql-server database sql-server-2005

我有2个大表:Table_A(1000万行)和Table_B(7百万行)使用3个不同的列连接。我的SELECT语句如下:

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=....

我当前在Table_B上有复合非集群索引:([column_b4],[column_b5],[column_b6])。 3列独特的组合。

此连接速度非常慢(返回第一条记录需要5分钟以上)。请告知我应该为LEFT OUTER JOIN创建Table_A和Table_B上的哪个索引以提供最佳性能。如果我创建包含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 个答案:

答案 0 :(得分:0)

谢谢你的例子。下面的答案基于您的示例,但显然表中的记录越多,行为可能会有所不同。出于同样的原因,这可能不是完整的解决方案。

您可以改进的一件事是在您拥有SELECT的索引中包含Table_B中从查询返回的所有列(位于IDX_b4b5b6列表中)。至少在该示例中,它使SQL Server使用索引(而不是表扫描)。

答案 1 :(得分:0)

如果表还没有主键,并且这些表是相当静态的(没有多少插入/更新),请考虑在这3列上一起定义主键。 ALTER TABLE Table_A ADD CONSTRAINT pk_table_a PRIMARY KEY([column_a1],[column_a2],[column_a3])