0

1000,000 レコードが次のように配置されているとします。

c1_v1 c2_v1 c3_v1 d1
c1_v1 c2_v1 c3_v2 d2
c1_v1 c2_v1 c3_v3 d3
...
c1_v1 c2_v2 c3_v1 d999
c1_v1 c2_v2 c3_v2 d1000
...
c1_v999 c2_v999 c3_v998 d999999
c1_v999 c2_v999 c3_v999 d1000000

結果 (dx) を照会するには 3 つの条件 (c1_vx、c2_vx、c3_vx) が必要ですが、異なるレコードの c1_v1 などの単一の条件は同じである可能性があります。レコードの別のスタイル:

c1_v1
    c2_v1
        c3_v1 : d1
        c3_v2 : d2
        c3_v3 : d3
        ...
    c2_v2
        c3_v1 : d999
        c3_v2 : d1000
    ...
c1_v999
    c2_v999
        c3_v998: d999999
        c3_v1000: d1000000

最速のクエリ用にテーブルを設計する方法は? (クエリだけで、挿入/更新/削除は気にしません)

ありがとう!

4

1 に答える 1

1

典型的なクエリ操作は、c1='UA1000_2048X32_MCSYN'およびc2='1.234'およびc3='2.345'であるt_tableからのselectdのようなものです。

さて、あなたはただの複合インデックスが必要です{c1, c2, c3}

理想的には、テーブルもクラスタリングするので、取得dにはテーブルヒープアクセスなしのインデックスシークが含まれますが、SQLiteはクラスタリングをサポートしていないと思います。または、代わりにカバーインデックスを作成することを検討して{c1, c2, c3, d}ください。


c1はUA1000_2048X32_MCSYNのような文字列であり、c2とc3は実数(double)の数値です。

クエリで数値と文字列を同一視しようとすることは控えたいと思います。一部のDBMSはこれらの状況でインデックスを使用できず、SQLiteがその1つである可能性があります。代わりに、数値リテラルを一重引用符で囲まずに、最も自然な方法でクエリを記述してください。

select d from t_table
where c1 = 'UA1000_2048X32_MCSYN' and c2 = 1.234 and c3 = 2.345;
于 2012-08-26T10:11:05.037 に答える