C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[7]: Set CreateDynaset でレスポンス遅延が発生


(過去ログ 86 を表示中)

[トピック内 8 記事 (1 - 8 表示)]  << 0 >>

■51431 / inTopicNo.1)  Set CreateDynaset でレスポンス遅延が発生
  
□投稿者/ VB533151 (9回)-(2010/07/05(Mon) 18:44:11)

分類:[VB6 以前] 

お世話になります。

VB6のプログラムで、以下の通り CreateDynaset を実行しているのですが
DBに対して更新処理を実行した後の検索処理で、レスポンス遅延が発生しています。
更新をしなければ、遅延は発生しません。

現状は、Set CreateDynasetで遅延が発生している事しか判明しておりません。
何か良い原因調査方法はありませんでしょうか?
******************************************************
Private oORADB As OraDatabase
Set CreateDynaset = oORADB.CreateDynaset(SQL, &H4&)
******************************************************
引用返信 編集キー/
■51432 / inTopicNo.2)  Re[1]: Set CreateDynaset でレスポンス遅延が発生
□投稿者/ すなふきぬ (7回)-(2010/07/05(Mon) 18:58:11)
No51431 (VB533151 さん) に返信
> VB6のプログラムで、以下の通り CreateDynaset を実行しているのですが
> DBに対して更新処理を実行した後の検索処理で、レスポンス遅延が発生しています。

もう少し環境を書くのが良いかと。

DBの種類(OraだからOracleだろうけど8とか9iとか)、どのくらい遅延しているのか、データ量、トランザクションの有無、他のテーブルでも同様に遅延するor特定のテーブルのみか等。

レスポンスの調整は、ボトルネックの切り分けが重要なので、まずは問題を限定してきましょ。


引用返信 編集キー/
■51433 / inTopicNo.3)  Re[2]: Set CreateDynaset でレスポンス遅延が発生
□投稿者/ VB533151 (10回)-(2010/07/05(Mon) 19:25:10)
No51432 (すなふきぬ さん) に返信

申し訳ありません。

DBは、Oracle 10gです。
画面プログラムで、2テーブルを検索、もしくは更新しています。

遅延なしのパターンは、更新をしないパターンです。
例)検索→検索→検索

遅延するパターンは、更新を含むパターンです。
例)検索→更新→検索 検索→検索→更新→検索

どのくらい遅延しているのかというと、三倍近く遅延しています。
また当現象は、この画面でのみ発生している現象です。

引用返信 編集キー/
■51438 / inTopicNo.4)  Re[3]: Set CreateDynaset でレスポンス遅延が発生
□投稿者/ すなふきぬ (8回)-(2010/07/05(Mon) 23:07:00)
No51433 (VB533151 さん) に返信
> ■No51432 (すなふきぬ さん) に返信
> 遅延なしのパターンは、更新をしないパターンです。
> 例)検索→検索→検索
>
> 遅延するパターンは、更新を含むパターンです。
> 例)検索→更新→検索 検索→検索→更新→検索

すっかり見落としてました。

> Set CreateDynaset = oORADB.CreateDynaset(SQL, &H4&)

&H4&は、ORADYN_READONLYなので、更新を含む場合は別の定数に変更した方がいいかも。
引用返信 編集キー/
■51448 / inTopicNo.5)  Re[4]: Set CreateDynaset でレスポンス遅延が発生
□投稿者/ VB533151 (12回)-(2010/07/06(Tue) 14:29:51)
No51438 (すなふきぬ さん) に返信

更新と参照が混じっていますので、
現状は、前処理として定数を入れ替えています。

If IsMissing(LValue) Then
LOption = ORADYN_READONLY
Else
LOption = LValue
End If

Set CreateDynaset = oORADB.CreateDynaset(SQL, LOption)

引用返信 編集キー/
■51450 / inTopicNo.6)  Re[5]: Set CreateDynaset でレスポンス遅延が発生
□投稿者/ すなふきぬ (9回)-(2010/07/06(Tue) 18:00:04)
No51448 (VB533151 さん) に返信
> ■No51438 (すなふきぬ さん) に返信
>
> 更新と参照が混じっていますので、
> 現状は、前処理として定数を入れ替えています。
>
> If IsMissing(LValue) Then

関数定義がないのでなんとも言えませんが、LValueはVariant型ですよね?
プレフィックスがLなのでちょっと気になってます。
(たしかVB6のIsMissing()はVariant型でないと判断できなかったような記憶があるので)

