sql-server - INDEX 用于提高包含 ROW_NUMBER OVER PARTITION 的视图的性能
问题描述
我在 SQL Server 中创建了以下视图。它在视图中使用两组ROW_NUMBER OVER PARTITION
查询,因为两个引用的表将ServerName
在一系列RowInsertDateTime
日期/时间内多次出现相同的查询,而我只对每个表的最新行感兴趣。
返回 471 行需要 4 秒。没有一个表包含索引。我需要一些帮助来了解我可以添加哪些索引来提高视图的性能。我检查了实际的执行计划,两种排序分别负责总查询成本的 11% 和 35%。
视图定义:
CREATE VIEW ViewInSiteSuperTable
AS
SELECT
sales.ServerName,
GETDATE() AS RowInsertDateTime,
sales.daily_sales,
basket.AvgBasketAmount,
basket.AvgBasketQty,
oos.OutOfStockCount,
tph.transactions_per_hour,
tph.total_transactions
FROM
dbo.InSiteEodSalesPerDayPerStore sales WITH (NOLOCK)
INNER JOIN
(SELECT
ServerName,
RowInsertDateTime,
AvgBasketAmount,
AvgBasketQty
FROM
(SELECT
ServerName,
RowInsertDateTime,
AvgBasketAmount,
AvgBasketQty,
ROW_NUMBER() OVER (PARTITION BY ServerName ORDER BY RowInsertDateTime DESC) rn
FROM
InSiteAvgBasketSize) q
WHERE
rn = 1) basket ON basket.ServerName = sales.ServeRName
INNER JOIN
(SELECT
ServerName,
RowInsertDateTime,
transactions_per_hour,
total_transactions
FROM
(SELECT
ServerName,
RowInsertDateTime,
transactions_per_hour,
total_transactions,
ROW_NUMBER() OVER (PARTITION BY ServerName ORDER BY RowInsertDateTime DESC) rn
FROM
InSiteTxPerHourPerDayTotals) q
WHERE
rn = 1) tph ON tph.ServerName = sales.ServerName
INNER JOIN
dbo.InSiteOutOfStocksAllStores oos WITH (NOLOCK) ON oos.ServerName = sales.ServerName
WHERE
sales.daily_sales_date = DATEADD(DAY, DATEDIFF(DAY, 0, GETDATE()), 0)
执行计划
解决方案
消除 2 个 sotrs 的指标是:
create index ix_ServerName_RowInsertDateTime on InSiteTxPerHourPerDayTotals
(ServerName asc, RowInsertDateTime desc) include(transactions_per_hour, total_transactions)
create index ix_ServerName_RowInsertDateTime on InSiteAvgBasketSize
(ServerName asc, RowInsertDateTime desc) include(AvgBasketAmount, AvgBasketQty)
但是,您应该actual execution plan
在问题中包含,而不是作为图片,而是使用粘贴计划
我了解基本索引,例如删除表扫描的索引,但我真的很想了解这些索引建议背后的想法。
在这种情况下,索引不是删除 ,scan
而是删除sort
. 无论如何,这两个表都会被扫描,你想枚举所有行,所以你不能删除scan
,但你想在每个ServerName
组中枚举,它是第一个index key
,你想RowInsertDateTime
在每个组中排序,所以它是第二个index key
. 这两个字段在排序时已经拥有您想要的:它们在 s 组中是有序的。
其他字段included
不需要按顺序排列,但没有它们,索引不适covering
用于您的查询,即服务器将对基表进行查找以获取它们,因为它们存在于select
子句中。
推荐阅读
- javascript - 我可以将标题添加到 react-gallery-component
- microservices - 词汇问题:我是在做微服务还是只是 SOA?
- r - R中的星号有替代品吗?
- mysql - 获取MYSQL中Array中多行的列值的总和
- javascript - React:如何根据滚动的当前页面更改计数器的状态
- excel - 汇总计算列的值
- hibernate - 使用 executeUpdate 命令在进程结束时执行提交删除多条记录
- node.js - DocuSign REST API - node.js 签名者不尊重 agentCanEditEmail 和 agentCanEditName 属性
- javascript - 从 index.js 访问变量值到 nodejs 上的另一个 js 文件
- reactjs - HOC 中的 getStaticProps 在 Next.js 中不起作用