在SQL Server中缓存已连接的表

Oli*_*ver 2 sql sql-server-2005

我的网站有一个运行速度很慢的搜索程序.减慢它的一件事是它必须做的8个表连接(它还有一个WHERE关于~6个搜索参数的子句).我尝试使用各种方法(例如添加索引)来加快查询速度,但这些方法没有帮助.

我有一个想法是缓存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
Run Code Online (Sandbox Code Playgroud)

这是一个有效的策略吗?我真的不知道我需要什么语法来解决这个问题,或者如果两个查询同时发生,我需要锁定什么来阻止事情的发生.

此外,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
Run Code Online (Sandbox Code Playgroud)

这有意义吗?如果是这样,我将如何实现它?如果没有,我该怎么办呢?我尝试使用索引视图,但这导致了奇怪的错误,所以我想要这样的东西,我可以有更多的控制权(另外,我可能会在未来转移到不同的服务器上.)

那么,像这样创建的表的索引等呢?

这个问题可能很明显,但我对SQL或我可用的选项知之甚少.

Aar*_*and 6

您可以使用多个模式(您应该始终指定模式!)并按照我在此问题中演示的那样播放switch-a-roo .基本上你需要两个额外的模式(一个临时保存表的副本,一个保存缓存的副本).

CREATE SCHEMA cache AUTHORIZATION dbo;
CREATE SCHEMA hold  AUTHORIZATION dbo;
Run Code Online (Sandbox Code Playgroud)

现在,在缓存模式中创建表的模拟:

SELECT * INTO cache.CachedTable FROM dbo.CachedTable WHERE 1 = 0;
-- then create any indexes etc.
Run Code Online (Sandbox Code Playgroud)

现在到了刷新数据的时候了:

-- 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;
Run Code Online (Sandbox Code Playgroud)