現在最適化しようとしているワイドテーブルがあります。テーブルには、最終的に降順でランク付けする50個の列(統計)があります。現在、500万行を超えています。SQL Serverのランキング最適化インデックス
この表を最適化する方法は、複雑さの軽減と読み取り速度の向上の両方の面で優れています。書き込み速度も私たちにとって重要ですが、読み取りはより重要です。これらの統計のランクは、できるだけリアルタイムに近いものでなければならず、最適なソリューションはリクエストごとに素早くランク付けされます(新しい行が常に追加されており、できるだけ早くこれらの行のランクを表示したい。)
私たちは現在、縦型テーブルレイアウトがa)より優れているかどうかを評価しています。挿入されている統計は、必ずしも明確に定義されていないので
、それは彼らが、ハード表にコード化されていない場合はここで
(垂直テーブル構造のため、したがって好み。)私たちのために簡単です見ます私たちの現在のテーブル構造とクエリ:
CREATE TABLE Stats
(
Id BIGINT PRIMARY KEY NOT NULL,
UserId INT,
Name VARCHAR(32) NOT NULL,
Value DECIMAL(10,4) DEFAULT ((0)) NOT NULL,
UpdatedAt DATETIME
);
CREATE INDEX Leaderboard__index ON Stats (Name, Value DESC);
SELECT
Id,
Name,
Value,
RANK() OVER (PARTITION BY Name ORDER BY Value DESC) AS Rank
FROM
Stats
ORDER BY
Value DESC
は、一般的に、我々は(リーダーボードのような)任意のstatのトップN行を検索することだろうか、我々は、単一のユーザーIDを選択すると、すべてのランクを取得すると思いますそのUserIdに関連付けられた統計。
データはかなりのサイズです(前述のように、行数が多く、列数が多いため、垂直テーブル構造は2億5,000万行の範囲にあり、成長を続けます)
ハードウェアが必要な場合はできるだけ早くこのデータを取得したいと考えていますが、現在は分単位で秒が目標です。 (それはまた、唯一の10,000行をランク付けするのに約18秒かかりませんでしたけれども。)我々40万行のデータと上記のクエリの上に挿入した垂直のテーブル構造の試験で
は3分弱かかり
私は何か提案を聞いてほしいです。御時間ありがとうございます!
あなたはSQLのバージョンを使用してタグを更新することができますサーバー、また、どのエディションを使用しているか(標準、エンタープライズなど) Ta。 –
上記に基づいて、スコアを持つ「名前」ごとにトップ100ランクのユーザーリストを維持する別のテーブルを作成することをお勧めします。これにより、データサイズは大幅に削減されますが、トップ100以外のユーザーのランキングは許可されません。 – Alex
@Alexトップ10,000行をフェッチすると、サーバーからの往復がわずか数百ミリ秒かかります。トップNテーブルの設計は、私たちのUI設計に基づいています。トップ100を見ることから100,000行を100,000のオフセットで見ることは自明です。 – lwansbrough