首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何通过/偏移优化最终订单的UNION

如何通过/偏移优化最终订单的UNION
EN

Stack Overflow用户
提问于 2018-09-05 13:43:19
回答 1查看 1.1K关注 0票数 1

我在一个网页(用datatable.js)上找到了一个复杂的表,它与三个不同的“源”一起使用。此datatable在前面分页,但后面不分页。

我想让服务器处理分页,我的请求可以工作,但是我想优化它:

代码语言:javascript
复制
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

我的真正代码更复杂,但这里您对我的问题有了主要的了解。

S1S2S3可能各有1000行,但最后我只需要50行,知道如何提高效率吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-09-05 14:05:08

确保所有三个表都有带有(titi, toto)列的索引。

代码语言:javascript
复制
create index ix1 on s1 (titi, toto);
create index ix2 on s2 (titi, toto);
create index ix3 on s3 (titi, toto);

然后,查询可能如下所示:

代码语言:javascript
复制
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,因为它更高效。
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52186658

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档