Client result cache (クライアント結果キャッシュ)と client_result_cache_stats$の怪しい関係 #3 Tweet
前回のつづきです。
前回は、print_stats()のOCIStmtRelease()とOCISessionEnd()の間にsleepを追加し、sleepしている間(つまり、OCISessionEnd()が実行される前であれば、client_result_cache_stats$ビューに反映されたクライアント結果キャッシュの統計情報が参照できることを確認したところまでだった。
今回は、さらに掘り下げてみます。OCISessionEnd()で統計情報が破棄されるので、破棄されるタイミングのは分りました。が、では、その統計情報は、どのタイミングで反映されるのでしょう。
ログはありませんが、cdemoqc.cにもともと実装されているsleep(60)をsleep(180)としても、他のクライアントの別セッションからclient_result_cache_stats$の統計情報を除いて覗いても反映されることはありませんでした。
いままでの結果から、sleep(60)〜OCISessionEnd()の間行われているということは想像できます。ということで、OCIStmtExecute()とOCIStmtFetc2()部分をコメントアウトし、OCIStmtPrepare2()だけ実行される状態にしてみました。
[oracle@lampeye demo]$ diff $ORACLE_HOME/rdbms/demo/cdemoqc.c.org $ORACLE_HOME/rdbms/demo/cdemoqc.c
138d137
< /*
144d142
< */
423,452c421,450
< if ((status = OCIStmtExecute ((OCISvcCtx *)syssvchp, (OCIStmt *)stmthp,
< (OCIError *)errhp, (ub4)0, (ub4)0,
< (OCISnapshot *)0, (OCISnapshot *)0,
< (ub4)OCI_DEFAULT)) != OCI_SUCCESS )
< {
< printf ("OCIStmtExecute for SELECT - Fail\n" );
< Checkerr (errhp, status,(oratext *)"Stmt Execute");
< }
< else
< {
< printf("Contents of CLIENT_RESULT_CACHE_STATS$\n");
< printf("STAT_ID NAME OF STATISTICS VALUE CACHE_ID\n");
< printf("======= ================== ===== ========\n");
< do
< {
< status = OCIStmtFetch2((OCIStmt *)stmthp, (OCIError *)errhp, (ub4)1,
< (ub2)OCI_FETCH_NEXT, (sb4)0, (ub4)OCI_DEFAULT);
<
< if (status == OCI_ERROR || status == OCI_INVALID_HANDLE)
< {
< Checkerr(errhp, status, (oratext *)"OCIStmtFetch2");
< break;
< }
< else if (status != OCI_NO_DATA)
< {
< printf("%5d %-20s %8d %6d\n", statid, name, value, cacheid);
< }
< }while(status != OCI_NO_DATA);
<
< }
---
> // if ((status = OCIStmtExecute ((OCISvcCtx *)syssvchp, (OCIStmt *)stmthp,
> // (OCIError *)errhp, (ub4)0, (ub4)0,
> // (OCISnapshot *)0, (OCISnapshot *)0,
> // (ub4)OCI_DEFAULT)) != OCI_SUCCESS )
> // {
> // printf ("OCIStmtExecute for SELECT - Fail\n" );
> // Checkerr (errhp, status,(oratext *)"Stmt Execute");
> // }
> // else
> // {
> // printf("Contents of CLIENT_RESULT_CACHE_STATS$\n");
> // printf("STAT_ID NAME OF STATISTICS VALUE CACHE_ID\n");
> // printf("======= ================== ===== ========\n");
> // do
> // {
> // status = OCIStmtFetch2((OCIStmt *)stmthp, (OCIError *)errhp, (ub4)1,
> // (ub2)OCI_FETCH_NEXT, (sb4)0, (ub4)OCI_DEFAULT);
> //
> // if (status == OCI_ERROR || status == OCI_INVALID_HANDLE)
> // {
> // Checkerr(errhp, status, (oratext *)"OCIStmtFetch2");
> // break;
> // }
> // else if (status != OCI_NO_DATA)
> // {
> // printf("%5d %-20s %8d %6d\n", statid, name, value, cacheid);
> // }
> // }while(status != OCI_NO_DATA);
> //
> // }
457a456,458
> printf("Sleep 10sec...\n");
> sleep (10);
>
[oracle@lampeye demo]$
makeして実行!!!!!
[oracle@lampeye demo]$ ./cdemoqc
Query cache is enabled by using result_cache hints
Connected to Employee Session
Connected to HR Session
Employee: Execute will fetch rows from server
Employee: Execute will fetch rows from local cache
HR: Execute will cause a roundtrip during first execute, but the same result
set created in Employee Session will be shared thereafter
HR: Execute will fetch rows from local cache
HR: Updating the table
Employee: Execute will fetch rows from server and hence the local result set
will be updated
HR: Execute will fetch rows from updated local cache
Employee: Execute will fetch rows from local cache
Sleeping for few seconds to let the stat table to get updated
Please enter password for sys user to continue:
xxxxxxxx!
Sleep 10sec...
Logging off all the connected sessions.
[oracle@lampeye demo]$
Sleep 10sec...中に、他クライアントからclient_result_cache_stats$ビューを覗いて見ると…
お〜〜〜〜〜〜〜〜〜〜〜〜〜、一度も統計情報が反映されません!!!!! ;)
・デモプログラム実行前の状態
21:52:37 SYS> /
レコードが選択されませんでした。
経過: 00:00:00.01
・デモプログラム実行直後の状態
21:52:39 SYS> /
CACHE_ID STAT_ID NAME VALUE
---------- ---------- ------------------------------ ----------
115 1 Block Size 0
115 2 Block Count Max 0
115 3 Block Count Current 0
115 4 Hash Bucket Count 0
115 5 Create Count Success 0
115 6 Create Count Failure 0
115 7 Find Count 0
115 8 Invalidation Count 0
115 9 Delete Count Invalid 0
115 10 Delete Count Valid 0
10行が選択されました。
経過: 00:00:00.00
・Please enter password for sys user to continue:が表示されている時点の状態
21:52:44 SYS> /
CACHE_ID STAT_ID NAME VALUE
---------- ---------- ------------------------------ ----------
115 1 Block Size 0
115 2 Block Count Max 0
115 3 Block Count Current 0
115 4 Hash Bucket Count 0
115 5 Create Count Success 0
115 6 Create Count Failure 0
115 7 Find Count 0
115 8 Invalidation Count 0
115 9 Delete Count Invalid 0
115 10 Delete Count Valid 0
10行が選択されました。
経過: 00:00:00.00
・Sleep 10sec...が表示されている時点の状態
21:53:44 SYS> /
CACHE_ID STAT_ID NAME VALUE
---------- ---------- ------------------------------ ----------
115 1 Block Size 0
115 2 Block Count Max 0
115 3 Block Count Current 0
115 4 Hash Bucket Count 0
115 5 Create Count Success 0
115 6 Create Count Failure 0
115 7 Find Count 0
115 8 Invalidation Count 0
115 9 Delete Count Invalid 0
115 10 Delete Count Valid 0
10行が選択されました。
経過: 00:00:00.00
21:53:52 SYS> /
CACHE_ID STAT_ID NAME VALUE
---------- ---------- ------------------------------ ----------
115 1 Block Size 0
115 2 Block Count Max 0
115 3 Block Count Current 0
115 4 Hash Bucket Count 0
115 5 Create Count Success 0
115 6 Create Count Failure 0
115 7 Find Count 0
115 8 Invalidation Count 0
115 9 Delete Count Invalid 0
115 10 Delete Count Valid 0
10行が選択されました。
経過: 00:00:00.00
・デモプログラム終了後の状態
21:53:54 SYS> /
レコードが選択されませんでした。
経過: 00:00:00.00
21:54:00 SYS>
徐々に、ポイントが見えてきました。次回へつづく。
・Client result cache (クライアント結果キャッシュ)と client_result_cache_stats$の怪しい関係 #1
・Client result cache (クライアント結果キャッシュ)と client_result_cache_stats$の怪しい関係 #2
| 固定リンク | 0
トラックバック
この記事へのトラックバック一覧です: Client result cache (クライアント結果キャッシュ)と client_result_cache_stats$の怪しい関係 #3:
コメント