我在一个网页(用datatable.js)上找到了一个复杂的表,它与三个不同的“源”一起使用。此datatable在前面分页,但后面不分页。
我想让服务器处理分页,我的请求可以工作,但是我想优化它:
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可能各有1000行,但最后我只需要50行,知道如何提高效率吗?
发布于 2018-09-05 14:05:08
确保所有三个表都有带有(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而不是UNION,因为它更高效。https://stackoverflow.com/questions/52186658
复制相似问题