我有以下疑问(为了方便讨论,简化如下):
WITH CTE
(
Columns,
DeliverDate,
LastReplayDate
)
AS
(
SELECT IIF(LastReplayDate IS NULL, IIF(LastReplayDate>= DeliverDate, LastReplayDate,DeliverDate),LastReplayDate) AS SortDateColumn,R.* FROM
(
SELECT
Columns,
DeliverDate,
LastReplayDate
FROM MY_TABLE
WHERE
CONDITIONS
AND ( FIRST_HEAVY_FUNCTION)
AND ( SECOND_HEAVY_FUNCTION)
) R
ORDER BY SortDateColumn DESC
OFFSET (@CurrentPageIndex - 1) * @PageSize ROWS
FETCH NEXT 10 ROWS ONLY
)
SELECT CTE. *
FROM CTE
OPTION (RECOMPILE);
正如你所看到的,我使用CTE查询从其他查询排序数据。最后一个包括分页每10行。
对我来说最大的问题是:
WHERE
CONDITIONS
AND ( FIRST_HEAVY_FUNCTION)
AND ( SECOND_HEAVY_FUNCTION)
由于这些条件,返回时间有时会达到4分钟左右。没有它是相当快的(8-20秒)。当然,索引和改善查询从15分钟。但这仍然是缓慢的。
我想知道是否有可能将有问题的条件移到CTE之外,同时仍然从分页中获得所有10行?如果行数〈10,则执行另一个循环来收集丢失的行,以获得准确的10行作为最终结果。是否有可能?或者如何优化这样的查询?
1条答案
按热度按时间bvpmtnay1#
几个问题:
1.你能把函数重写成内联表值函数吗?这样可以减轻压力
有一个名为FORCEORDER的OPTION提示可以保证SQL不会被过多地重新排列
1.你的指数好吗?