4

約 5 つのインデックス列を持つデータベースがあり、そのすべてがさまざまな方法で役立ちます。それらをシステム、ソース、ヒート、タイム、ロウと呼びましょう。System と Row を一緒に使用すると一意のキーが作成され、System-Row で並べ替えると、データベースも 5 つのインデックス変数の任意の組み合わせで並べ替えられます (上記の順序で)。

私の問題は、これらの列のすべての組み合わせを使用することです。各 System-Row を次の System-(Row+1) に JOIN したい場合もあれば、System-Source-Heat で GROUP または WHERE を使用したい場合もあります。 System-Source WHERE Time is in a specific window などのすべてのエントリを調べます。

基本的に、これら 5 つのインデックスのすべての可能な順列 (もちろん正しい順序で) と同様に機能するインデックス構造が必要です。私は従来のデータベース作業ではなく、統計/分析を行っているため、インデックスのサイズと作成/更新の速度は問題ではありません。私は即席のクエリを高速化することだけを考えて実行し、5 ~ 10 分待ってから二度と使用しない傾向があるためです。したがって、私の主な関心事は、「5 ~ 10 分待つ」を「1 ~ 2 分待つ」ように減らすことです。

私のソートされたデータは次のようになります。

Sys So H Ti R
1   1  0 .1 1
1   1  1 .2 2
1   1  1 .3 3
1   1  2 .3 4
1   2  0 .5 5
1   2  0 .6 6
1   2  1 .8 7
1   2  2 .8 8

編集:他の4つの列のいずれかをソート順に作成するには、システムを事実上常に最初の列として含める必要があることを少し単純化する場合があります。

4

2 に答える 2

0

これに戻るのに時間がかかって申し訳ありません。数週間、別のことに取り組まなければなりませんでした。とにかく、たくさんのことを試した後(ここで提案されているすべてのもの、ブルートフォースの「すべての順列のインデックスを作成する」方法でさえ)、パフォーマンスを大幅に向上させるインデックス作成方法は見つかりませんでした。

ただし、インデックスを作成しない代替ソリューションを見つけました。関心のある行と列のみを中間テーブルに選択し、完全なテーブルの代わりにそれらを使用します (したがって、代わりに 6 列の約 500 万行を使用します)。 35 列の 3,000 万行)。最初の選択とテーブルの作成は少し遅いですが、その後の手順は非常に高速であるため、1 回しか実行しない場合でも、実際には時間を節約できます (変更の頻度を考慮すると、通常は 1 回以上です)。

この大幅な改善の理由は、ほとんどの SQL ユーザーにとって明らかであると思います (おそらくページファイルのサイズに関するものでしょう)。私の唯一の言い訳は、私は統計学者であり、これを行う方法を自分自身に教えようとしているということです. 「これは魔法のブラック ボックスです。心配する必要はありません」に近いです。

于 2012-11-16T19:47:48.867 に答える
0

SELECT の速度のみに関心があり、INSERT は気にしない場合は、すべての組み合わせを INDEXED ビューとして実体化できます。元のテーブルの 24 倍のストレージが必要なだけで、1 つのテーブルとそれぞれ 5 列の 23 の INDEXED VIEW を作成できます。

例えば

create table data (
    id int identity primary key clustered,
    sys int,
    so int,
    h float,
    ti datetime,
    r int);
GO
create view dbo.data_v1 with schemabinding as
    select sys, so, h, ti, r
    from dbo.data;
GO
create unique clustered index cix_data_v1 on data_v1(sys, h, ti, r, so)
GO
create view dbo.data_v2 with schemabinding as
    select sys, so, h, ti, r
    from dbo.data;
GO
create unique clustered index cix_data_v2 on data_v2(sys, ti, r, so, h)
GO

-- and so on and so forth, keeping "sys" anchored at the front

ただし、
Q. クエリ プランで使用するために、クエリ オプティマイザーがインデックス付きビューを取得しないのはなぜですか? (リンク先記事内検索)


スペースが問題である場合、次善の策は、システム、つまり (sys,ti)、(sys,r) などで始まる 4 つの列のそれぞれに個別のインデックスを作成することです。これらは、役立つ場合は一緒に使用できます。そうしないと、フル テーブル スキャンに戻ります。

于 2012-10-31T20:43:14.460 に答える