2012-01-12 30 views
6

私は基本的にデータベース(Microsoft SQL Server 2008)からデータを抽出することに関するビジネス用の課題を持っています。このプロセスでは、ユーザーは選択する列を選択し、選択するビューを選択してWHERE句を作成することができます。ユーザーが選択した内容に基づいて、SQLクエリーが作成されます。要件は、ユーザーがANYビューからANY列を選択し、WHERE節のANY列でフィルターすることです。同社はデータウェアハウス/ OLAPを使用するソリューションを望んでおらず、サードパーティのソフトウェアを制限したいと考えています。だから基本的には、GUIに基づいてSQLクエリを動的に構築し、データベースに接続する.NET Windowsフォームアプリケーションがほしいだけです。動的クエリの最適化

私の関心事は、クエリを最適化する方法です。私はまだSQLクエリを最適化することは決してできませんが、最初の考えは、ユーザーがインデックスのない列(WHERE句内)でフィルタリングすることを選択した場合です。ユーザーに非常に高い柔軟性を与えることで、実行に時間がかかるような効果のないクエリを構築する可能性があります。

インデックスを持たない列にフィルタをかけるとパフォーマンスが向上することはありませんが、改善するために何かできることはありますか?確かに、私はすべての列にインデックスを追加するだけではありません。

私は必ずしもクエリの最適化を探しているわけではありませんが、キャッシングなどのサーバーの調整がある場合は、私も考えていますか?基本的に私はすべての耳で、パフォーマンスを改善する助けとなるアドバイスを探しています。

提案がありますか?

ありがとうございます!

+1

これは、列ストア索引が役立つはずのシナリオの1つです(次のバージョンまでは使用できません)。あなたはDWを使用しないことによって何を意味するか分かりません。これは同時データ変更の対象となるOLTPデータベースを照会しているため、索引を追加するのが嫌ですか? –

+0

はい、多くの場合、データベースは他の多くのものに使用されるOLTPデータベースではありません。したがって、多くのインデックスを追加すると、挿入/更新が大幅に遅くなります。 – Andy0708

+1

明らかなハードウェアのアップグレードを除けば、その仕様に基づいてできることはたくさんあります。パフォーマンスはおそらく吸うでしょう。なぜ彼らはこれに対してOLAP/DWを割り引いたのですか? –

答えて

4

あなたは実際に何をしようとしているのかを知る以外には、本当に多くはできません。あなたは、SQL Serverオプティマイザがあなたのために大変な努力をしてくれるのが良い立場にあります(これをキーバリューストアで構築することを想像してください)。

フィルタリングまたは並べ替える最も可能性の高い列にインデックスを作成します。これらの索引を非NULL値にフィルター処理して、ストレージ・コストを削減してください(ユーザーがNULL値をフィルターに掛けないと仮定して)。

また、インデックス付きビューを使用して一般的な結合および集計を事前計算することもできます。あなたがこの問題で狂った量のRAMを捨てて、書き込みが遅くなっても構わないのであれば、このデータベースから抜け出して実体化することができます。

最後に、読み取り専用のログ配布ターゲットなどでユーザーのクエリをオフロードできます。これは彼らの恐ろしい質問をサンドボックスします。

クエリでは、それらを分割する必要がありますが、すべての場合にキャッシュする必要はありません。クエリに大きなコストがかかる(コンパイル時間が重要ではない)場合は、SQL Serverがすべてのパラメータの正確なランタイム値に適応できるように、それらをOPTION RECOMPILEで実行する必要があります。

また、すべてのクエリを監視してパターンを確認する必要があります。あなたのユーザーは常に非常によく似たクエリを実行する可能性があります。それらのインデックス。

sp_updatestatsを定期的に実行します。

最後に、これは非常に効果的な解決策ではないと言いたいと思います.SQL Serverがあれば誰もが利益を得ることができるようにそれらを実装するからです。

1

まず、クエリ/文

  • を、最適化し、キャッシュとコンパイルするためのSQL Serverの能力を向上させるために必ずUIがINサポートしてくださいBETWEENせ、ユーザーがWHERE句、独自に構築しながら。
  • インデックス付きの列が最初になるようにAND条件またはOR条件をソートし、その後に他の列をアルファベット順に並べ替えます。
    • あなたのWHERE句でネストされた論理積と論理和、これは
  • 使用*パラメータ化クエリより難しいかもしれない」
WHERE C1 = 'foo' AND C3 = 'bar' AND C2 = 42 
-- if C3 is an indexed column then 
WHERE C3 = @parm1 AND C1 = @parm2 AND C2 = @parm3 

セカンドを許可している場合、ユーザーに権限を与えるために

  • ユーザーが選択できる列をリストするときは、最初に索引付けされた列をリストするか、推奨列を使用するようにします。
  • ユーザーが選択する列とそのクエリが完了するまでの時間を記録します。この情報があれば、将来のデータベースのチューニングやユーザーエクスペリエンスの向上に役立ちます。

EDIT OR - > ANDまたはORマーティン・スミスさんのコメントに関して、これは短絡と呼ばれています。

AがFalseの場合、Aが実際にTrueの場合この場合

A = True AND B = True AND C = True 

真であることが条件のためにBまたはCを評価する必要はありませんありませんあり

A = True OR B = True OR C = True 

ロジックを考えてみましょう条件が偽であるためにBまたはCを回避する必要があります。

+0

インデックスの列が最初になるように、「または」条件を並べ替えることはできません。 –

+0

@Martin Smith - SQL Serverがブール式を短絡するという印象を受けました。あなたのコメントはグリーブのようなものなので、詳しいことができれば助けになるだろう。順序付けとパラメータ化のもう1つのポイントは、異なるパラメータを持つ同じ列を使用するクエリが再利用のためにキャッシュされることです。 –

+1

@LastCoder - [SQL Serverは短絡していません](http://stackoverflow.com/questions/381224/sql-server-query-short-circuiting) –