web-dev-qa-db-ja.com

SQL Server-複雑なビューをテーブルに変換する-最善の方法

私が構築しているビューは、毎週より複雑で大きなものになっています。それのためのアイデアは、それらのいくつか(会計士-私が言うことができる)によって行われたアドホッククエリを含む、管理のための複数の複数のレポートのソースを持つことでした。私はサーバーの負荷を心配していません-これはそのためだけに使用されているため、深刻なリソースが使用されるまでしばらくかかります。しかし、その上で何かを行うには、ますます時間がかかります。

これは約30%の計算フィールドで、現時点では25個の結合があり、そのうち8個はドロップできますが、いくつかの時点でさらに追加される予定です。 (現時点では)4つの異なるデータベースにまたがっているため、インデックスを作成する方法がないため、パフォーマンスは最高にtortoiseryです。

だから私は予定通りにビューの内容をテーブルにダンプすることを考えています、そして質問は:より良い方法はありますか?そうでない場合、注意すべき障害は何ですか?

編集:データの古さ:前日まで。データ範囲:残念ながら、現在の数は320万です。また、開発フェーズの問題もあります。現在、必要なもの、欲しているもの、望んでいるものを解決しているため、パフォーマンスのチューニングは無意味なATTです。インデックス作成は良いスタートですが、現在このビューではありません。複数のビュー/クエリに分割することは良いように聞こえますが、意味のある意味で実行時間を短縮することはありません(開始点が75分であることがわかるまで、20分下がいいですね)。

私が使用しているデータは、SSISパッケージを介して他のデータベース(およびサーバー)から既にコピーされています。 1つのデータベースにデータを統合するために再加工することは可能かもしれませんが、それは私の管轄ではありません。これには財務コストが含まれる可能性があり、すべての開発作業が完了するまで、管理者によって拒否されます。

物事をかなり高速にスピードアップする必要があることはわかっています。汚れている場合があります。適切な開発よりもクエリの実行を待つ時間が長い場合を除きます。

4
AcePL

ここでの主な問題は、単一のビューを使用して多くの異なるレポートをフィードしようとしているため、ビューの定義が何度も複雑になることです。

すべてのレポートがそのビューのすべての列、計算、およびJOINsを必要とするわけではないため、多くの状況で、理由もなくテーブルにアクセスして計算を実行します。

より賢明なアプローチは、レポートごとに個別の最適化されたクエリを用意し、最小限のテーブルを含めることです。これは大変な作業のように聞こえますが、コードを再利用することは、パフォーマンスをあきらめずにT-SQLで実現することは本当に難しいことです。

つまり、すべてのレポートがほぼ同じデータに基づいている場合は、インデックス付きビューまたはマテリアライズド中間テーブルが実行可能なソリューションになる可能性があります。インデックス付きビューには、一部のコンテキスト(自己結合なし、外部結合なし、UNIONsなしなど)で実用的でないいくつかの制限があり、許容できない書き込みオーバーヘッドが発生する可能性がありますが、正しく使用すると非常に強力です。

18
spaghettidba

したがって、ビューのresultsを定期的にテーブルにダンプするのは簡単です(そして、他にすべてを既に構築している場合は、テストする価値があります)、(フィルターされた)行をプルすることをお勧めします現在複数のデータベースにまたがって単一のデータベースに分散されているsourceテーブルから、それらから新しいビューを構築します。

利点:

  • これらの大きなソーステーブルの列または行を除外したり、データをコピーするときに計算/要約を行ったりできます。
  • 他のシステムに影響を与えることなく、ビュー、クエリ、レポート用に特別に作成された適切なインデックスをステージングテーブルに追加できます。
  • すべてのテーブルが同じデータベースにあるため、インデックス付きビューを作成できます(他の禁止事項は適用されないと想定)
  • データをコピーするときにいくつかの基本的な結合/ルックアップを実行して、最終的なクエリで結合されるテーブルの総数を減らすことができます

短所:

  • カスタムルーチン(おそらくSSISパッケージ)を使用するか、SQLレプリケーションを使用して、これらのソーステーブルをコピーする方法を理解する必要があります。ビジネス要件によっては、これが複雑になる場合があります(たとえば、ソースシステムの変更をレポートに反映する必要があるかどうかなど)。
  • ソーステーブルが非常に大きい場合(およびすべての行が必要な場合)、これは実現できない可能性があります。

実際にspaghettidbaに同意します。異なるレポートの個別のクエリ/ビューを作成すると、多くの利点があります(または、同じソースを使用できる非常に類似したレポートがある場合、少なくとも1つ以上ビュー)-私の推奨事項それと競合しない場合は、ソーステーブルをandにコピーして、個別のクエリ/ビューを作成できます。

5
BradC

彼らが1日前のデータを使用することをいとわない場合は、毎晩更新されるビューのテーブルがオプションです。 320万行はたくさんありますが、非常に広くなければ管理可能です。

トランザクションで

  • テーブルロックをかける
  • テーブルを切り捨てる
  • pK以外のすべてのインデックスを無効にする(クラスター化)
  • データを挿入する
  • インデックスを有効にします(これにより再構築されます)

それでも、現在のデータを必要とし、代償を払う意思がある人には、ビューへのアクセスを許可します。

3
paparazzo

3mの行は、実際に毎日取り込むのはそれほど多くありません。これは、データウェアハウスで1日1回のフィードにすぎません。また、新しい行と変更された行のみの従来のDW抽出では、データウェアハウスに1時間ごとではないにしても、毎日導入することは大きな負荷にはなりません。

また、(次元)データウェアハウススキーマは、データがさまざまな方法で処理される多数のアドホッククエリを実行するのに理想的です。私は間違いなく、データを次元モデルに再構築し、それらの異なるデータソースをデータウェアハウスに持ち込むことを推奨します。すでに別のサーバーからプルしており、データが最終日の時点でのみであるとすでに予想しているため、これはデータウェアハウスを標準化して開始する絶好の機会です。

1
Cade Roux