Client result cache (クライアント結果キャッシュ)と client_result_cache_stats$の怪しい関係 #2 Tweet
最初に前回のまとめから。
client_result_cache_stats$の内容に関して以下3点が確認できました。
・client_result_cache_stats$ヘ該当クライアントから統計情報が反映されるまでタイムラグがある。
(cdemoqc.cでは、60秒も待機してからclient_result_cache_stats$を問い合わせている)
・client_result_cache_stats$に表示されるCACHE_ID列値は、cdemoqc.cが表示している内容に一致する。
・cdemoqc.c内の別セッションを使った問い合わせてでは、client_result_cache_stats$の値が取得できている。
いろいろと考え込んでいて閃いたのが、クライアント結果キャッシュってクライアントとサーバ間のラウンドトリップを減らすことも目的なわけだから、キャッシュを保持しているクライアントから、キャッシュの統計情報がサーバに渡るタイミングが非常に限られているんじゃないか……と。
ということで、クライアント結果キャッシュが効いているクエリではサーバまで行かないので、後続のOCIでサーバまで行かないと処理が終わらないタイプのOCIをコールしてたついでにclient_result_cache_stats$に表示する統計情報を送るんじゃないだろーかー。ということ。
OCISessionEnd()で、統計情報が破棄されているんだろーという推測の元、クライアント結果キャッシュに載せないSQL文のPrepare,ExecuteやFetchのいずれかのタイミングで送っているんだろうという切り分けのため、print_stats()のOCIStmtRelease()とOCISessionEnd()の間にsleepを追加した。
[oracle@lampeye demo]$ diff cdemoqc.c.org cdemoqc.c
138d137
< /*
144d142
< */
457a456,458
> printf("Sleep 10sec...\n");
> sleep (10);
>
[oracle@lampeye demo]$
実行結果は以下の通り。
[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
Contents of CLIENT_RESULT_CACHE_STATS$
STAT_ID NAME OF STATISTICS VALUE CACHE_ID
======= ================== ===== ========
1 Block Size 256 114
2 Block Count Max 4096 114
3 Block Count Current 128 114
4 Hash Bucket Count 1024 114
5 Create Count Success 2 114
6 Create Count Failure 0 114
7 Find Count 4 114
8 Invalidation Count 1 114
9 Delete Count Invalid 0 114
10 Delete Count Valid 0 114
Sleep 10sec...
Logging off all the connected sessions.
[oracle@lampeye demo]$
事前に起動していたSQL*Plusからclient_result_cache_stats$ビューを確認してみると…
お〜〜〜〜〜〜〜っ!、ちゃんと表示されています!!!!!。
感があたりました〜〜〜〜〜〜! :)
・cdemoqc実行前
21:41:48 SYS> select * from client_result_cache_stats$;
レコードが選択されませんでした。
・cdemoqc実行直後
経過: 00:00:00.00
21:41:49 SYS> /
CACHE_ID STAT_ID NAME VALUE
---------- ---------- ------------------------------ ----------
114 1 Block Size 0
114 2 Block Count Max 0
114 3 Block Count Current 0
114 4 Hash Bucket Count 0
114 5 Create Count Success 0
114 6 Create Count Failure 0
114 7 Find Count 0
114 8 Invalidation Count 0
114 9 Delete Count Invalid 0
114 10 Delete Count Valid 0
10行が選択されました。
・60秒間待機している状態の時
経過: 00:00:00.00
21:41:54 SYS> /
CACHE_ID STAT_ID NAME VALUE
---------- ---------- ------------------------------ ----------
114 1 Block Size 0
114 2 Block Count Max 0
114 3 Block Count Current 0
114 4 Hash Bucket Count 0
114 5 Create Count Success 0
114 6 Create Count Failure 0
114 7 Find Count 0
114 8 Invalidation Count 0
114 9 Delete Count Invalid 0
114 10 Delete Count Valid 0
10行が選択されました。
・cdemoqcが、client_result_cache_stats$を表示した直後の10秒待機の時
経過: 00:00:00.00
21:42:53 SYS> /
CACHE_ID STAT_ID NAME VALUE
---------- ---------- ------------------------------ ----------
114 1 Block Size 256
114 2 Block Count Max 4096
114 3 Block Count Current 128
114 4 Hash Bucket Count 1024
114 5 Create Count Success 2
114 6 Create Count Failure 0
114 7 Find Count 4
114 8 Invalidation Count 1
114 9 Delete Count Invalid 0
114 10 Delete Count Valid 0
10行が選択されました。
・cdemoqcが終了した直後
経過: 00:00:00.00
21:42:59 SYS> /
レコードが選択されませんでした。
経過: 00:00:00.00
21:43:09 SYS>
次回はさらに絞りこんで確認します。つづく〜
Client result cache (クライアント結果キャッシュ)と client_result_cache_stats$の怪しい関係 #1
| 固定リンク | 0
トラックバック
この記事へのトラックバック一覧です: Client result cache (クライアント結果キャッシュ)と client_result_cache_stats$の怪しい関係 #2:
コメント