2012-02-21 8 views
0

データウィンドウ(MS SQL 2000データベース)を更新して、他のすべてのテーブルの情報へのアクセスレベルを制御する新しいテーブルを追加しました。あまり細かく説明することなく、新しいテーブルにはユーザーIDと、アクセス可能なアカウントIDのリストがあります。 DataWarehouse内のすべてのテーブルに対応するビューが作成されており、ユーザーにこれらのビューを使用してデータにアクセスするよう依頼しているため、最初のAccess Controlテーブルのアクセスレベルに基づいてビューが制限されます。ユニークでないキーテーブルのMS SQLデータウェアハウスのパフォーマンスの改善

これらのビューの多くを使用する複雑なクエリでは、明らかに同じアクセス制御テーブルが何度も結合されるという問題があります。このリソースへのアクセスを制御していないクエリが多いため、現時点ではこれについて多くのことを行うことはできません。したがって、アクセス速度を最適化するためにボックス自体を変更する必要があります。

Datawarehouseは一晩だけ更新されます。正直なところ、この時間は無関係です。挿入速度は必要ありません。選択するだけです。必要があれば、インデックスを再構築することもできます。

この非一意レコード(UserID列)に索引を付けているにもかかわらず、実行計画トレースを実行すると、Index Seekの代わりにTable Scansが使用されていることがわかります。インデックス。これは恐ろしいパフォーマンスの影響をもたらしています。先週の実行には1分、実行には10分、もう1時間は1時間というクエリがありました。

このテーブルを参照する他のすべてのビューは、インデックスされていない列(アカウントID)に結合され、次に返されるアカウント数はユーザーのNT IDに基づいて除外されます。

パフォーマンスを向上させるために私たちができることについてお聞かせください。短期間(インフラストラクチャ側で変更可能なもの)、または長期間(データベーススキーマの変更など)は、データベースの使用方法の性質を考慮しても簡単に行うことはできません。

ありがとうございます!

デビッド

答えて

0

あなたは次のように動作する店舗の手順をユーザーに提供する必要がありますすることができた場合:(合流せず)

  1. は「古いやり方」
  2. フィルタを一時テーブルを作成しますユーザーが閲覧を許可した結果は

となりますので、関連するデータにのみ参加します。

これにより、クエリー時間が大幅に短縮されます(dbのサイズと関連データの量の比によって決まります)。dbスキームを変更する必要はありません。

0

UserIdではインデックスがあり、実際にはジョインで使用されるAccountIdはないようです。 /クラスタ化されたパフォーマンスに優れた影響を与えているかを確認するために、非クラスタ化と実験 -

  • がたAccountIdにインデックスを追加します。私が正しくあなたのインデックスを理解している場合

    は、あなたは物事のカップルを試してみてください。

  • AccountIdをインクルードするためにUserIdインデックスを更新する - 2つのフィールドが常に一緒に使用されていると、よりうまくいく可能性があります。

また、実行計画を検討するときに、シークの詳細を見てみましょう。何を求めていますか?これにより、システムの理想的なインデックスをさらに細分化するのに役立ちます。

Good Luck!あなたが使用しているものレポーティングツール

0

残念ながら、あなたが言及していない(?私は、ユーザーが独自のクエリを記述という印象を持っている)、またはあなたが持っているデータのどのボリュームが、二つの長期的な機能強化は次のようになります。

  1. SQL2008へのアップグレード:ユーザレベルのデータの可視性のためのサポートが含まれSSRS、ビジネス・オブジェクトまたはCognosのようなレポートツールを使用して、SQL2000はサポートされなくなりましたし、パフォーマンス、ツール、および一般的な機能は、すべての新しいバージョン
  2. で大幅に改善しています、パフォーマンスのためのキャッシングなど
関連する問題