2009-08-14 7 views
1

学術会議の情報を整理するのに役立つこのデータベースがありますが、アイテムが「不完全」かどうかを時々知る必要があります。不完全なものの背後にあるルールは少し複雑です私は、項目が完全であれば真を返し、そうでなければ0を返すスカラー関数にそれらを作りました。関数によるSQLの効率

私が遭遇する問題は、データの大きなテーブルで関数を呼び出すと、結果を返すのに約1分かかります。これにより、Webサイトのタイムアウトが発生しています。

私は機能について多くのことができるとは思わない。しかし、私は、誰かがこの種の状況に一般的な技術を知っているかどうか疑問に思っていました。あなたがたまに何かを実行する必要があるような大きな機能を持っているときはどうしますか?私は実際に関数の結果を格納し、それを毎回更新してもらえますか?レコードを更新する場合は、それを保存するための効率的な方法がありますか?私はそれをトリガーや何かにすることができると思っていましたが、誰かが大きなアップデートを実行した場合、それは永遠にかかるでしょう。

おかげで、

マイク

+0

ありがとうございました...固定列を追加して定期的に更新するつもりです。私はウェブサイトを通してリフレッシュ手順を実行する方法を作るかもしれません。私は機能について多くのことができるとは思わない。ほんの一トンのルールがあります。それらはすべて愚かで小さなルールですが、多くのテーブルにヒットし、それぞれをチェックする必要があります。たとえば、親アイテム(パネル)にいくつの子アイテム(論文)があるかをチェックする必要があります。そして、それをいくつの子供たちがそのタイプのパネルに載せるべきかを示す値と比較します。とにかく - 助けてくれてありがとう。 – Mike

答えて

0

機能が効率的でない場合は、古くなったデータや遅い結果を処理する必要があります。

@cmsjrのように、パフォーマンスについてもっと気にしているようですが、テーブルにデータを追加してください。

また、定期的に結果を更新するcronジョブを作成します。おそらくupdatedカラムをデータベーステーブルに追加すると、cronジョブはそれらの行だけを再処理する必要があります。

さらにもう1つ、機能はどれくらい複雑ですか?関数をSQLから取り出して、おそらくデータベースレイヤーの上にレイヤーを作成することで、関数の実行時間を短縮できますか?

1

機能は、あなたのパフォーマンスを向上させる可能性がある、計算列としてそれを追加し、その上にインデックス可能性が決定的である場合。

MSDN documentation。

1

問題は、関数が個々のレコードを調べ、 "この列がnullの場合"または "その列が0より大きい場合"などのロジックを持つことです。このロジックは、基本的にクエリオプティマイザのブラックボックスです。使用できるフィールドにインデックスがあるかもしれませんが、それについて知る方法はありません。機能の問題の基準を使用して結果セットを分割するのではなく、利用可能なすべてのレコードでこのロジックを実行する必要があります。データベース用語では、UDFはsargableではないと言います。

したがって、不完全な会議のロジックを構造に組み込んで、クエリの最適化者が条件をインデックスなどに照合することができるようにすることができます。私の頭の上から離れて、これを行うためのオプションには、ビューまたは計算カラムが含まれます。

0

SQL Server 2000で少なくとも1つの関数がひどく実行され、そのロジックを外してクエリに入れてしまうと、処理が非常に高速になるケースがありました。これは端の場合ですが、関数がうまくいると思うなら、それを試すことができます。さもなければ、私は列を計算し、他の人が示唆しているようにそれを保存することを考えます。

0

あなたの機能を調整できないことを確実にしないでください。

通常、完全性チェックでは、レコードが実際に完了した最悪の時です。それ以外の場合は、早期に中止することができます。そのため、最初に計算するケースをテストするか、レコードに不完全なフラグを付ける可能性が最も高いケースをテストします。

一括更新の場合は、座って待つか、最初に速いチェックでは不完全なものを実行し、その後はバックグラウンドでより完全なチェックを行うことができます。

1

SQL ServerのスカラーUDFは、現在のところ非常に機能しません。私は慎重に計画された最後の手段としてそれらを使用します。おそらく他のテクニック(深く入れ子にされたビューやすべてのルールを構築して再結合されたインラインTVFなど)を使用して問題を解決する方法がありますが、要件を見ずには分かりにくいです。

0

Cade RouxはScalar functions are evilと言っているので、それらは各行ごとに解釈されます。その結果、パフォーマンスに関して大きな問題があります。可能であれば、テーブル値の関数または計算カラムを使用してください。

関連する問題