- PR -

処理の重いSQLを発行すると画面が固まってしまう

投稿者投稿内容
saki1208
ベテラン
会議室デビュー日: 2006/08/22
投稿数: 86
投稿日時: 2007-05-31 23:57
saki1208です。

引用:

かつのりさんの書き込み (2007-05-31 23:24) より:
DBにもよると思いますが、この前MySQLでインデックスの貼り忘れをやってしまい、
かなり速度が遅くなりました。(テーブルを20個ぐらい結合する大きめのSQL)

インデックスを貼ると1秒くらいで帰ってくるのが、
インデックスを貼り忘れただけで10分くらい帰ってきませんでした。
チューニング1つだけでこんなに変わることもあるのです。

ハードのせいにするのは簡単ですが、
何故遅いのかを突き詰めれば、大体問題点が分かると思います。
それから対策を立てればよいわけで。
原因が実はソフトだったりすると、ハードを新調しても同じことになりますよ。



確かに。
インデックスの張り忘れなど、パフォーマンスに関する影響が大きなDB定義の
差異があれば、10倍とは言わない違いが出ることもあるでしょうね。

# でも、任せているのでおそらく差異はないのです。
未記入
ぬし
会議室デビュー日: 2004/09/17
投稿数: 667
投稿日時: 2007-06-01 09:37
データベースのチューニングで対応すべきという意見が圧倒的に多いようですが・・・。非同期実行で UI が固まらないようにするというのも重要です。どんなにデータベースをチューニングしてもサーバーが見つからなければ接続タイムアウトまで15〜30秒待たされることもあるでしょう。こういったときに UI が固まるのはみっともないですよ。それに将来的にチューニングできない(スキャンが最速という)クエリが出てくるかもしれない。

SQL 実行などサーバーへ処理を投げるときは、クライアントのボタンを二度押しできないようにする(同期化)とか、画面の再描画を妨げないようにする(非同期化)とか、最低限の作法のように思います。
もしもし
ぬし
会議室デビュー日: 2004/10/15
投稿数: 280
投稿日時: 2007-06-01 10:02
いっこ気になったのですが、

引用:

saki1208さんの書き込み (2007-05-31 23:57) より:

# でも、任せているのでおそらく差異はないのです。




これの意味が今ひとつ。
データベースの作成が誰かにお任せってことであれば、
なおさら要確認ではないかと思います。
索引を付けてくれているつもりだったのに付けてくれて
なかったとか、あるいは資料に書き忘れてて索引が
付いてなかったりとか。

# 索引の所為と決まったわけではないですが。

_________________
もしもし@RMAN 友の会
なちゃ
ぬし
会議室デビュー日: 2003/06/11
投稿数: 872
投稿日時: 2007-06-01 23:33
引用:

未記入さんの書き込み (2007-06-01 09:37) より:
データベースのチューニングで対応すべきという意見が圧倒的に多いようですが・・・。非同期実行で UI が固まらないようにするというのも重要です。どんなにデータベースをチューニングしてもサーバーが見つからなければ接続タイムアウトまで15〜30秒待たされることもあるでしょう。こういったときに UI が固まるのはみっともないですよ。それに将来的にチューニングできない(スキャンが最速という)クエリが出てくるかもしれない。

SQL 実行などサーバーへ処理を投げるときは、クライアントのボタンを二度押しできないようにする(同期化)とか、画面の再描画を妨げないようにする(非同期化)とか、最低限の作法のように思います。


同意。
DBのチューニングがいらないといってるわけではなくて、
どっちも重要だと思います。
saki1208
ベテラン
会議室デビュー日: 2006/08/22
投稿数: 86
投稿日時: 2007-06-02 23:50
saki1208です。

引用:

もしもしさんの書き込み (2007-06-01 10:02) より:
いっこ気になったのですが、

引用:

saki1208さんの書き込み (2007-05-31 23:57) より:

# でも、任せているのでおそらく差異はないのです。




これの意味が今ひとつ。
データベースの作成が誰かにお任せってことであれば、
なおさら要確認ではないかと思います。




そんなに深く考えないでください。
「チューニング〜」の会話の中で、「任せている部署もおそらくやっていない」
というレスがあったので、ちょっと皮肉を言ってみただけです。

