我有一个具有多个联接和条件的select
查询。可以说该表具有大量记录(> 5000)。在我的应用中,我正在使用分页,并在查询末尾添加了以下内容:
OFFSET 5 * (1 - page) ROWS
FETCH NEXT 5 ROWS ONLY
其中page
是用户正在查看的当前页面。
但是,这变得非常缓慢,每个查询大约需要5秒。我曾考虑过使用top
关键字代替它。例如,对于第2页,我将执行top 10
,并在C#
侧丢弃前5行。但是,对于后期页面,它显然会比以前的方法慢。
还有其他可行的方法吗?
查询虽然很大,但很简单,只需一堆likes
之类的
答案 0 :(得分:0)
我忘了我第一次看到此建议的地方,所以没有链接,但是通过在仅主键的CTE上进行分页,然后将其重新连接到表以获取数据。
是这样的:
WITH Ord_CTE AS (
SELECT {primary key column(s)}
FROM {tables and joins}
WHERE {conditions}
ORDER BY {column(s)} OFFSET x ROWS FETCH NEXT y ROWS ONLY
)
SELECT {all the columns I want}
FROM {tables and joins}
INNER JOIN Ord_CTE ON {primary key column(s)}
ORDER BY {column(s)}
我不保证这会在您的情况下起作用(我曾在需要动态排序和分页的情况下使用过这种情况),但是值得尝试。