2012-02-13 11 views
2

私の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や使用可能なオプションについてはそれほどよく分かりません。

+0

あなたはスクリプトに必要があります索引、制約など。「SELECT INTO」などを使用すると、新しいテーブルは無料で提供されません。 –

答えて

5

this questionで説明したように、複数のスキーマを使用することができます(スキーマを指定する必要があります)、switch-a-rooを使用できます。基本的には、2つの追加スキーマが必要です(テーブルのコピーを一時的に保持するスキーマと、キャッシュされたコピーを保持するスキーマ)。

CREATE SCHEMA cache AUTHORIZATION dbo; 
CREATE SCHEMA hold AUTHORIZATION dbo; 

さて、キャッシュスキーマにテーブルの模倣を作成します。それはデータをリフレッシュする時間が来るとき

SELECT * INTO cache.CachedTable FROM dbo.CachedTable WHERE 1 = 0; 
-- then create any indexes etc. 

:今すぐ

-- step 1: 
TRUNCATE TABLE cache.CachedTable; 
-- (if you need to maintain FKs you may need to delete) 
INSERT INTO cache.CachedTable SELECT ... 

-- step 2: 
-- this transaction will be almost instantaneous, 
-- since it is a metadata operation only: 

BEGIN TRANSACTION; 
    ALTER SCHEMA hold TRANSFER dbo.Cachedtable; 
    ALTER SCHEMA dbo TRANSFER cache.CachedTable; 
    ALTER SCHEMA cache TRANSFER hold.CachedTable; 
COMMIT TRANSACTION; 
+0

ありがとうございます、これはかなり気分がいいようです。私は現時点でスキーマを使用しているようには見えません(すべてがdboです[tableName])。 – Oliver

+0

'CachedTable'ではなく' dbo.CachedTable'をクエリに指定する必要があります。http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/11/bad-habits-to-kick-avoiding- the-schema-prefix.aspx –

+0

私はこれが今働いているし、本当にうまくいく、あなたの助けに感謝します。 – Oliver

関連する問題