- - PR -
SQLの性能
1|2|3|4|5
次のページへ»
投稿者 | 投稿内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2006-07-04 23:31
VS2003のプログラムで実行するクエリがタイムアウトします。
DBはSQL Serverです。 クエリの改善やインデックスの再構築等で性能改善出来るかどうかも調査中ですが、 出来る限りの性能改善を行っても解決しなかった場合、VS2003のっプログラム側のコマンドタイムアウトを延ばす(無制限に)方法はやめた方が良いのでしょうか? | ||||||||
|
投稿日時: 2006-07-04 23:54
やめたほうがいいですけど、いったいどんなクエリを発行しているのですか?
あと、タイムアウトを延ばしたとして、レスポンスタイムは問題にならないのでしょうか? | ||||||||
|
投稿日時: 2006-07-05 00:08
個人的には、そんなに複雑なクエリだとは思っていませんが・・・。 結合の数は多いです(10以上あります)。 サブクエリが2つあります。 ちなみに、抽出元のテーブルには7000件のデータがあり、クエリ内で再帰結合を5つ行っています。 レスポンスタイムはもちろん気にしていますが、VSプログラムで全件表示ではなくページ切り替えするようにする、検索条件なしの検索は不可にするなど、ユーザとの調整が必要になってきます。 | ||||||||
|
投稿日時: 2006-07-05 00:49
7000件なのですか?7000万件ではなくて。 再帰結合というのは、自己結合のことですよね。これが大きな原因なのではないでしょうか。 自己結合を使うか使わないかは大きな分かれ目だと思います。自己結合というのは、たとえて言えば、制約のあるプログラミング言語で無理やりコーディングするのに近い感じがあると考えます。自己結合にする必然性は大きいのでしょうか? -- unibon {B73D0144-CD2A-11DA-8E06-0050DA15BC86} | ||||||||
|
投稿日時: 2006-07-05 01:02
間違っているかも。 やっているのは、以下のような感じの結合です。 SELECT A.column1,B.column2 from TableA A INNER JOIN TableA B ON A.column3 = B.column1
上記のような結合が再帰結合(自己結合)であれば、必要です。 どうしてもやめないといけない場合は、新たにテーブルを作る必要が出てきます。 | ||||||||
|
投稿日時: 2006-07-05 12:40
このような結合を5つもやらなければいけない、というのは異常ですね。
テーブル設計ミスの匂いがプンプンします テーブル設計を変えられないのであれば、まず実行プランを確認してみてはどうでしょうか。 | ||||||||
|
投稿日時: 2006-07-05 13:47
とりあえず、質問の主題のタイムアウトを延ばす事ですが、とりあえず、無制限はやめた方がいいですよね。
なんらかの理由でDBが応答を返さない時に、エラーを表示した方がいいかというのが考えるポイントの一つだとは思います。 ユーザ用アプリであれば、固まったまま戻ってこないのは、仕様としていまいちだと思うので、ちゃんとタイムアウトのエラーをハンドリングしてあげた方がいいと思います。 メンテナンス用など、個人的なアプリであれば、どの程度の時間がたったら遅すぎかというのをアプリの利用者が判断して、強制終了等をできると思うので、いちいち予測時間を計測するよりは、無制限にしちゃった方が楽な場合もあるかと思います。 私は、タイムアウトをわざわざ設定する場合は、その最大予測時間の2〜10倍ぐらいをセットします。 そして、SQLのタイムアウトを自分で設定する場合は、ほとんどはメンテ用プログラムです。 タイムアウトを設定するので最近のは、集計テーブルをなんらかの理由で再生成する場合で、元データも、結果データもでかいので、時間がかかるのは、しゃぁないっす。 同じような処理でも、ユーザに使ってもらう場合は、進捗が分かった方がいいので、たいがいは、SQL を小分けにして、処理をしちゃいます。 #最後にソートがある場合は、しょうがないですけどね、、、 こうすると、どれぐらい終わったかをアプリで把握できるので、進捗をユーザに知らせる事ができます。 そうすると、単一のSQLは、そんなに長くしなくてすみますもんね。 で、実際の実行時間は、たとえ5重結合であっても、例にあるような等価記号による結合で、適切にインデックスが設定されていればそんなに時間がかかる気がしません。 現状、どれぐらい時間がかかっているか分かりませんが、まず適切なインデックスを張るのが第一と思います。 SQLが複雑で、インデックスの検討が複雑であるとか、処理時間に問題がなければタイムアウトの設定で逃げてもいいかと思います。 | ||||||||
|
投稿日時: 2006-07-05 19:58
外しているかも知れませんが、
一般的に集計関数を使用したサブクエリを自己結合した場合に、 クエリのレスポンスが著しく悪化することがあります。 その場合集計結果を一時テーブルに出力して、一時テーブルの結合条件にインデックスを作成し 本体と結合すると大幅にレスポンスが改善すると思います。 [ メッセージ編集済み 編集者: ハニワ祭り 編集日時 2006-07-05 19:59 ] |
1|2|3|4|5
次のページへ»