我正在尝试编写一个数据库大小的查询结果分页。由于 SQL Server 2012 提供了 OFFSET/FETCH,我正在使用它。但当我将该语句添加到查询中后,花费的时间延长了 10 倍。
查询:
SELECT
p.ShopId,
count(1) as ProductsQuantity,
MIN(LastPrice) as MinPrice,
MAX(LastPrice) as MaxPrice
FROM Product2 p WITH (NOLOCK)
INNER JOIN
CONTAINSTABLE(Product2, ProductName, 'czarny') AS KEY_TBL
ON KEY_TBL.[key]=p.Id
WHERE
(p.LastStatus > 0 OR p.LastStatus = -1)
GROUP BY p.ShopId
ORDER BY p.ShopId asc
SELECT
p.ShopId,
count(1) as ProductsQuantity,
MIN(LastPrice) as MinPrice,
MAX(LastPrice) as MaxPrice
FROM Product2 p WITH (NOLOCK)
INNER JOIN
CONTAINSTABLE(Product2, ProductName, 'czarny') AS KEY_TBL
ON KEY_TBL.[key]=p.Id
WHERE
(p.LastStatus > 0 OR p.LastStatus = -1)
GROUP BY p.ShopId
ORDER BY p.ShopId asc
OFFSET 10 ROWS
FETCH NEXT 10 ROWS ONLY
第一个查询在 3 秒内返回结果,第二个查询在 47 秒内返回结果。执行计划不同,第二个的成本评估仅为7%,这对我来说完全没有意义:
我需要帮助如何提高分页性能。
最佳答案
如果没有掌握架构和数据,就很难提出建议。在这 3 秒内,您至少应该能够做一件事。第一次查询需要 47 秒。第二个,将第一个查询的结果放入临时表中,然后将其用于 order by ... offset fetch next
:
create table #tmp (Id int not NULL, Quantity int, MinPrice decimal(10,4), MaxPrice decimal(10,4), primary key clustered (Id))
insert into #tmp
SELECT
p.ShopId,
count(1) as ProductsQuantity,
MIN(LastPrice) as MinPrice,
MAX(LastPrice) as MaxPrice
FROM Product2 p WITH (NOLOCK)
INNER JOIN
CONTAINSTABLE(Product2, ProductName, 'czarny') AS KEY_TBL
ON KEY_TBL.[key]=p.Id
WHERE
(p.LastStatus > 0 OR p.LastStatus = -1)
GROUP BY p.ShopId
select ShopId, ProductsQuantity, MinPrice, MaxPrice
from #tmp
ORDER BY ShopId asc
OFFSET 10 ROWS
FETCH NEXT 10 ROWS ONLY
关于sql - 在 SQL Server 2012 中将 OFFSET/FETCH 与 Fulltext 结合使用时性能下降,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18187261/