SQLクエリの速度を向上させる

すぐに予約します。例のクエリはTransact SQLであり、どういうわけか私にとって大切なものです=)

しかし、原則は、一般に、どこでも機能するはずです。

この記事は、完全性を主張するものではありません。 データベースの処理が遅くなる一般的なエラーやクエリの欠点を思い出そうとしました。



検索の結果、記事はこのトピックと部分的に重複していますが、すべてではありません=)







フィールドデータ型



最も明白なのは、マージンのあるデータ型を使用しないことです。 つまり、VarCharタイプの「ICQ」フィールドがある場合、10文字より長くすることは意味がありません。 同様に、いくつかのエントリしかないディレクトリに外部キーがある場合、Intと入力するように設定しても意味がありません。SmallIntで十分です。 エラーの自明性にもかかわらず、それはどこでも見られます。



リクエストで*を使用



一般的に、このトピックについては多くの議論がありましたが、SQLクエリでは「*」を使用しないようにしています。

まず、選択可能なフィールドを明示的にリストすると、コードが読みやすくなります。

第二に、選択ではテーブルのすべてのフィールドが常に必要なわけではありません。 また、クエリで複数のテーブルをリンクする場合、ほとんどの場合、「Select *」コンストラクトは、たとえばテーブルを接続するキーなど、不要なフィールドをデータベースから選択にプルします。 テキストボックスのテーブルにファイル名が保存され、バイナリフィールドにその内容が保存されていた状況に直面しました。 また、ファイルのリストのみを生成することになっていたリクエストは、そのコンテンツもサーバーのメモリにロードしました。 それは不敬にブレーキをかけました。



カーソルを使用する



命令型プログラミング言語に慣れている人々にとって、SQLカーソルは魂の香油のようなものです。 結局のところ、記録サイクルはとても馴染みやすく理解しやすいものです。 このために、時々遅いコードが生まれます。 例:

テーブルがあり、ID、Value1、Value2、Summaの4つのフィールドがあるとします。 タスク:テーブルを再計算します。つまり、Value1 + Value2の値を計算し、Summaフィールドに入力します。

