- PR -

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

投稿者投稿内容
saki1208
ベテラン
会議室デビュー日: 2006/08/22
投稿数: 86
投稿日時: 2007-05-29 22:43

saki1208です。

サーバのスペックが低い(メモリ搭載量が少ない)にもかかわらず、まったく同じにチューニングして、スワップが発生してるとか...
ちゃっぴ
ぬし
会議室デビュー日: 2004/12/10
投稿数: 873
投稿日時: 2007-05-30 00:04
Background で実行させて意味の無い progress bar を表示させる。
何回転もするやつ(笑)。

失礼しました。m(__)m
_________________
走り幅跳び
常連さん
会議室デビュー日: 2007/02/27
投稿数: 36
投稿日時: 2007-05-30 17:10
BackgroundWorkerは現在の開発環境だと使えないのです・・・。
便利そうだとは思ったのですが。

チューニングはやっていません。
サーバー管理に関しては導入部門に任せてあるので触っていません。
ほんとはその辺りも入ってやっていかないといけないんでしょうね。

アドバイスありがとうございました。
saki1208
ベテラン
会議室デビュー日: 2006/08/22
投稿数: 86
投稿日時: 2007-05-30 19:01
saki1208です。

えぇっと...
言葉が足りてなかったようですね。

DBサーバのチューニングのことについて言及したのは、なごやさんが
チューニングを実施したかしていないかではなく、任せてある導入部
門がチューニングをしていませんか? ってことです。

あなた自身がチューニングを行っていなくても、他人がチューニング
を行っていれば、「チューニングしている」ってことですよね。

# スペックの高いサーバと同じ設定をスペックの低いサーバで実施す
# れば、逆効果となる場合もあるということです。

# たとえ、チューニングという名目で行った設定ではなくても...


ちなみに、スペックの高いサーバでは、どの程度のレスポンスかって
どこかに書いてましたっけ?

[ メッセージ編集済み 編集者: saki1208 編集日時 2007-05-30 19:02 ]
走り幅跳び
常連さん
会議室デビュー日: 2007/02/27
投稿数: 36
投稿日時: 2007-05-31 19:01
任せてある導入部門はおそらくチューニングしていません。

あと、スペックの高いサーバーを持つ他の部門では、
2,3秒で処理が終わります。
今回導入したところは10倍以上の処理速度がかかってます。
今回は、導入部門にサーバー更新までのあと半年我慢してもらうことにします。
ぼのぼの
ぬし
会議室デビュー日: 2004/09/16
投稿数: 544
投稿日時: 2007-05-31 20:31
引用:

なごやさんの書き込み (2007-05-30 17:10) より:
BackgroundWorkerは現在の開発環境だと使えないのです・・・。
便利そうだとは思ったのですが。


ひょっとして.NET Framework1.1だからですかね?

BackgroundWorkerほど簡単ではありませんが、マルチスレッドって扱ったことなかったので、
勉強がてらこのページを参考に簡単なサンプルを作ってみました。

VB.NETですが…
コード:
Imports System.Threading

Public Class Form1
    Inherits System.Windows.Forms.Form

    Delegate Function HeavyRoutineDelegate(ByVal sleepSecond As String) As Object

    Private delegateInstance As HeavyRoutineDelegate

    Private Sub Button1_Click( _
    ByVal sender As System.Object, ByVal e As System.EventArgs) _
    Handles Button1.Click
        delegateInstance = New HeavyRoutineDelegate(AddressOf Class1.HeavyRoutine)
        delegateInstance.BeginInvoke(Me.TextBox1.Text, _
            New AsyncCallback(AddressOf HeavyRoutineCallback), Nothing)
        Me.Enabled = False
    End Sub

    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

End Class

Public Class Class1
    '例外テストのためにわざと引数をString型にしている
    Public Shared Function HeavyRoutine(ByVal sleepSecond As String) As Object
        Try
            System.Threading.Thread.Sleep(CInt(sleepSecond) * 1000)
            Return Nothing
        Catch ex As Exception
            '別スレッドなので例外は確実にキャッチ
            Return ex
        End Try
    End Function
End Class


ただし、私もマルチスレッドに関してはほぼ初心者ですし、このコードも完璧かって言われるとぜんぜん自信ないし、
このページにも書いてあるように、処理のマルチスレッド化はそれなりのリスクも伴うので、
遅い1部門のためだけに現在正常に動いているプログラムに手を加えるよりは、
サーバが改善されるまで我慢してもらう方がいいと思います。
saki1208
ベテラン
会議室デビュー日: 2006/08/22
投稿数: 86
投稿日時: 2007-05-31 23:09
saki1208です。

引用:

なごやさんの書き込み (2007-05-31 19:01) より:
任せてある導入部門はおそらくチューニングしていません。

あと、スペックの高いサーバーを持つ他の部門では、
2,3秒で処理が終わります。
今回導入したところは10倍以上の処理速度がかかってます。
今回は、導入部門にサーバー更新までのあと半年我慢してもらうことにします。




ご理解いただけなかったようで... 残念です。

どんなにスペックが違おうと、標準の設定では多分10倍の差は出ないような...
スペックの低いサーバは、そんなに古いサーバでしょうか?
# 10倍もの差が出るとは...

ぼのぼのさんのおっしゃる様に、基本的にはプログラムのせいではないので
プログラムによる対応は行わない方がよいでしょう。
# しかし、10倍もの差は必ず不満としてあなたに跳ね返ってくるでしょう。
# 今現在は納得してくれるかもしれませんけどね。
かつのり
ぬし
会議室デビュー日: 2004/03/18
投稿数: 2015
お住まい・勤務地: 札幌
投稿日時: 2007-05-31 23:24
DBにもよると思いますが、この前MySQLでインデックスの貼り忘れをやってしまい、
かなり速度が遅くなりました。(テーブルを20個ぐらい結合する大きめのSQL)

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

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

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