TSQL - 将数据提取到表/视图以加速查询

时间:2015-03-12 14:13:43

标签: sql-server tsql select triggers sql-server-2012

我使用此语句为excel创建列表

SELECT DISTINCT Year, Version 
    FROM myView 
    WHERE id <> 'old' 
    ORDER BY Year DESC, Version DESC

问题是执行时间超过30秒,因为有近200万行。

结果只有大约1000行。

为了加快执行时间,我有哪些选项只提取这两列?我还需要确保识别基础表的插入。

我是否需要新表来复制视图中的值?还有一个管理更新的触发器?

谢谢

2 个答案:

答案 0 :(得分:2)

所以,大概有一张桌子上有年份和身份证明你的观点。鉴于这个(微不足道的)例子:

CREATE TABLE myTable ([id] varchar(10), [Year] int, [Version] int);

只需在该表上创建一个与您查询数据的方式相匹配的索引。鉴于您的查询:

SELECT DISTINCT Year, Version 
  FROM myView 
 WHERE id <> 'old' 
 ORDER BY Year DESC, Version DESC

此查询与WHERE和ORDER BY子句匹配,并且应该为您提供所需的所有性能:

IF  EXISTS (SELECT * FROM sys.indexes WHERE object_id = OBJECT_ID(N'[dbo].[myTable]') AND name = N'IX_YearVersion_Filtered')
    DROP INDEX [IX_YearVersion_Filtered] ON [dbo].[myTable] WITH ( ONLINE = OFF )
GO
CREATE NONCLUSTERED INDEX [IX_YearVersion_Filtered] ON [dbo].[myTable] 
(
    [Year] DESC,
    [Version] DESC
)
WHERE ([id]<>'old')
GO

答案 1 :(得分:0)

with cte_x
as
(SELECT Year, Version 
    FROM myView 
    WHERE id not in ('old')
    group by Year, Version)
SELECT DISTINCT Year, Version 
    FROM cte_x
        ORDER BY Year DESC, Version DESC