2015-12-16 15 views
5

私は、SQLクエリがすべてのデータを再処理するのではなく、データを受け取るためにクエリキャッシュを使用することを知っています。ここで私はデータベースのサーバーで作業SQLクエリキャッシュ

私がお願いしたい質問は、私はそれに取り組んでいることを、開発者の一人ですし、私は私が私場合

を扱うクエリのパフォーマンステストを行う必要がありますクエリキャッシュをクリアする 例をFLUSH QUERY CACHE;またはRESET QUERY CACHE;,

他の開発者に影響を与えますか、ローカルクエリキャッシュのみをクリアしますか?

、それは他の人に影響を与える場合は、ローカルにクリアするか、または私のクエリは、あなたのquery.ThisでSQL_NO_CACHEオプションを使用してみてください

+0

この質問は現在MySQL関連ではないため、SQL Serverを戻してSQLを追加しました。 –

答えて

2

二つの明確化:

  • MySQLのクエリキャッシュは、サーバー側の機能で、「ローカル・キャッシュ」のようなものはありません。 FLUSHコマンドのLOCALキーワードで混乱している可能性があります。 docsは、NO_WRITE_TO_BINLOGのエイリアスです(レプリケーションに関連しており、「ローカル」は「このサーバー」を意味します)。

  • この機能を有効にした場合、MySQLはキャッシュされたデータを返すだけで、SQL_CACHEのヒントを使用してデフォルトにするかオプトインします。私の経験上、ほとんどのサーバーはデフォルトでそれを持っていません。

質問にお答えします。 The MySQL Query Cacheで我々は読むことができます:

クエリキャッシュはセッション間で共有されているので、 1つのクライアントによって生成された結果セットが別の クライアントによって発行された同じクエリに応答して送信することができます。

これは意味があります:格納されたデータを再利用できないキャッシュはそれほど有用ではありません。

正確に何をテストしたいのか分かりません。データは常に新鮮でなければなりません。

クエリキャッシュは古いデータを返しません。テーブルが変更されると、 クエリキャッシュ内の関連エントリがフラッシュされます。

ただし、クエリの実行に要する時間を知りたい場合があります。 the SQL_NO_CACHE keywordでいつでも無効にすることができます。

サーバーはクエリキャッシュを使用しません。クエリ キャッシュをチェックして結果が既にキャッシュされているかどうかを確認したり、クエリ結果をキャッシュしたりしません。

ただ、データセグメントの一部は、すでにRAMにロードされる可能性がありますので、二度目に実行されるクエリもキャッシュせずに高速に実行可能性があることを考慮に入れます。

1

をテストするためのクエリキャッシュを使用しないようにするどのような方法があるが、MySQLは結果をキャッシュを停止します

SELECT SQL_NO_CACHE * FROM TABLE 
+1

SELECT *でのみ動作しますか? SELECT SQL_NO_CACHE [値] FROM TABLEのように使用すると、SQL_NO_CACHEの無効な列名が表示される – Dean

+0

http://dev.mysql.com/doc/refman/5.7/en/query-cache-in-selectを参照してください。 html @Dean –

+1

@DeanこれはMySQLの拡張です。構文は他のDBMSでは機能しません。 –

1

キャッシュされたデータ用のSQL Serverを使用すると、DBCC DROPCLEANBUFFERSを使用してmanul CHECKPOINTを強制することができます。シャットダウンし、サーバーを再起動せずに冷たいバッファキャッシュとクエリをテストするために

利用DBCC DROPCLEANBUFFERS:

は、しかし、それはサーバ(インスタンス)レベルで動作します。

クリーンバッファをバッファプールから削除するには、まずCHECKPOINTを使用してコールドバッファキャッシュを生成します。これにより、現在のデータベースのすべてのダーティページが強制的にディスクに書き込まれ、バッファがクリーンアップされます。これを実行した後、DBCC DROPCLEANBUFFERSコマンドを実行して、すべてのバッファをバッファプールから削除できます。編集した

*

SQLクエリ・バッファ・キャッシュは、グローバルが、ローカルではありません。バッファまたはクエリキャッシュが削除されている場合、それはグローバルに削除され、データベースサーバを使用するすべてのユーザに影響します。そもそも

+0

だから... 'DBCC DROPCLEANBUFFERS'はサーバ全体のバッファキャッシュをクリーンアップしていますか?それはローカルではなくサーバ全体ではクリアする方法はありますか? – Dean

+0

CHECKPOINTは、メモリからディスクまでのすべてを記録し、DROPCLEANBUFFERSはバッファをクリアします(すべてが記録されているため)。しかし、これはSQL Server用です(あなたがMySQLと言及する前に)。サーバー上のキャッシュ全体をクリアします。キャッシュは、すべてのユーザーに対してSQL Serverインスタンスに対してグローバルであり、特定のユーザーにリンクされていません。 –

+0

ok ..ありがとう.. MySQLと同じかもしれないが、キャッシュはグローバルに保存されている。まだ確かではありません。もしそうなら、私はそれをMySQLとSQL Serverの両方の解決策としてタグ付けします。 – Dean

関連する問題