如何使用最终ORDER BY / OFFSET优化UNION

时间:2018-09-05 13:43:20

标签: sql sql-server pagination union

我在一个网页上有一个复杂的表(带有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

我的真实代码更加复杂,但是您在这里有了我的问题的主要思想。

S1S2S3可能分别有1 000 000行,但最后我只需要50行,关于如何提高效率的任何想法? / p>

1 个答案:

答案 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,因为它更有效。