もしもしさんのおっしゃる通り、他人に任せているからこそ、想定外の事象が発
生しているのであればより積極的に違いを把握するべきです。
# DB定義に差異がないか、初期化パラメータの設定に違いがないか等々...
# スペックの高いマシンと低いマシンで同じ設定であれば、後者では悪影響が出
# る場合も多々あります。

バッファキャッシュ等の設定では、同じ設定でもメモリ搭載量の多いマシンでは
パフォーマンス的に良い方向に向かいますが、メモリ搭載量の少ないマシンでは
逆効果となり、パフォーマンスに悪影響を及ぼすこともあります。
# 私の最初のレスと次のレスではそのことを示唆したつもりだったのですが...
# ご理解いただけなかったようで...
saki1208
ベテラン
会議室デビュー日: 2006/08/22
投稿数: 86
投稿日時: 2007-06-03 00:05
saki1208です。

引用:

未記入さんの書き込み (2007-06-01 09:37) より:
データベースのチューニングで対応すべきという意見が圧倒的に多いようですが・・・。非同期実行で UI が固まらないようにするというのも重要です。どんなにデータベースをチューニングしてもサーバーが見つからなければ接続タイムアウトまで15〜30秒待たされることもあるでしょう。こういったときに UI が固まるのはみっともないですよ。それに将来的にチューニングできない(スキャンが最速という)クエリが出てくるかもしれない。

SQL 実行などサーバーへ処理を投げるときは、クライアントのボタンを二度押しできないようにする(同期化)とか、画面の再描画を妨げないようにする(非同期化)とか、最低限の作法のように思います。




チューニングがすべてではないというご意見はごもっともです。
しかし、チューニングを行うためには、現在のボトルネックとなっている箇所を調査したり、設定内容の確認をしたりといったことを行う訳で、本当の原因がつかめると思わ
れます。

# 本当は変更する必要のないプログラム変更を行い、デグレードなどによる致命的な損
# 失の責任を負わされる可能性もあります。

プログラムの変更で対応を行うのは簡単です。(変更内容が簡単ということではありま
せん)
でも、障害の本質を見極めてどのように対応するべきかを判断する必要があるのでは
ないでしょうか?
# ケース バイ ケースですが...
# たとえば、プロパティの設定を一か所変更するだけで済むとか、明らかに簡単な処
# 理を追加する程度の変更であれば、調査に時間をかけることの方が無駄になる場合
# もあるでしょう。
ハニワ祭り
大ベテラン
会議室デビュー日: 2005/11/15
投稿数: 115
投稿日時: 2007-06-03 01:51
とりあえずアナライズしとけ。
未記入
会議室デビュー日: 2007/06/05
投稿数: 5
投稿日時: 2007-06-05 14:51
引用:

ぼのぼのさんの書き込み (2007-05-31 20:31) より:

コード:
    Private Sub HeavyRoutineCallback(ByVal ar As IAsyncResult)
        Dim obj As Object = delegateInstance.EndInvoke(ar)
        If TypeOf obj Is Exception Then
            Dim ex As Exception = CType(obj, Exception)
            MsgBox(ex.ToString(), MsgBoxStyle.Critical)
        End If
        Me.Enabled = True
    End Sub


ただし、私もマルチスレッドに関してはほぼ初心者ですし、このコードも完璧かって言われるとぜんぜん自信ないし、



自分で初心者だっていってるんだから、間違いに気づいたやつ教えてやれよ

コード:
    Private Sub HeavyRoutineCallback(ByVal ar As IAsyncResult)
        If Me.InvokeRequired Then
            Me.BeginInvoke(New AsyncCallback(AddressOf HeavyRoutineCallback), New Object() {ar})
            Exit Sub
        End If
        Dim obj As Object = delegateInstance.EndInvoke(ar)
        If TypeOf obj Is Exception Then
            Dim ex As Exception = CType(obj, Exception)
            MsgBox(ex.ToString(), MsgBoxStyle.Critical)
        End If
        Me.Enabled = True
    End Sub



AsyncCallbackはどのスレッドで呼ばれるかわからない。FormでスレッドセーフなメンバはInvoke、BeginInvoke、EndInvoke、CreateGraphicsのみ。

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