sql - 在 SQL Server 2012 中将 OFFSET/FETCH 与 Fulltext 结合使用时性能下降

标签 sql sql-server tsql full-text-search sql-server-2012

我正在尝试编写一个数据库大小的查询结果分页。由于 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%,这对我来说完全没有意义:

Execution plan

我需要帮助如何提高分页性能。

最佳答案

如果没有掌握架构和数据,就很难提出建议。在这 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/

相关文章:

mysql - 在不同于 MySQL 的 MS SQL Server 中更新内部连接?

c# - 在mvc布局页面显示动态菜单

sql-server-2005 - 用于用户定义的键/值对的连接表上的 Where 子句

sql-server - SQL Server : Find out what row caused the TSQL to fail (SSIS)

mysql - 在第三个字段上使用 2 columns.grouping 进行过滤的好方法是什么

mysql - 如何在一张表中包含多个select语句

php - 删除重复的 MySQL 查询结果?

mysql - sql server中的日期替代

sql - SQL SERVER查询结果中的单行分隔记录

sql - 选择具有最高(相对)时间戳的所有行