gpt4 book ai didi

sql - ROW_NUMBER() 性能优化

转载 作者:行者123 更新时间:2023-12-03 02:44:15 26 4
gpt4 key购买 nike

首先,我想提一下,我已经检查了所有其他提出的问题,没有一个与我的相似,所以我不认为它是重复的。

我有两个表格,“Article_tbl”到目前为止已超过 300,000 行,“ArticleZone_tbl”的行数几乎相同。

“Article_tbl”包含身份主键“ArticleID”。“ArticleZone_tbl”包含由三列组成的主键,“ArticleID”、“ChannelID”、“ZoneID”;其中“ArticleID”是“Article_tbl”的外键

在排序依据的列上创建了非聚集索引。

SQL 查询:

WITH OrderedOrders AS(
Select ROW_NUMBER() Over(Order by LastEditDate desc, ArticleOrder Asc, LastEditDateTime desc) as RowNum, dbo.Article_tbl.*, ArticleZone_tbl.ChannelID, ArticleZone_tbl.ZoneID, ArticleZone_tbl.ArticleOrder
From Article_tbl INNER JOIN ArticleZone_tbl
ON dbo.Article_tbl.ArticleID = dbo.ArticleZone_tbl.ArticleID
Where ChannelID=1 And ZoneID=0)

SELECT * FROM OrderedOrders Where RowNum Between 1 And 10

上面的查询大约需要2秒才能完成,有什么办法可以优化这个查询吗?

更多信息:操作系统:Windows WebServer 2008R2SQL 服务器:2008R2内存:32GB硬盘:160GB SSD

提前致谢。

最诚挚的问候,麦克海梅克

最佳答案

您可以尝试创建一个 Indexed View在两个表上:

CREATE VIEW dbo.YourIndexedView
WITH SCHEMABINDING
AS
SELECT az.ArticleID,
az.ChannnelID,
az.ZoneID,
a.LastEditDate,
a.LastEditDateTime,
az.ArticleOrder
FROM dbo.Article_tbl a
INNER JOIN dbo.ArticleZone_tbl az
ON a.ArticleID = az.AtricleID;

GO
CREATE UNIQUE CLUSTERED INDEX UQ_YourIndexView_ArticleID_ChannelID_ZoneID
ON dbo.YourIndexedView (ArticleID, ChannelID, ZoneID);

一旦你有了聚集索引,你就可以创建一个非聚集索引来帮助排序:

CREATE NONCLUSTERED INDEX IX_YourIndexedView_LastEditDate_ArticleOrder_LastEditDateTime
ON dbo.YourIndexedView (LastEditDate DESC, ArticleOrder ASC, LastEditDateTime DESC);

然后您可以在查询中引用此内容:

WITH OrderedOrders AS
( SELECT RowNum = ROW_NUMBER() OVER(ORDER BY LastEditDate DESC, ArticleOrder ASC, LastEditDateTime DESC),
ArticleID,
ChannelID,
ZoneID,
LastEditDateTime,
ArticleOrder
FROM dbo.YourIndexedView WITH (NOEXPAND)
WHERE ChannelID = 1
AND ZoneID = 0
)
SELECT *
FROM OrderedOrders
WHERE RowNum BETWEEN 1 AND 10;

注意我可能错过了您的文章表中的一些列,但我无法从问题中推断出它们

此外,如果您的查询始终具有相同的区域和 channel ,您可以过滤 View ,然后您的聚集索引列将变为 ArticleID:

CREATE VIEW dbo.YourIndexedView
WITH SCHEMABINDING
AS
SELECT az.ArticleID,
az.ChannnelID,
az.ZoneID,
a.LastEditDate,
a.LastEditDateTime,
az.ArticleOrder
FROM Article_tbl a
INNER JOIN ArticleZone_tbl az
ON a.ArticleID = az.AtricleID
WHERE az.ChannelID = 1
AND Az.ZoneID = 1;

GO
CREATE UNIQUE CLUSTERED INDEX UQ_YourIndexView_ArticleID
ON dbo.YourIndexedView (ArticleID);

这意味着您的索引将会更小,并且使用起来更快。

关于sql - ROW_NUMBER() 性能优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20230172/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com