【发布时间】:2018-12-10 04:42:31
【问题描述】:
我在 SQL Server 中创建了以下视图。它在视图中使用两组ROW_NUMBER OVER PARTITION 查询,因为两个引用的表将在RowInsertDateTime 日期/时间范围内多次出现相同的ServerName,我只对每个表的最新行感兴趣桌子。
返回 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)
执行计划
【问题讨论】:
标签: sql-server indexing view