- PR -

SQLの性能

投稿者投稿内容
NEO
大ベテラン
会議室デビュー日: 2005/10/02
投稿数: 104
投稿日時: 2006-07-04 23:31
VS2003のプログラムで実行するクエリがタイムアウトします。
DBはSQL Serverです。

クエリの改善やインデックスの再構築等で性能改善出来るかどうかも調査中ですが、
出来る限りの性能改善を行っても解決しなかった場合、VS2003のっプログラム側のコマンドタイムアウトを延ばす(無制限に)方法はやめた方が良いのでしょうか?
burton999
ぬし
会議室デビュー日: 2003/10/06
投稿数: 898
お住まい・勤務地: 東京
投稿日時: 2006-07-04 23:54
やめたほうがいいですけど、いったいどんなクエリを発行しているのですか?
あと、タイムアウトを延ばしたとして、レスポンスタイムは問題にならないのでしょうか?
NEO
大ベテラン
会議室デビュー日: 2005/10/02
投稿数: 104
投稿日時: 2006-07-05 00:08
引用:

burton999さんの書き込み (2006-07-04 23:54) より:
やめたほうがいいですけど、いったいどんなクエリを発行しているのですか?
あと、タイムアウトを延ばしたとして、レスポンスタイムは問題にならないのでしょうか?



個人的には、そんなに複雑なクエリだとは思っていませんが・・・。
結合の数は多いです(10以上あります)。
サブクエリが2つあります。
ちなみに、抽出元のテーブルには7000件のデータがあり、クエリ内で再帰結合を5つ行っています。
レスポンスタイムはもちろん気にしていますが、VSプログラムで全件表示ではなくページ切り替えするようにする、検索条件なしの検索は不可にするなど、ユーザとの調整が必要になってきます。
unibon
ぬし
会議室デビュー日: 2002/08/22
投稿数: 1532
お住まい・勤務地: 美人谷        良回答(20pt)
投稿日時: 2006-07-05 00:49
引用:

NEOさんの書き込み (2006-07-05 00:08) より:
ちなみに、抽出元のテーブルには7000件のデータがあり、クエリ内で再帰結合を5つ行っています。


7000件なのですか?7000万件ではなくて。
再帰結合というのは、自己結合のことですよね。これが大きな原因なのではないでしょうか。
自己結合を使うか使わないかは大きな分かれ目だと思います。自己結合というのは、たとえて言えば、制約のあるプログラミング言語で無理やりコーディングするのに近い感じがあると考えます。自己結合にする必然性は大きいのでしょうか?

--
unibon {B73D0144-CD2A-11DA-8E06-0050DA15BC86}
NEO
大ベテラン
会議室デビュー日: 2005/10/02
投稿数: 104
投稿日時: 2006-07-05 01:02
引用:

unibonさんの書き込み (2006-07-05 00:49) より:
再帰結合というのは、自己結合のことですよね。これが大きな原因なのではないでしょうか。



間違っているかも。
やっているのは、以下のような感じの結合です。
SELECT A.column1,B.column2 from TableA A INNER JOIN TableA B ON A.column3 = B.column1

引用:

自己結合にする必然性は大きいのでしょうか?



上記のような結合が再帰結合(自己結合)であれば、必要です。
どうしてもやめないといけない場合は、新たにテーブルを作る必要が出てきます。
uk
ぬし
会議室デビュー日: 2003/05/20
投稿数: 1155
お住まい・勤務地: 東京都
投稿日時: 2006-07-05 12:40
このような結合を5つもやらなければいけない、というのは異常ですね。
テーブル設計ミスの匂いがプンプンします

テーブル設計を変えられないのであれば、まず実行プランを確認してみてはどうでしょうか。
わちゃ
大ベテラン
会議室デビュー日: 2005/12/05
投稿数: 162
お住まい・勤務地: 東京
投稿日時: 2006-07-05 13:47
とりあえず、質問の主題のタイムアウトを延ばす事ですが、とりあえず、無制限はやめた方がいいですよね。


なんらかの理由でDBが応答を返さない時に、エラーを表示した方がいいかというのが考えるポイントの一つだとは思います。

ユーザ用アプリであれば、固まったまま戻ってこないのは、仕様としていまいちだと思うので、ちゃんとタイムアウトのエラーをハンドリングしてあげた方がいいと思います。

メンテナンス用など、個人的なアプリであれば、どの程度の時間がたったら遅すぎかというのをアプリの利用者が判断して、強制終了等をできると思うので、いちいち予測時間を計測するよりは、無制限にしちゃった方が楽な場合もあるかと思います。


私は、タイムアウトをわざわざ設定する場合は、その最大予測時間の2〜10倍ぐらいをセットします。

そして、SQLのタイムアウトを自分で設定する場合は、ほとんどはメンテ用プログラムです。

タイムアウトを設定するので最近のは、集計テーブルをなんらかの理由で再生成する場合で、元データも、結果データもでかいので、時間がかかるのは、しゃぁないっす。


同じような処理でも、ユーザに使ってもらう場合は、進捗が分かった方がいいので、たいがいは、SQL を小分けにして、処理をしちゃいます。
#最後にソートがある場合は、しょうがないですけどね、、、

こうすると、どれぐらい終わったかをアプリで把握できるので、進捗をユーザに知らせる事ができます。

そうすると、単一のSQLは、そんなに長くしなくてすみますもんね。




で、実際の実行時間は、たとえ5重結合であっても、例にあるような等価記号による結合で、適切にインデックスが設定されていればそんなに時間がかかる気がしません。

現状、どれぐらい時間がかかっているか分かりませんが、まず適切なインデックスを張るのが第一と思います。

SQLが複雑で、インデックスの検討が複雑であるとか、処理時間に問題がなければタイムアウトの設定で逃げてもいいかと思います。
ハニワ祭り
大ベテラン
会議室デビュー日: 2005/11/15
投稿数: 115
投稿日時: 2006-07-05 19:58
外しているかも知れませんが、
一般的に集計関数を使用したサブクエリを自己結合した場合に、
クエリのレスポンスが著しく悪化することがあります。
その場合集計結果を一時テーブルに出力して、一時テーブルの結合条件にインデックスを作成し
本体と結合すると大幅にレスポンスが改善すると思います。


[ メッセージ編集済み 編集者: ハニワ祭り 編集日時 2006-07-05 19:59 ]

スキルアップ/キャリアアップ(JOB@IT)