2016-06-20 5 views
1

新しい開発では、大きなSQLテーブル(〜100M行)を使用します。 4つのフィールドがデータのクエリに使用されます。Sqlパフォーマンスの場合、複数の等しいか1つの間

1つの連結フィールドを複数の等価で照会する方が良いですか?

Exemple:Fkのテーブルで

MainTable

 
PkId | Label | FkId1 | FkId2 | FkId3 | FkId4 
1 | test | 1  | 4  | 3  | 1 

DATASは、例えば静的である:

FkTable1

 
Id | Value 
1 | a 
2 | b 
3 | c 

DATASを照会するために、古典的なSQLクエリです。

性能を最適化する
select Label, FkId1, FkId2, FkId3, FkId4 
from MainTable 
where FkId1=1 and FkId2=2 and FkId3 in(2, 3) 

アイデアは、挿入する前に、一つのフィールド「ユニークID」を算出バックエンドを追加することである。

UniqueId = FkId1*1000000 + FkId2*10000 + FkId3*100 + FkId4 
 
PkId | Label | FkId1 | FkId2 | FkId3 | FkId4 | UniqueId 
1 | test | 1  | 4  | 3  | 1  | 1040301 
select Label, FkId1, FkId2, FkId3, FkId4 
from MainTable 
where UniqueId between 1020200 and 1040000 

また、一意IDフィールドと、インデックスをこのフィールドにのみ十分でしょう。

あなたはどう思いますか?このクエリの

おかげ

+1

FkId3の値が100の場合はどうなりますか?あなたのロジックはもはや機能しません。早すぎる最適化の罠に陥ってはいけません。まだ発生していないパフォーマンス問題を修正するために、非標準的な設計上の決定を下す寸前です。このような4列のキーには何も問題はありません。適切なテーブル構造を使用し、発生時にパフォーマンスの問題に対処してください。 –

+0

同様に、(2,3)にFkId1が必要な場合はどうなるか考えてみてください。 –

+0

@Sean Lange:時期尚早の最適化ではないので、現在のシステムデータで新しいシステムを設定します – twisted

答えて

3

select Label, FkId1, FkId2, FkId3, FkId4 
from MainTable 
where FkId1 = 1 and FkId2 = 2 and FkId3 in (2, 3) 

最適なインデックスがMainTable(FkID1, FkId2, FkId3)です。カバリングインデックスが必要な場合は、LabelFkId4をインデックスに追加することもできます(元のデータページを参照せずにインデックス全体を処理できるようにする)。

入力した例の計算フィールドは必要ありません。

+0

ありがとうございました。私は計算フィールドを追加しません – twisted

0

あなたは100万行になるので、最初から最適化について考えてみると分かりやすいようです。 しかし、あなたの提案された解決策は、この方法では動作しません:上記

  1. あなたの式は2回同じ倍率10000あなたはさまざまな要因を使用する必要があり、10

  2. あなたのすなわち異なるパワーを持っていますselectサンプルに "IN"句((2,3)のFkId3)があります。これは、FKのうちの1つだけがこのように照会された場合にのみ機能します。このfkは、UniqueIdを計算するための式に因子のないものでなければならない(すなわち、UniqueIdの最下位桁を与える)。今ゴードンズの答えを見て

、私は彼に同意する、すなわち組み合わせたインデックスを使用して(あなたのソリューションは、おそらく若干良いでしょうが)あなたのために十分かもしれません。しかし、組み合わされた索引も同様の問題を抱えています。IN節で照会されたFKフィールドは、索引の最後のフィールドである必要があります。

関連する問題