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或我可用的选项知之甚少.
您可以使用多个模式(您应该始终指定模式!)并按照我在此问题中演示的那样播放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)
| 归档时间: |
|
| 查看次数: |
1979 次 |
| 最近记录: |