1

私は 2 つの大きなテーブルを持っています: Table_A (1,000 万行) と Table_B (700 万行) を 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])
4

2 に答える 2

0

テーブルにまだ主キーがなく、それらのテーブルがかなり静的である (挿入/更新があまり行われていない) 場合は、これら 3 つの列に主キーをまとめて定義することを検討してください。ALTER TABLE Table_A ADD CONSTRAINT pk_table_a PRIMARY KEY ([列_a1]、[列_a2]、[列_a3])

于 2013-11-02T05:01:04.693 に答える
0

例をありがとう。以下の回答はあなたの例に基づいていますが、明らかにテーブル内のレコードが増えると動作が異なる場合があります。同じ理由で、これは完全な解決策ではないかもしれません。

SELECT改善できることの 1 つは、クエリから返された (リストにある) Table_B のすべての列をインデックスに含めることですIDX_b4b5b6。少なくともこの例では、SQL Server が (テーブル スキャンの代わりに) インデックスを使用するようにします。

于 2013-11-02T02:37:59.083 に答える