我在一个网页上有一个复杂的表(带有datatable.js),该表使用3种不同的“源”。该数据表在前部分页,但在后部则没有。
我想对服务器进行分页处理,我的请求有效,但是我想对其进行优化:
SELECT toto, titi
FROM
(SELECT toto, titi
FROM S1
UNION
SELECT toto, titi
FROM S2
UNION
SELECT toto, titi
FROM S3)
ORDER BY titi, toto
OFFSET 50 ROWS FETCH NEXT 50 ROWS ONLY
我的真实代码更加复杂,但是您在这里有了我的问题的主要思想。
S1
,S2
和S3
可能分别有1 000 000行,但最后我只需要50行,关于如何提高效率的任何想法? / p>
答案 0 :(得分:1)
请确保您在所有三个表上的索引为T
。
(titi, toto)
然后查询看起来像:
create index ix1 on s1 (titi, toto);
create index ix2 on s2 (titi, toto);
create index ix3 on s3 (titi, toto);
在任何情况下,对于高select *
from (
select toto, titi from s1 order by titi, toto
fetch next (50 + 50) rows only
union all
select toto, titi from s2 order by titi, toto
fetch next (50 + 50) rows only
union all
select toto, titi from s3 order by titi, toto
fetch next (50 + 50) rows only
) x
order by titi, toto
offset 50 rows fetch next 50 rows only
而言,分页策略都效率很低。我上面的查询仍然可以有所作为。
对该查询的主要改进是:
OFFSET
代替UNION ALL
,因为它更有效。