我使用此语句为excel创建列表
SELECT DISTINCT Year, Version
FROM myView
WHERE id <> 'old'
ORDER BY Year DESC, Version DESC
问题是执行时间超过30秒,因为有近200万行。
结果只有大约1000行。
为了加快执行时间,我有哪些选项只提取这两列?我还需要确保识别基础表的插入。
我是否需要新表来复制视图中的值?还有一个管理更新的触发器?
谢谢
答案 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