2010-12-17 7 views
1

私はサーバーのファームを所有しており、各サーバーは定期的にデータベースに対して同じクエリを実行しています。 これらのクエリ結果は共有キャッシュにキャッシュされ、すべてのサーバーにアクセスできます。SQLクエリのバージョニング

新しいクエリが古いクエリで上書きされないようにするにはどうすればよいですか? クエリを何らかの形でバージョニングする方法はありますか?たとえば、この が発生しないようにしますか?どのように同時クエリを扱う?

ありがとうございます!

編集:dbはSQL Serverです。クエリーはselectステートメントです。そして、キャッシュ機構は非常に単純です:シンプルな書き込み、ロックなし。これは、現在のところ、選択クエリの順序を伝える方法がないためです。

+0

RDBMS - SQL Server、MySQL、Oracleなどの詳細情報が必要です。クエリ(更新、選択、挿入、削除)とは何ですか?「上書き」とはどういう意味ですか? – JNK

+0

この質問に対する答えは、このキャッシングを行うために使用しているメカニズムに依存しています。概念レベルでは、可能な答えは「確かに、各クエリにタイムスタンプを関連付けるだけで、入ってくるクエリが既存のクエリよりも新しい場合にのみキャッシュを更新する」というものです。 –

+0

タイトルが誤解を招くクエリをバージョン管理していない(これは、基礎となるSQLへの変更を追跡することを意味する)結果セットではありません。これは、使用しているキャッシュストレージ(ファイルなど)をバージョン管理することを意味します。 –

答えて

0

1つの方法は、更新または読み取り(更新はより効率的ですが、より適切になることが難しい)のいずれかのためにデータベースにグローバル更新カウンタを設けることです。

したがって、更新ごとにグローバルカウンタも増分します。各読み取りでグローバルカウンタを読み取り、カウンタ値とともにキャッシュにデータを格納します。カウンタの値が大きい場合にのみ、キャッシュの内容を上書きします。

データベースの分離のために、トランザクションは(SERIALIZABLE分離レベルを選択したと仮定して)直列的に発生したように見えるはずです。これは、厳密に高いカウンター番号が最近のデータに関連していることを意味します。

+0

ありがとう、マーティン。いい考えだ。私はSQL Server 2005を使用しています。これを実装する最善の方法に関するアイデア? – Jacko

+0

SQLサーバーにシーケンスの組み込み機能があるかどうかは不明です。そうでない場合は、 'counter(value int)'テーブルを作成し、 'update counter set value = value + 1; 'を使用して更新してください。 –

0

キャッシュはどこですか?それはディスクファイルですか?またはデータベースのテーブルですか?

古いクエリが新しいクエリを上書きする可能性があるとはどういう意味ですか?最も最近に完了したクエリ(または最近開始されたクエリ)が最新のものであるということは本当ですか?

ファイルまたはテーブルのいずれであっても、各クエリを実行する前にキャッシュコンテナをロックする必要があります。各サーバーは、ロックを取得できる場合のみクエリを実行する必要があります。それ以外の場合は、ロックされたリソースを待機する必要があります。そうすれば、キャッシュには最新の結果のみが含まれます。

あなたは何を求めているのでしょうか?

+0

ありがとう、Larry。キャッシュはmemcachedと同様に、メモリ内のバリューサーバに格納されます。はい、コンテナをロックするとクエリがシリアル化されますが、この場合はパフォーマンスが懸念されます。だから、私はロックを避けようとしています。現在、結果の各行にはバージョンがあり、キャッシュ内の各行の最新バージョンを追跡できるため、このバージョンに基づいてクエリを比較することができます。 – Jacko

関連する問題