更新が遅い場合は、インデックス等を疑ってみるのも良いと思います。
データ数がわからないのでなんとも言えませんが、単純にsqlplus等でデータを挿入した場合も遅いでしょうか?

> どのくらい遅延しているのかというと、三倍近く遅延しています。
> また当現象は、この画面でのみ発生している現象です。

この画面のみと言うことですが、同じような画面があるのであれば、その画面と差分を調べるのが早いかもしれません。
更新と参照を交互にされているみたいですが、OraDynasetの解放(set CreateDynaset = Nothing)とかはされていますか?
引用返信 編集キー/
■51453 / inTopicNo.7)  Re[6]: Set CreateDynaset でレスポンス遅延が発生
□投稿者/ VB533151 (14回)-(2010/07/06(Tue) 21:26:48)
No51450 (すなふきぬ さん) に返信
> 関数定義がないのでなんとも言えませんが、LValueはVariant型ですよね?
> プレフィックスがLなのでちょっと気になってます。
> (たしかVB6のIsMissing()はVariant型でないと判断できなかったような記憶があるので)

申し訳ありません、転記に誤りがありました。

Public Function CreateDynaset(Optional ByVal vSQLString As Variant, Optional LOptionValue As Long) As OraDynaset

Dim LOption As Long

RetCount = -1
SQLErrMsg = ""

Set CreateDynaset = Nothing

If IsMissing(vSQLString) Then
If SQL = "" Then
MsgBox "設定されていません", _
vbSystemModal + vbCritical, "CDBHandle Class Error"
Exit Function
End If
Else
SQL = vSQLString
End If

If IsMissing(LOptionValue) Then
LOption = ORADYN_READONLY
Else
LOption = LOptionValue
End If

On Error GoTo ErrorHandler
Set CreateDynaset = oORADB.CreateDynaset(SQL, LOption)
RetCount = CreateDynaset.RecordCount

Exit Function

ErrorHandler:
SQLErrCode = oORADB.LastServerErr
Err.Raise SQLErrCode, "clsDbHandler::CreateDynaset", SQLErrMsg
End Function

> 更新が遅い場合は、インデックス等を疑ってみるのも良いと思います。
> データ数がわからないのでなんとも言えませんが、単純にsqlplus等でデータを挿入した場合も遅いでしょうか?

更新前の検索と更新後の検索では同じsqlを実行しています。

> この画面のみと言うことですが、同じような画面があるのであれば、その画面と差分を調べるのが早いかもしれません。
> 更新と参照を交互にされているみたいですが、OraDynasetの解放(set CreateDynaset = Nothing)とかはされていますか?

確かに解放されていないかも知れません。

Set CreateDynaset = Nothing
On Error GoTo ErrorHandler
Set CreateDynaset = oORADB.CreateDynaset(SQL, LOption)
RetCount = CreateDynaset.RecordCount

としてみましたが、現象が変わりません。
引用返信 編集キー/
■51458 / inTopicNo.8)  Re[7]: Set CreateDynaset でレスポンス遅延が発生
□投稿者/ すなふきぬ (10回)-(2010/07/06(Tue) 22:35:21)
No51453 (VB533151 さん) に返信
> ■No51450 (すなふきぬ さん) に返信

>> 更新が遅い場合は、インデックス等を疑ってみるのも良いと思います。
>> データ数がわからないのでなんとも言えませんが、単純にsqlplus等でデータを挿入した場合も遅いでしょうか?
> 更新前の検索と更新後の検索では同じsqlを実行しています。

検索のSQLではなくて、更新系のSQLを疑うべきかも。


> 確かに解放されていないかも知れません。

> Public Function CreateDynaset(Optional ByVal vSQLString As Variant, Optional LOptionValue As Long) As OraDynaset
> Set CreateDynaset = Nothing
> On Error GoTo ErrorHandler
> Set CreateDynaset = oORADB.CreateDynaset(SQL, LOption)
> RetCount = CreateDynaset.RecordCount

まず、関数名のCreateDynasetにSetしてるってことは戻り値としてOraDynasetを返却していますよね。
呼び出し元の変数は解放できていますか?

Set x = CreateDynaset("",0)
のxの変数です。

この関数内では、Open-Closeの処理がないですが、Err.Raiseをしているので呼び出し側で制御していると思いますが、トランザクション等はどうなっていますか?
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -