2

大量のデータに取り組んでいます (以下に行数を示します)。

Table 1 : 708408568 rows  -- 708 million
Table 2 : 1416817136 rows -- 1.4 billion

Table 1 Schema:
----------------
ID -      Int PK
column2 - Int

Table 2 Schema
----------------
Table1ID - Int FK
SomeColumn - Int
SomeColumn - Int

Table1 には、Table 2 の FK として機能する PK1 があります。

インデックスの詳細:

Table1 : 
PK Clustered Index on Id
Non Clustered (Non Unique) on column2

Table 2 :
Table1ID (FK) Clustered Index

以下は、実行する必要があるクエリです。

SELECT t1.[id]
      ,t1.[column2]
FROM  Table1 t1
inner join Table2 t2
    on s.id = cs.id
WHERE t1.[column2] in (select [id] from ConvertCsvToTable('1,2,3,4,5.......10000')) -- 10,000 Comma seperated Ids

要約すると、ID の内部結合は、PK と FK の両方で同じ ID のクラスター化インデックスによって処理する必要があります。column2 の "巨大な" Where 条件については、非クラスター化インデックスがあります。

ただし、クエリは 100 個の ID の小さなサブセットで 4 分かかり、10,000 個の ID を渡す必要があります。

これを行うことができる設計上のより良い方法はありますか、それともテーブルの分割が役立つ可能性がありますか?

Inner Join と Where IN を使用して膨大な量の Select を解決する方法をいくつか知りたかっただけです。

注 : ConvertCsvToTable は、最適に実行することが既に決定されている Split 関数です。

ありがとう !

4

2 に答える 2

3

これは私が試みることです: 関数からの戻り値の構造を持つ一時テーブルを作成します。オプティマイザーが考慮に入れるように、必ず列 ID を主キーとして設定してください...

CREATE TABLE #temp
(id    int          not null
    ...
,PRIMARY KEY (id) )

次に関数を呼び出します

insert into #temp exec ConvertCsvToTable('1,2,3,4,5.......10000')

次に、クエリで直接結合された一時テーブルを使用します

SELECT t1.[id], t1.[column2]
FROM  Table1 t1, t2, #temp
where t1.id = t2.id
  and t1.[column2] = #temp.id
于 2012-10-26T19:03:14.947 に答える
0

条件を結合
に持ち込む オプティマイザに最初に t1.[column2] でフィルタリングする機会を与える
異なるハッシュ ヒントを試す

SELECT t1.[id], t1.[column2]
FROM  Table1 t1 with (nolock)
inner join Table2 t2 with (nolock)
   on s.id = cs.id
  and t1.[column2] in (select [id] from ConvertCsvToTable('1,2,3,4,5.......10000'))

Column2 でそのインデックスを使用するように指示する必要がある場合があります。
しかし、正しいことをする機会を与えてください。
あなたが正しいことをする機会を与えていなかった場所で。

#temp を使用する場合は、試してみてください
(そして、Rodolfo が +1 と述べたように、temp で PK を宣言します)
。これにより、小さなテーブルで開始することがほとんど強制され
ます。

SELECT t1.[id], t1.[column2]
FROM #temp 
JOIN Table1 t1 with (nolock)
  on t1.[column2] = #temp.ID 
join Table2 t2 with (nolock)
   on t2.ID = t1.ID
于 2012-10-26T20:10:54.990 に答える