オプション1、カーソル付き:



  1. DECLARE @ID int DECLARE @Val1 int DECLARE @Val2 int DECLARE #curr CURSOR LOCAL FAST_FORWARD READ_ONLY FOR SELECT ID, Value1, Value2 from Table1 OPEN #curr FETCH #curr INTO @ID, @Val1, @Val2 WHILE @@FETCH_Status=0 BEGIN UPDATE Table1 SET Summa=@Val1+@Val2 where ID=@ID FETCH #curr INTO @ID, @Val1, @Val2 END CLOSE #curr DEALLOCATE #curr



  2. DECLARE @ID int DECLARE @Val1 int DECLARE @Val2 int DECLARE #curr CURSOR LOCAL FAST_FORWARD READ_ONLY FOR SELECT ID, Value1, Value2 from Table1 OPEN #curr FETCH #curr INTO @ID, @Val1, @Val2 WHILE @@FETCH_Status=0 BEGIN UPDATE Table1 SET Summa=@Val1+@Val2 where ID=@ID FETCH #curr INTO @ID, @Val1, @Val2 END CLOSE #curr DEALLOCATE #curr



  3. DECLARE @ID int DECLARE @Val1 int DECLARE @Val2 int DECLARE #curr CURSOR LOCAL FAST_FORWARD READ_ONLY FOR SELECT ID, Value1, Value2 from Table1 OPEN #curr FETCH #curr INTO @ID, @Val1, @Val2 WHILE @@FETCH_Status=0 BEGIN UPDATE Table1 SET Summa=@Val1+@Val2 where ID=@ID FETCH #curr INTO @ID, @Val1, @Val2 END CLOSE #curr DEALLOCATE #curr



  4. DECLARE @ID int DECLARE @Val1 int DECLARE @Val2 int DECLARE #curr CURSOR LOCAL FAST_FORWARD READ_ONLY FOR SELECT ID, Value1, Value2 from Table1 OPEN #curr FETCH #curr INTO @ID, @Val1, @Val2 WHILE @@FETCH_Status=0 BEGIN UPDATE Table1 SET Summa=@Val1+@Val2 where ID=@ID FETCH #curr INTO @ID, @Val1, @Val2 END CLOSE #curr DEALLOCATE #curr



  5. DECLARE @ID int DECLARE @Val1 int DECLARE @Val2 int DECLARE #curr CURSOR LOCAL FAST_FORWARD READ_ONLY FOR SELECT ID, Value1, Value2 from Table1 OPEN #curr FETCH #curr INTO @ID, @Val1, @Val2 WHILE @@FETCH_Status=0 BEGIN UPDATE Table1 SET Summa=@Val1+@Val2 where ID=@ID FETCH #curr INTO @ID, @Val1, @Val2 END CLOSE #curr DEALLOCATE #curr



  6. DECLARE @ID int DECLARE @Val1 int DECLARE @Val2 int DECLARE #curr CURSOR LOCAL FAST_FORWARD READ_ONLY FOR SELECT ID, Value1, Value2 from Table1 OPEN #curr FETCH #curr INTO @ID, @Val1, @Val2 WHILE @@FETCH_Status=0 BEGIN UPDATE Table1 SET Summa=@Val1+@Val2 where ID=@ID FETCH #curr INTO @ID, @Val1, @Val2 END CLOSE #curr DEALLOCATE #curr



  7. DECLARE @ID int DECLARE @Val1 int DECLARE @Val2 int DECLARE #curr CURSOR LOCAL FAST_FORWARD READ_ONLY FOR SELECT ID, Value1, Value2 from Table1 OPEN #curr FETCH #curr INTO @ID, @Val1, @Val2 WHILE @@FETCH_Status=0 BEGIN UPDATE Table1 SET Summa=@Val1+@Val2 where ID=@ID FETCH #curr INTO @ID, @Val1, @Val2 END CLOSE #curr DEALLOCATE #curr



  8. DECLARE @ID int DECLARE @Val1 int DECLARE @Val2 int DECLARE #curr CURSOR LOCAL FAST_FORWARD READ_ONLY FOR SELECT ID, Value1, Value2 from Table1 OPEN #curr FETCH #curr INTO @ID, @Val1, @Val2 WHILE @@FETCH_Status=0 BEGIN UPDATE Table1 SET Summa=@Val1+@Val2 where ID=@ID FETCH #curr INTO @ID, @Val1, @Val2 END CLOSE #curr DEALLOCATE #curr



  9. DECLARE @ID int DECLARE @Val1 int DECLARE @Val2 int DECLARE #curr CURSOR LOCAL FAST_FORWARD READ_ONLY FOR SELECT ID, Value1, Value2 from Table1 OPEN #curr FETCH #curr INTO @ID, @Val1, @Val2 WHILE @@FETCH_Status=0 BEGIN UPDATE Table1 SET Summa=@Val1+@Val2 where ID=@ID FETCH #curr INTO @ID, @Val1, @Val2 END CLOSE #curr DEALLOCATE #curr



  10. DECLARE @ID int DECLARE @Val1 int DECLARE @Val2 int DECLARE #curr CURSOR LOCAL FAST_FORWARD READ_ONLY FOR SELECT ID, Value1, Value2 from Table1 OPEN #curr FETCH #curr INTO @ID, @Val1, @Val2 WHILE @@FETCH_Status=0 BEGIN UPDATE Table1 SET Summa=@Val1+@Val2 where ID=@ID FETCH #curr INTO @ID, @Val1, @Val2 END CLOSE #curr DEALLOCATE #curr



  11. DECLARE @ID int DECLARE @Val1 int DECLARE @Val2 int DECLARE #curr CURSOR LOCAL FAST_FORWARD READ_ONLY FOR SELECT ID, Value1, Value2 from Table1 OPEN #curr FETCH #curr INTO @ID, @Val1, @Val2 WHILE @@FETCH_Status=0 BEGIN UPDATE Table1 SET Summa=@Val1+@Val2 where ID=@ID FETCH #curr INTO @ID, @Val1, @Val2 END CLOSE #curr DEALLOCATE #curr







オプション2、カーソルなし:



  1. UPDATE Table1 SET Summa = Value1 + Value2




このような単純な例では、オプション2が明らかであることは明らかです。 しかし、より複雑な計算の場合、実装を容易にするために、プログラマーはカーソルを使用してオプションを選択します-速度が大幅に低下します。



インデックスを使用する



コメントはありません。 インデックスは、特に初心者にとっては常に忘れられています。



ストアドプロシージャの使用



データベースから多くの値を使用する複雑な計算を実行する場合、クライアント側で計算するよりもサーバー上のストアドプロシージャの形式でそれらを配置する方がよい-結果のみを転送できる場合に計算の初期データをクライアントに転送する理由



一時テーブルを使用する



時々、特に計算結果または要約データを操作する場合、複雑なクエリを1回実行して必要なすべてのデータを選択し、その結果を一時テーブルに保存して、毎回複雑で遅いクエリを実行するのではなく、作業を続ける方が簡単かつ迅速です。



おそらく、これが気に入らなかったのはおそらく、記事が誰かに興味を持っているなら、もっと思い出すことができます。



All Articles