しかし、原則は、一般に、どこでも機能するはずです。
この記事は、完全性を主張するものではありません。 データベースの処理が遅くなる一般的なエラーやクエリの欠点を思い出そうとしました。
検索の結果、記事はこのトピックと部分的に重複していますが、すべてではありません=)
フィールドデータ型
最も明白なのは、マージンのあるデータ型を使用しないことです。 つまり、VarCharタイプの「ICQ」フィールドがある場合、10文字より長くすることは意味がありません。 同様に、いくつかのエントリしかないディレクトリに外部キーがある場合、Intと入力するように設定しても意味がありません。SmallIntで十分です。 エラーの自明性にもかかわらず、それはどこでも見られます。
リクエストで*を使用
一般的に、このトピックについては多くの議論がありましたが、SQLクエリでは「*」を使用しないようにしています。
まず、選択可能なフィールドを明示的にリストすると、コードが読みやすくなります。
第二に、選択ではテーブルのすべてのフィールドが常に必要なわけではありません。 また、クエリで複数のテーブルをリンクする場合、ほとんどの場合、「Select *」コンストラクトは、たとえばテーブルを接続するキーなど、不要なフィールドをデータベースから選択にプルします。 テキストボックスのテーブルにファイル名が保存され、バイナリフィールドにその内容が保存されていた状況に直面しました。 また、ファイルのリストのみを生成することになっていたリクエストは、そのコンテンツもサーバーのメモリにロードしました。 それは不敬にブレーキをかけました。
カーソルを使用する
命令型プログラミング言語に慣れている人々にとって、SQLカーソルは魂の香油のようなものです。 結局のところ、記録サイクルはとても馴染みやすく理解しやすいものです。 このために、時々遅いコードが生まれます。 例:
テーブルがあり、ID、Value1、Value2、Summaの4つのフィールドがあるとします。 タスク:テーブルを再計算します。つまり、Value1 + Value2の値を計算し、Summaフィールドに入力します。
オプション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
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
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
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
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
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
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
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
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
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
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、カーソルなし:
- UPDATE Table1 SET Summa = Value1 + Value2
このような単純な例では、オプション2が明らかであることは明らかです。 しかし、より複雑な計算の場合、実装を容易にするために、プログラマーはカーソルを使用してオプションを選択します-速度が大幅に低下します。
インデックスを使用する
コメントはありません。 インデックスは、特に初心者にとっては常に忘れられています。
ストアドプロシージャの使用
データベースから多くの値を使用する複雑な計算を実行する場合、クライアント側で計算するよりもサーバー上のストアドプロシージャの形式でそれらを配置する方がよい-結果のみを転送できる場合に計算の初期データをクライアントに転送する理由
一時テーブルを使用する
時々、特に計算結果または要約データを操作する場合、複雑なクエリを1回実行して必要なすべてのデータを選択し、その結果を一時テーブルに保存して、毎回複雑で遅いクエリを実行するのではなく、作業を続ける方が簡単かつ迅速です。
おそらく、これが気に入らなかったのはおそらく、記事が誰かに興味を持っているなら、もっと思い出すことができます。