TSQL - 将数据提取到 table/view 以加快查询速度
TSQL - extract data to table/view to speed up query
我使用此语句为 excel
创建列表
SELECT DISTINCT Year, Version
FROM myView
WHERE id <> 'old'
ORDER BY Year DESC, Version DESC
问题是执行时间超过了30秒,因为将近200万行。
结果只有大约 1000 行。
为了加快执行时间,我有什么选择可以只提取这两列?我还需要确保识别到底层 table 的插入。
我需要一个新的 table 来复制视图中的值吗?以及管理更新的触发器?
谢谢
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
所以,大概有一个 table 带有 Year 和 id 作为您视图的基础。给出这个(微不足道的)例子:
CREATE TABLE myTable ([id] varchar(10), [Year] int, [Version] int);
只需在 table 上创建一个与您查询数据的方式相匹配的索引。鉴于您的查询:
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
我使用此语句为 excel
创建列表SELECT DISTINCT Year, Version
FROM myView
WHERE id <> 'old'
ORDER BY Year DESC, Version DESC
问题是执行时间超过了30秒,因为将近200万行。
结果只有大约 1000 行。
为了加快执行时间,我有什么选择可以只提取这两列?我还需要确保识别到底层 table 的插入。
我需要一个新的 table 来复制视图中的值吗?以及管理更新的触发器?
谢谢
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
所以,大概有一个 table 带有 Year 和 id 作为您视图的基础。给出这个(微不足道的)例子:
CREATE TABLE myTable ([id] varchar(10), [Year] int, [Version] int);
只需在 table 上创建一个与您查询数据的方式相匹配的索引。鉴于您的查询:
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