私のWebサイトには、検索処理が非常に遅く実行されています。それを遅くする1つのことは、それがしなければならない8テーブル結合です(〜6の検索パラメータにはWHERE
句もあります)。私はインデックスを追加するなどのさまざまな方法を使用してクエリを高速化しようとしましたが、これらは役に立ちませんでした。SQL Serverの結合テーブルのキャッシュ
私が持っているアイデアは、8テーブル結合の結果をキャッシュすることです。私は、結合の一時的なテーブルを作成し、検索プロシージャにこのテーブルを照会させることができます。私は10分ごとにテーブルを更新することができました。擬似コードを使用して
、私はこのように私の手順を変更します:これは、作業戦略
IF CachedTable is NULL or CachedTable is older than 10 minutes
DROP TABLE CachedTable
CREATE TABLE CachedTable as (select * from .....)
ENDIF
Select * from CachedTable Where Name = @SearchName
AND EmailAddress = @SearchEmailAddress
ですか?私はこれを取り除くためにどのような構文が必要か、あるいは2つのクエリが同時に発生した場合には中断するのを防ぐためにロックする必要があるかどうかはわかりません。
また、それは新しいCachedTable
それぞれの時間を作るために非常に長い時間がかかる場合がありますので、私はコンピュータグラフィックスでダブルバッファリングのような何かをしようと考えた:
IF CachedTabled is NULL
CREATE TABLE CachedTable as (select * from ...)
ELSE IF CachedTable is older than 10 minutes
-- Somehow do this asynchronously, so that the next time a search comes
-- through the new table is used?
ASYNCHRONOUS (
CREATE TABLE BufferedCachedTable as (select * from ...)
DROP TABLE CachedTable
RENAME TABLE BufferedCachedTable as CachedTable
)
Select * from CachedTable Where Name = @SearchName
AND EmailAddress = @SearchEmailAddress
これはどんな意味がありますか?もしそうなら、私はそれをどのように達成するでしょうか?そうでない場合は、代わりに何をすべきですか?私はインデックス付きのビューを使用しようとしましたが、これで奇妙なエラーが発生しました。そのため、私はより多くの制御を行うことができます(また、将来別のサーバーに振り向けることもできます)。
また、このように作成されたテーブルのインデックスなどはどうですか?
これは疑問からはっきりしているかもしれませんが、SQLや使用可能なオプションについてはそれほどよく分かりません。
あなたはスクリプトに必要があります索引、制約など。「SELECT INTO」などを使用すると、新しいテーブルは無料で提供されません。 –