KingbaseES 数据库使用Limit子句查询结果返回顺序不一致
一、KingbaseES数据库limit查询子句:
在KingbaseES数据库使用LIMIT子句限制查询结果的行数,从而实现分段显示数据的功能。
使用LIMIT子句在KingbaseES数据库中进行查询结果行数限制:
语法格式为:
SELECT * FROM table_name LIMIT row_count OFFSET offset;
--row_count表示每页显示的行数,offset表示从第几行开始显示。
--例如,如果要查询第二页的数据,每页显示10行,可以写为
SELECT * FROM table_name LIMIT 10 OFFSET 10;
二、使用limit子句限制查询结果的行数:
1:准备测试环境:
CREATE TABLE public.t1 (
order_no integer not null,
workid character varying(50 char) not null,
id character varying(50 char),
specificworkarrangement character varying(2000 char),
last_feedback_time character varying(50 char) not null
);
INSERT INTO public.t1 VALUES (2, 'bba0e34a98c842a5b5cd0f5b05b5f589', '1646713438360268802', '李强测试安排-02', '2023-04-17 16:42:06');
INSERT INTO public.t1 VALUES (4, 'f530d705b0ff4f278d9c8ca3085f55ca', '1646714576224612354', '高晶测试安排-04', '2023-04-17 16:42:06');
INSERT INTO public.t1 VALUES (1, 'fd9317e8597d4757ac9d7cee57283ed5', '1646713389349826561', '李强测试安排-01', '2023-04-17 16:42:06');
INSERT INTO public.t1 VALUES (1, 'fd9317e8597d4757ac9d7cee57283ed5', '1646713785514422273', '田辰测试安排-01', '2023-04-17 16:42:06');
INSERT INTO public.t1 VALUES (4, 'f530d705b0ff4f278d9c8ca3085f55ca', '1646713217895067650', '董辉测试安排-04', '2023-04-17 16:42:06');
INSERT INTO public.t1 VALUES (4, 'f530d705b0ff4f278d9c8ca3085f55ca', '1646713932243759106', '田辰测试安排-04', '2023-04-17 16:42:06');
INSERT INTO public.t1 VALUES (2, 'bba0e34a98c842a5b5cd0f5b05b5f589', '1646714421022781441', '高晶测试安排-02', '2023-04-17 16:42:06');
INSERT INTO public.t1 VALUES (2, 'bba0e34a98c842a5b5cd0f5b05b5f589', '1646713121581264897', '董辉测试安排-02', '2023-04-17 16:42:06');
INSERT INTO public.t1 VALUES (3, '54819e7ba7d7424d9df5ed851c9e69de', '1646714834161725442', '赵琦测试安排-03', '2023-04-17 16:42:06');
INSERT INTO public.t1 VALUES (1, 'fd9317e8597d4757ac9d7cee57283ed5', '1646716902939258881', '杨云测试安排-01', '2023-04-17 16:42:06');
INSERT INTO public.t1 VALUES (4, 'f530d705b0ff4f278d9c8ca3085f55ca', '1646713581792882690', '李强测试安排-04', '2023-04-17 16:42:06');
INSERT INTO public.t1 VALUES (2, 'bba0e34a98c842a5b5cd0f5b05b5f589', '1646713829130989570', '田辰测试安排-02', '2023-04-17 16:42:06');
INSERT INTO public.t1 VALUES (3, '54819e7ba7d7424d9df5ed851c9e69de', '1646713878858657794', '田辰测试安排-03', '2023-04-17 16:42:06');
INSERT INTO public.t1 VALUES (2, 'bba0e34a98c842a5b5cd0f5b05b5f589', '1646716953950384129', '杨云测试安排-02', '2023-04-17 16:42:06');
INSERT INTO public.t1 VALUES (3, '54819e7ba7d7424d9df5ed851c9e69de', '1646717012012134401', '杨云测试安排-03', '2023-04-17 16:42:06');
INSERT INTO public.t1 VALUES (4, 'f530d705b0ff4f278d9c8ca3085f55ca', '1646717059625873409', '杨云测试安排-04', '2023-04-17 16:42:06');
INSERT INTO public.t1 VALUES (1, 'fd9317e8597d4757ac9d7cee57283ed5', '1646714734073049089', '赵琦测试安排-01', '2023-04-17 16:42:06');
INSERT INTO public.t1 VALUES (3, '54819e7ba7d7424d9df5ed851c9e69de', '1646713535290634242', '李强测试安排-03', '2023-04-17 16:42:06');
INSERT INTO public.t1 VALUES (1, 'fd9317e8597d4757ac9d7cee57283ed5', '1646712945626017793', '董辉测试安排-01', '2023-04-17 16:42:06');
INSERT INTO public.t1 VALUES (1, 'fd9317e8597d4757ac9d7cee57283ed5', '1646714368967274497', '高晶测试安排-01', '2023-04-17 16:42:06');
INSERT INTO public.t1 VALUES (3, '54819e7ba7d7424d9df5ed851c9e69de', '1646713175176081409', '董辉测试安排-03', '2023-04-17 16:42:06');
INSERT INTO public.t1 VALUES (2, 'bba0e34a98c842a5b5cd0f5b05b5f589', '1646714788343148545', '赵琦测试安排-02', '2023-04-17 16:42:06');
INSERT INTO public.t1 VALUES (3, '54819e7ba7d7424d9df5ed851c9e69de', '1646714510139158529', '高晶测试安排-03', '2023-04-17 16:42:06');
INSERT INTO public.t1 VALUES (4, 'f530d705b0ff4f278d9c8ca3085f55ca', '1646714882677239809', '赵琦测试安排-04', '2023-04-17 16:42:06');
2:使用order by和limit子句限制查询结果的行数:
排序列无索引:
--查询10条数据
test=# select ctid,* from t1 order by order_no limit 10;
CTID | ORDER_NO | WORKID | ID | SPECIFICWORKARRANGEMENT | LAST_FEEDBACK_TIME
--------+----------+----------------------------------+---------------------+-------------------------+---------------------
(0,19) | 1 | fd9317e8597d4757ac9d7cee57283ed5 | 1646712945626017793 | 董辉测试安排-01 | 2023-04-17 16:42:06
(0,4) | 1 | fd9317e8597d4757ac9d7cee57283ed5 | 1646713785514422273 | 田辰测试安排-01 | 2023-04-17 16:42:06
(0,20) | 1 | fd9317e8597d4757ac9d7cee57283ed5 | 1646714368967274497 | 高晶测试安排-01 | 2023-04-17 16:42:06
(0,10) | 1 | fd9317e8597d4757ac9d7cee57283ed5 | 1646716902939258881 | 杨云测试安排-01 | 2023-04-17 16:42:06
(0,3) | 1 | fd9317e8597d4757ac9d7cee57283ed5 | 1646713389349826561 | 李强测试安排-01 | 2023-04-17 16:42:06
(0,17) | 1 | fd9317e8597d4757ac9d7cee57283ed5 | 1646714734073049089 | 赵琦测试安排-01 | 2023-04-17 16:42:06
(0,7) | 2 | bba0e34a98c842a5b5cd0f5b05b5f589 | 1646714421022781441 | 高晶测试安排-02 | 2023-04-17 16:42:06
(0,1) | 2 | bba0e34a98c842a5b5cd0f5b05b5f589 | 1646713438360268802 | 李强测试安排-02 | 2023-04-17 16:42:06
(0,8) | 2 | bba0e34a98c842a5b5cd0f5b05b5f589 | 1646713121581264897 | 董辉测试安排-02 | 2023-04-17 16:42:06
(0,12) | 2 | bba0e34a98c842a5b5cd0f5b05b5f589 | 1646713829130989570 | 田辰测试安排-02 | 2023-04-17 16:42:06
(10 rows)
--执行计划
test=# explain analyze select ctid,* from t1 order by order_no limit 10;
QUERY PLAN
-------------------------------------------------------------------------------------------------------------
Limit (cost=12.84..12.87 rows=10 width=880) (actual time=0.037..0.040 rows=10 loops=1)
-> Sort (cost=12.84..13.07 rows=90 width=880) (actual time=0.036..0.037 rows=10 loops=1)
Sort Key: order_no
Sort Method: top-N heapsort Memory: 27kB
-> Seq Scan on t1 (cost=0.00..10.90 rows=90 width=880) (actual time=0.012..0.020 rows=24 loops=1)
Planning Time: 0.077 ms
Execution Time: 0.060 ms
(7 rows)
--查询13条数据
test=# select ctid,* from t1 order by order_no limit 13;
CTID | ORDER_NO | WORKID | ID | SPECIFICWORKARRANGEMENT | LAST_FEEDBACK_TIME
--------+----------+----------------------------------+---------------------+-------------------------+---------------------
(0,3) | 1 | fd9317e8597d4757ac9d7cee57283ed5 | 1646713389349826561 | 李强测试安排-01 | 2023-04-17 16:42:06
(0,4) | 1 | fd9317e8597d4757ac9d7cee57283ed5 | 1646713785514422273 | 田辰测试安排-01 | 2023-04-17 16:42:06
(0,20) | 1 | fd9317e8597d4757ac9d7cee57283ed5 | 1646714368967274497 | 高晶测试安排-01 | 2023-04-17 16:42:06
(0,10) | 1 | fd9317e8597d4757ac9d7cee57283ed5 | 1646716902939258881 | 杨云测试安排-01 | 2023-04-17 16:42:06
(0,17) | 1 | fd9317e8597d4757ac9d7cee57283ed5 | 1646714734073049089 | 赵琦测试安排-01 | 2023-04-17 16:42:06
(0,19) | 1 | fd9317e8597d4757ac9d7cee57283ed5 | 1646712945626017793 | 董辉测试安排-01 | 2023-04-17 16:42:06
(0,12) | 2 | bba0e34a98c842a5b5cd0f5b05b5f589 | 1646713829130989570 | 田辰测试安排-02 | 2023-04-17 16:42:06
(0,14) | 2 | bba0e34a98c842a5b5cd0f5b05b5f589 | 1646716953950384129 | 杨云测试安排-02 | 2023-04-17 16:42:06
(0,7) | 2 | bba0e34a98c842a5b5cd0f5b05b5f589 | 1646714421022781441 | 高晶测试安排-02 | 2023-04-17 16:42:06
(0,8) | 2 | bba0e34a98c842a5b5cd0f5b05b5f589 | 1646713121581264897 | 董辉测试安排-02 | 2023-04-17 16:42:06
(0,22) | 2 | bba0e34a98c842a5b5cd0f5b05b5f589 | 1646714788343148545 | 赵琦测试安排-02 | 2023-04-17 16:42:06
(0,1) | 2 | bba0e34a98c842a5b5cd0f5b05b5f589 | 1646713438360268802 | 李强测试安排-02 | 2023-04-17 16:42:06
(0,13) | 3 | 54819e7ba7d7424d9df5ed851c9e69de | 1646713878858657794 | 田辰测试安排-03 | 2023-04-17 16:42:06
(13 rows)
--执行计划
test=# explain analyze select ctid,* from t1 order by order_no limit 13;
QUERY PLAN
-------------------------------------------------------------------------------------------------------------
Limit (cost=13.02..13.05 rows=13 width=880) (actual time=0.035..0.039 rows=13 loops=1)
-> Sort (cost=13.02..13.24 rows=90 width=880) (actual time=0.034..0.036 rows=13 loops=1)
Sort Key: order_no
Sort Method: quicksort Memory: 28kB
-> Seq Scan on t1 (cost=0.00..10.90 rows=90 width=880) (actual time=0.012..0.020 rows=24 loops=1)
Planning Time: 0.083 ms
Execution Time: 0.060 ms
(7 rows)
--查询15条数据
test=# select ctid,* from t1 order by order_no limit 15;
CTID | ORDER_NO | WORKID | ID | SPECIFICWORKARRANGEMENT | LAST_FEEDBACK_TIME
--------+----------+----------------------------------+---------------------+-------------------------+---------------------
(0,3) | 1 | fd9317e8597d4757ac9d7cee57283ed5 | 1646713389349826561 | 李强测试安排-01 | 2023-04-17 16:42:06
(0,4) | 1 | fd9317e8597d4757ac9d7cee57283ed5 | 1646713785514422273 | 田辰测试安排-01 | 2023-04-17 16:42:06
(0,20) | 1 | fd9317e8597d4757ac9d7cee57283ed5 | 1646714368967274497 | 高晶测试安排-01 | 2023-04-17 16:42:06
(0,10) | 1 | fd9317e8597d4757ac9d7cee57283ed5 | 1646716902939258881 | 杨云测试安排-01 | 2023-04-17 16:42:06
(0,17) | 1 | fd9317e8597d4757ac9d7cee57283ed5 | 1646714734073049089 | 赵琦测试安排-01 | 2023-04-17 16:42:06
(0,19) | 1 | fd9317e8597d4757ac9d7cee57283ed5 | 1646712945626017793 | 董辉测试安排-01 | 2023-04-17 16:42:06
(0,12) | 2 | bba0e34a98c842a5b5cd0f5b05b5f589 | 1646713829130989570 | 田辰测试安排-02 | 2023-04-17 16:42:06
(0,14) | 2 | bba0e34a98c842a5b5cd0f5b05b5f589 | 1646716953950384129 | 杨云测试安排-02 | 2023-04-17 16:42:06
(0,7) | 2 | bba0e34a98c842a5b5cd0f5b05b5f589 | 1646714421022781441 | 高晶测试安排-02 | 2023-04-17 16:42:06
(0,8) | 2 | bba0e34a98c842a5b5cd0f5b05b5f589 | 1646713121581264897 | 董辉测试安排-02 | 2023-04-17 16:42:06
(0,22) | 2 | bba0e34a98c842a5b5cd0f5b05b5f589 | 1646714788343148545 | 赵琦测试安排-02 | 2023-04-17 16:42:06
(0,1) | 2 | bba0e34a98c842a5b5cd0f5b05b5f589 | 1646713438360268802 | 李强测试安排-02 | 2023-04-17 16:42:06
(0,13) | 3 | 54819e7ba7d7424d9df5ed851c9e69de | 1646713878858657794 | 田辰测试安排-03 | 2023-04-17 16:42:06
(0,9) | 3 | 54819e7ba7d7424d9df5ed851c9e69de | 1646714834161725442 | 赵琦测试安排-03 | 2023-04-17 16:42:06
(0,15) | 3 | 54819e7ba7d7424d9df5ed851c9e69de | 1646717012012134401 | 杨云测试安排-03 | 2023-04-17 16:42:06
(15 rows)
--执行计划
test=# explain analyze select ctid,* from t1 order by order_no limit 15;
QUERY PLAN
-------------------------------------------------------------------------------------------------------------
Limit (cost=13.11..13.15 rows=15 width=880) (actual time=0.046..0.050 rows=15 loops=1)
-> Sort (cost=13.11..13.33 rows=90 width=880) (actual time=0.046..0.047 rows=15 loops=1)
Sort Key: order_no
Sort Method: quicksort Memory: 28kB
-> Seq Scan on t1 (cost=0.00..10.90 rows=90 width=880) (actual time=0.011..0.020 rows=24 loops=1)
Planning Time: 0.077 ms
Execution Time: 0.073 ms
(7 rows)
通过以上结果可以看出:
在排序列无索引的场景下limit 10跟limit 13、limit 15结果返回的顺序是不同的。这是由于使用limit进行查询分页的时候,limit <= 10的时候数据库使用Top-N heapsort算法,limit > 10 的时候数据库使用memory sort或者disk sort进行排序,这种差异会导致在排序列无索引的场景下使用Top-N heapsort算法的跟使用memory sort或者disk sort返回顺序有差异(结果都是正确的)。
三、如何避免limit限制结果返回行数顺序不一致:
1:排序列无索引场景增加一个排序列,并且该列是唯一的
--查询10条数据
test=# select ctid,* from t1 order by order_no,id limit 10;
CTID | ORDER_NO | WORKID | ID | SPECIFICWORKARRANGEMENT | LAST_FEEDBACK_TIME
--------+----------+----------------------------------+---------------------+-------------------------+---------------------
(0,19) | 1 | fd9317e8597d4757ac9d7cee57283ed5 | 1646712945626017793 | 董辉测试安排-01 | 2023-04-17 16:42:06
(0,3) | 1 | fd9317e8597d4757ac9d7cee57283ed5 | 1646713389349826561 | 李强测试安排-01 | 2023-04-17 16:42:06
(0,4) | 1 | fd9317e8597d4757ac9d7cee57283ed5 | 1646713785514422273 | 田辰测试安排-01 | 2023-04-17 16:42:06
(0,20) | 1 | fd9317e8597d4757ac9d7cee57283ed5 | 1646714368967274497 | 高晶测试安排-01 | 2023-04-17 16:42:06
(0,17) | 1 | fd9317e8597d4757ac9d7cee57283ed5 | 1646714734073049089 | 赵琦测试安排-01 | 2023-04-17 16:42:06
(0,10) | 1 | fd9317e8597d4757ac9d7cee57283ed5 | 1646716902939258881 | 杨云测试安排-01 | 2023-04-17 16:42:06
(0,8) | 2 | bba0e34a98c842a5b5cd0f5b05b5f589 | 1646713121581264897 | 董辉测试安排-02 | 2023-04-17 16:42:06
(0,1) | 2 | bba0e34a98c842a5b5cd0f5b05b5f589 | 1646713438360268802 | 李强测试安排-02 | 2023-04-17 16:42:06
(0,12) | 2 | bba0e34a98c842a5b5cd0f5b05b5f589 | 1646713829130989570 | 田辰测试安排-02 | 2023-04-17 16:42:06
(0,7) | 2 | bba0e34a98c842a5b5cd0f5b05b5f589 | 1646714421022781441 | 高晶测试安排-02 | 2023-04-17 16:42:06
(10 rows)
--执行计划
test=# explain analyze select ctid,* from t1 order by order_no,id limit 10;
QUERY PLAN
-------------------------------------------------------------------------------------------------------------
Limit (cost=12.84..12.87 rows=10 width=880) (actual time=0.059..0.062 rows=10 loops=1)
-> Sort (cost=12.84..13.07 rows=90 width=880) (actual time=0.058..0.059 rows=10 loops=1)
Sort Key: order_no, id
Sort Method: top-N heapsort Memory: 27kB
-> Seq Scan on t1 (cost=0.00..10.90 rows=90 width=880) (actual time=0.017..0.024 rows=24 loops=1)
Planning Time: 0.141 ms
Execution Time: 0.085 ms
(7 rows)
--查询13条数据
test=# select ctid,* from t1 order by order_no,id limit 13;
CTID | ORDER_NO | WORKID | ID | SPECIFICWORKARRANGEMENT | LAST_FEEDBACK_TIME
--------+----------+----------------------------------+---------------------+-------------------------+---------------------
(0,19) | 1 | fd9317e8597d4757ac9d7cee57283ed5 | 1646712945626017793 | 董辉测试安排-01 | 2023-04-17 16:42:06
(0,3) | 1 | fd9317e8597d4757ac9d7cee57283ed5 | 1646713389349826561 | 李强测试安排-01 | 2023-04-17 16:42:06
(0,4) | 1 | fd9317e8597d4757ac9d7cee57283ed5 | 1646713785514422273 | 田辰测试安排-01 | 2023-04-17 16:42:06
(0,20) | 1 | fd9317e8597d4757ac9d7cee57283ed5 | 1646714368967274497 | 高晶测试安排-01 | 2023-04-17 16:42:06
(0,17) | 1 | fd9317e8597d4757ac9d7cee57283ed5 | 1646714734073049089 | 赵琦测试安排-01 | 2023-04-17 16:42:06
(0,10) | 1 | fd9317e8597d4757ac9d7cee57283ed5 | 1646716902939258881 | 杨云测试安排-01 | 2023-04-17 16:42:06
(0,8) | 2 | bba0e34a98c842a5b5cd0f5b05b5f589 | 1646713121581264897 | 董辉测试安排-02 | 2023-04-17 16:42:06
(0,1) | 2 | bba0e34a98c842a5b5cd0f5b05b5f589 | 1646713438360268802 | 李强测试安排-02 | 2023-04-17 16:42:06
(0,12) | 2 | bba0e34a98c842a5b5cd0f5b05b5f589 | 1646713829130989570 | 田辰测试安排-02 | 2023-04-17 16:42:06
(0,7) | 2 | bba0e34a98c842a5b5cd0f5b05b5f589 | 1646714421022781441 | 高晶测试安排-02 | 2023-04-17 16:42:06
(0,22) | 2 | bba0e34a98c842a5b5cd0f5b05b5f589 | 1646714788343148545 | 赵琦测试安排-02 | 2023-04-17 16:42:06
(0,14) | 2 | bba0e34a98c842a5b5cd0f5b05b5f589 | 1646716953950384129 | 杨云测试安排-02 | 2023-04-17 16:42:06
(0,21) | 3 | 54819e7ba7d7424d9df5ed851c9e69de | 1646713175176081409 | 董辉测试安排-03 | 2023-04-17 16:42:06
(13 rows)
--执行计划
test=# explain analyze select ctid,* from t1 order by order_no,id limit 13;
QUERY PLAN
-------------------------------------------------------------------------------------------------------------
Limit (cost=13.02..13.05 rows=13 width=880) (actual time=0.058..0.062 rows=13 loops=1)
-> Sort (cost=13.02..13.24 rows=90 width=880) (actual time=0.058..0.059 rows=13 loops=1)
Sort Key: order_no, id
Sort Method: quicksort Memory: 28kB
-> Seq Scan on t1 (cost=0.00..10.90 rows=90 width=880) (actual time=0.014..0.021 rows=24 loops=1)
Planning Time: 0.148 ms
Execution Time: 0.085 ms
(7 rows)
--查询15条数据
test=# select ctid,* from t1 order by order_no,id limit 15;
CTID | ORDER_NO | WORKID | ID | SPECIFICWORKARRANGEMENT | LAST_FEEDBACK_TIME
--------+----------+----------------------------------+---------------------+-------------------------+---------------------
(0,19) | 1 | fd9317e8597d4757ac9d7cee57283ed5 | 1646712945626017793 | 董辉测试安排-01 | 2023-04-17 16:42:06
(0,3) | 1 | fd9317e8597d4757ac9d7cee57283ed5 | 1646713389349826561 | 李强测试安排-01 | 2023-04-17 16:42:06
(0,4) | 1 | fd9317e8597d4757ac9d7cee57283ed5 | 1646713785514422273 | 田辰测试安排-01 | 2023-04-17 16:42:06
(0,20) | 1 | fd9317e8597d4757ac9d7cee57283ed5 | 1646714368967274497 | 高晶测试安排-01 | 2023-04-17 16:42:06
(0,17) | 1 | fd9317e8597d4757ac9d7cee57283ed5 | 1646714734073049089 | 赵琦测试安排-01 | 2023-04-17 16:42:06
(0,10) | 1 | fd9317e8597d4757ac9d7cee57283ed5 | 1646716902939258881 | 杨云测试安排-01 | 2023-04-17 16:42:06
(0,8) | 2 | bba0e34a98c842a5b5cd0f5b05b5f589 | 1646713121581264897 | 董辉测试安排-02 | 2023-04-17 16:42:06
(0,1) | 2 | bba0e34a98c842a5b5cd0f5b05b5f589 | 1646713438360268802 | 李强测试安排-02 | 2023-04-17 16:42:06
(0,12) | 2 | bba0e34a98c842a5b5cd0f5b05b5f589 | 1646713829130989570 | 田辰测试安排-02 | 2023-04-17 16:42:06
(0,7) | 2 | bba0e34a98c842a5b5cd0f5b05b5f589 | 1646714421022781441 | 高晶测试安排-02 | 2023-04-17 16:42:06
(0,22) | 2 | bba0e34a98c842a5b5cd0f5b05b5f589 | 1646714788343148545 | 赵琦测试安排-02 | 2023-04-17 16:42:06
(0,14) | 2 | bba0e34a98c842a5b5cd0f5b05b5f589 | 1646716953950384129 | 杨云测试安排-02 | 2023-04-17 16:42:06
(0,21) | 3 | 54819e7ba7d7424d9df5ed851c9e69de | 1646713175176081409 | 董辉测试安排-03 | 2023-04-17 16:42:06
(0,18) | 3 | 54819e7ba7d7424d9df5ed851c9e69de | 1646713535290634242 | 李强测试安排-03 | 2023-04-17 16:42:06
(0,13) | 3 | 54819e7ba7d7424d9df5ed851c9e69de | 1646713878858657794 | 田辰测试安排-03 | 2023-04-17 16:42:06
(15 rows)
--执行计划
test=# explain analyze select ctid,* from t1 order by order_no,id limit 15;
QUERY PLAN
-------------------------------------------------------------------------------------------------------------
Limit (cost=13.11..13.15 rows=15 width=880) (actual time=0.073..0.078 rows=15 loops=1)
-> Sort (cost=13.11..13.33 rows=90 width=880) (actual time=0.072..0.074 rows=15 loops=1)
Sort Key: order_no, id
Sort Method: quicksort Memory: 28kB
-> Seq Scan on t1 (cost=0.00..10.90 rows=90 width=880) (actual time=0.016..0.026 rows=24 loops=1)
Planning Time: 0.132 ms
Execution Time: 0.105 ms
(7 rows)
- 当ORDER BY子句应用于非唯一的列名时,数据可能会以非决定性(随机)的顺序返回结果。这在使用LIMIT和OFFSET时尤其是一个问题,因为它们可能会返回完全不同的结果。为了避免这种情况,建议在增加一个排序列,并且该列是唯一的,或者至少是在排序列的相同值中是唯一的。
- 如果查询没有使用order by排序(表没有主键、唯一索引),扫描器(scanner)在扫描时,会检查是否有 limit 子句,如果有就会记录已经返回的行数,并在达到 limit 的值时停止扫描,节省IO开销和内存消耗。
- limit 子句是通过扫描器(scanner)实现的,扫描器在扫描表或索引时,会检查是否有 limit 子句,如果有就会记录已经返回的行数,并在达到 limit 的值时停止扫描。
- limit 子句和 order by 子句是分开处理的,order by 子句会导致扫描器对所有符合条件的行进行排序,然后再应用 limit 子句。 order by 子句会增加排序的开销,而不会减少扫描器的开销。
2:对排序列添加索引限制查询结果返回行数:
--创建索引
create index t1_id_idx on t1(id);
create index t1_order_no_specificworkarrangement_idx on t1(order_no,specificworkarrangement);
test=# select * from t1 order by order_no limit 10;
ORDER_NO | WORKID | ID | SPECIFICWORKARRANGEMENT | LAST_FEEDBACK_TIME
----------+----------------------------------+---------------------+-------------------------+---------------------
1 | fd9317e8597d4757ac9d7cee57283ed5 | 1646713389349826561 | 李强测试安排-01 | 2023-04-17 16:42:06
1 | fd9317e8597d4757ac9d7cee57283ed5 | 1646716902939258881 | 杨云测试安排-01 | 2023-04-17 16:42:06
1 | fd9317e8597d4757ac9d7cee57283ed5 | 1646713785514422273 | 田辰测试安排-01 | 2023-04-17 16:42:06
1 | fd9317e8597d4757ac9d7cee57283ed5 | 1646712945626017793 | 董辉测试安排-01 | 2023-04-17 16:42:06
1 | fd9317e8597d4757ac9d7cee57283ed5 | 1646714734073049089 | 赵琦测试安排-01 | 2023-04-17 16:42:06
1 | fd9317e8597d4757ac9d7cee57283ed5 | 1646714368967274497 | 高晶测试安排-01 | 2023-04-17 16:42:06
2 | bba0e34a98c842a5b5cd0f5b05b5f589 | 1646713438360268802 | 李强测试安排-02 | 2023-04-17 16:42:06
2 | bba0e34a98c842a5b5cd0f5b05b5f589 | 1646716953950384129 | 杨云测试安排-02 | 2023-04-17 16:42:06
2 | bba0e34a98c842a5b5cd0f5b05b5f589 | 1646713829130989570 | 田辰测试安排-02 | 2023-04-17 16:42:06
2 | bba0e34a98c842a5b5cd0f5b05b5f589 | 1646713121581264897 | 董辉测试安排-02 | 2023-04-17 16:42:06
(10 rows)
test=# explain analyze select * from t1 order by order_no limit 10;
QUERY PLAN
--------------------------------------------------------------------------------------------------------------------------------
Limit (cost=0.14..5.63 rows=10 width=874) (actual time=0.018..0.023 rows=10 loops=1)
-> Index Scan using t1_order_no_specificworkarrangement_idx on t1 (cost=0.14..49.49 rows=90 width=874) (actual time=0.017..0.020 rows=10 loops=1)
Planning Time: 0.121 ms
Execution Time: 0.042 ms
(4 rows)
test=# explain analyze select * from t1 order by id limit 10;
QUERY PLAN
-------------------------------------------------------------------------------------------------------------------------
Limit (cost=0.14..5.63 rows=10 width=874) (actual time=0.011..0.020 rows=10 loops=1)
-> Index Scan using t1_id_idx on t1 (cost=0.14..49.49 rows=90 width=874) (actual time=0.010..0.018 rows=10 loops=1)
Planning Time: 0.091 ms
Execution Time: 0.038 ms
(4 rows)
test=#
test=#
test=# select * from t1 order by order_no limit 15;
ORDER_NO | WORKID | ID | SPECIFICWORKARRANGEMENT | LAST_FEEDBACK_TIME
----------+----------------------------------+---------------------+-------------------------+---------------------
1 | fd9317e8597d4757ac9d7cee57283ed5 | 1646713389349826561 | 李强测试安排-01 | 2023-04-17 16:42:06
1 | fd9317e8597d4757ac9d7cee57283ed5 | 1646716902939258881 | 杨云测试安排-01 | 2023-04-17 16:42:06
1 | fd9317e8597d4757ac9d7cee57283ed5 | 1646713785514422273 | 田辰测试安排-01 | 2023-04-17 16:42:06
1 | fd9317e8597d4757ac9d7cee57283ed5 | 1646712945626017793 | 董辉测试安排-01 | 2023-04-17 16:42:06
1 | fd9317e8597d4757ac9d7cee57283ed5 | 1646714734073049089 | 赵琦测试安排-01 | 2023-04-17 16:42:06
1 | fd9317e8597d4757ac9d7cee57283ed5 | 1646714368967274497 | 高晶测试安排-01 | 2023-04-17 16:42:06
2 | bba0e34a98c842a5b5cd0f5b05b5f589 | 1646713438360268802 | 李强测试安排-02 | 2023-04-17 16:42:06
2 | bba0e34a98c842a5b5cd0f5b05b5f589 | 1646716953950384129 | 杨云测试安排-02 | 2023-04-17 16:42:06
2 | bba0e34a98c842a5b5cd0f5b05b5f589 | 1646713829130989570 | 田辰测试安排-02 | 2023-04-17 16:42:06
2 | bba0e34a98c842a5b5cd0f5b05b5f589 | 1646713121581264897 | 董辉测试安排-02 | 2023-04-17 16:42:06
2 | bba0e34a98c842a5b5cd0f5b05b5f589 | 1646714788343148545 | 赵琦测试安排-02 | 2023-04-17 16:42:06
2 | bba0e34a98c842a5b5cd0f5b05b5f589 | 1646714421022781441 | 高晶测试安排-02 | 2023-04-17 16:42:06
3 | 54819e7ba7d7424d9df5ed851c9e69de | 1646713535290634242 | 李强测试安排-03 | 2023-04-17 16:42:06
3 | 54819e7ba7d7424d9df5ed851c9e69de | 1646717012012134401 | 杨云测试安排-03 | 2023-04-17 16:42:06
3 | 54819e7ba7d7424d9df5ed851c9e69de | 1646713878858657794 | 田辰测试安排-03 | 2023-04-17 16:42:06
(15 rows)
test=# explain analyze select * from t1 order by order_no limit 15;
QUERY PLAN
--------------------------------------------------------------------------------------------------------------------------------
Limit (cost=0.14..8.37 rows=15 width=874) (actual time=0.019..0.026 rows=15 loops=1)
-> Index Scan using t1_order_no_specificworkarrangement_idx on t1 (cost=0.14..49.49 rows=90 width=874) (actual time=0.018..0.022 rows=15 loops=1)
Planning Time: 0.095 ms
Execution Time: 0.045 ms
(4 rows)
test=#
test=# select * from t1 order by order_no limit 20;
ORDER_NO | WORKID | ID | SPECIFICWORKARRANGEMENT | LAST_FEEDBACK_TIME
----------+----------------------------------+---------------------+-------------------------+---------------------
1 | fd9317e8597d4757ac9d7cee57283ed5 | 1646713389349826561 | 李强测试安排-01 | 2023-04-17 16:42:06
1 | fd9317e8597d4757ac9d7cee57283ed5 | 1646716902939258881 | 杨云测试安排-01 | 2023-04-17 16:42:06
1 | fd9317e8597d4757ac9d7cee57283ed5 | 1646713785514422273 | 田辰测试安排-01 | 2023-04-17 16:42:06
1 | fd9317e8597d4757ac9d7cee57283ed5 | 1646712945626017793 | 董辉测试安排-01 | 2023-04-17 16:42:06
1 | fd9317e8597d4757ac9d7cee57283ed5 | 1646714734073049089 | 赵琦测试安排-01 | 2023-04-17 16:42:06
1 | fd9317e8597d4757ac9d7cee57283ed5 | 1646714368967274497 | 高晶测试安排-01 | 2023-04-17 16:42:06
2 | bba0e34a98c842a5b5cd0f5b05b5f589 | 1646713438360268802 | 李强测试安排-02 | 2023-04-17 16:42:06
2 | bba0e34a98c842a5b5cd0f5b05b5f589 | 1646716953950384129 | 杨云测试安排-02 | 2023-04-17 16:42:06
2 | bba0e34a98c842a5b5cd0f5b05b5f589 | 1646713829130989570 | 田辰测试安排-02 | 2023-04-17 16:42:06
2 | bba0e34a98c842a5b5cd0f5b05b5f589 | 1646713121581264897 | 董辉测试安排-02 | 2023-04-17 16:42:06
2 | bba0e34a98c842a5b5cd0f5b05b5f589 | 1646714788343148545 | 赵琦测试安排-02 | 2023-04-17 16:42:06
2 | bba0e34a98c842a5b5cd0f5b05b5f589 | 1646714421022781441 | 高晶测试安排-02 | 2023-04-17 16:42:06
3 | 54819e7ba7d7424d9df5ed851c9e69de | 1646713535290634242 | 李强测试安排-03 | 2023-04-17 16:42:06
3 | 54819e7ba7d7424d9df5ed851c9e69de | 1646717012012134401 | 杨云测试安排-03 | 2023-04-17 16:42:06
3 | 54819e7ba7d7424d9df5ed851c9e69de | 1646713878858657794 | 田辰测试安排-03 | 2023-04-17 16:42:06
3 | 54819e7ba7d7424d9df5ed851c9e69de | 1646713175176081409 | 董辉测试安排-03 | 2023-04-17 16:42:06
3 | 54819e7ba7d7424d9df5ed851c9e69de | 1646714834161725442 | 赵琦测试安排-03 | 2023-04-17 16:42:06
3 | 54819e7ba7d7424d9df5ed851c9e69de | 1646714510139158529 | 高晶测试安排-03 | 2023-04-17 16:42:06
4 | f530d705b0ff4f278d9c8ca3085f55ca | 1646713581792882690 | 李强测试安排-04 | 2023-04-17 16:42:06
4 | f530d705b0ff4f278d9c8ca3085f55ca | 1646717059625873409 | 杨云测试安排-04 | 2023-04-17 16:42:06
(20 rows)
test=# explain analyze select * from t1 order by order_no limit 20;
QUERY PLAN
--------------------------------------------------------------------------------------------------------------------------------
Limit (cost=0.14..11.11 rows=20 width=874) (actual time=0.018..0.026 rows=20 loops=1)
-> Index Scan using t1_order_no_specificworkarrangement_idx on t1 (cost=0.14..49.49 rows=90 width=874) (actual time=0.017..0.023 rows=20 loops=1)
Planning Time: 0.148 ms
Execution Time: 0.046 ms
(4 rows)
- 排序列无索引场景增加一个排序列,并且该列是唯一的或者至少在排序列的相同值中是唯一的查询分页符合预期结果。
- 在排序列有索引场景的查询分页数据库使用索引扫描来获取所需的行数,然后停止扫描,并且由于索引本身是有序的,保证了返回结果顺序的一致性。符合预期并且也可以节省IO开销和内存消耗。
四、总结
当ORDER BY子句应用于非唯一的列名时,数据块可能会以非决定性的顺序返回结果。这在使用LIMIT和OFFSET时尤其是一个问题,因为它们可能会返回完全不同的结果。为了避免这种情况,建议在一个列上使用一个并列,该列是唯一的,或者至少是在有序列的相同值中是唯一的。
limit 子句是通过扫描器(scanner)实现的,扫描器在扫描表或索引时,会检查是否有 limit 子句,如果有就会记录已经返回的行数,并在达到 limit 的值时停止扫描。
limit 子句和 order by 子句是分开处理的,order by 子句会导致扫描器对所有符合条件的行进行排序,然后再应用 limit 子句。这意味着 order by 子句会增加排序的开销,而不会减少扫描器的开销。
limit 子句和 offset 子句也是分开处理的,offset 子句会导致扫描器跳过指定数量的行,而不返回给客户端。这意味着 offset 子句会增加扫描器的开销,而不会减少数据传输的开销。
如果查询带有OFFSET子句,KingbaseES数据库需要先跳过指定的行数,然后再返回所需的行数,这样会增加扫描开销和内存消耗。
limit 子句和 offset 子句是分开处理的,offset 子句会导致扫描器跳过指定数量的行,而不返回给客户端。offset 子句会增加扫描器的开销,而不会减少数据传输的开销。
尽量避免使用复杂的排序条件,使用简单的索引列或主键进行排序。
KingbaseES 数据库使用Limit子句查询结果返回顺序不一致的更多相关文章
- laravel 查询数据返回的结果
laravel查询数据返回的结果 在插入数据库的时候,发现查询数据返回的结果是一个对象;即使是空数据 返回的不是true或者false 那么要判断该结果是否查询有结果 该如果呢? 学习源头: http ...
- SQL server 数据库基础语句 子查询 基础函数
上一章 说了下 子查询的意义是 把一条查询语句当做值来使用 select *from car //查询汽车的信息 假设我知道一个汽车的编号是 c021 但是我要查询 比这个汽车价格高的汽车信息 ...
- mongodb基础系列——数据库查询数据返回前台JSP(二)
上篇博客论述了,数据库查询数据返回前台JSP.博客中主要使用Ajax调用来显示JSON串,来获取其中某一个字段,赋给界面中的某一个控件. 那这篇博客中,我们讲解,把后台List传递JSP展示. Lis ...
- 数据库limit子句
limit子句:用来限定语句执行结果的偏移量,有一个或者两个参数:第一个参数表示返回结果首行偏移量,第二个参数表示最大返回行数.例如:SELECT * FROM employees ORDER BY ...
- Mysql查询语句的 where子句、group by子句、having子句、order by子句、limit子句
Mysql的各个查询语句 一.where子句 语法:select *|字段列表 from 表名 where 表达式.where子句后面往往配合MySQL运算符一起使用(做条件判断) 作用:通过限定 ...
- 数据库——DQL(语句查询)
查询的基本结构: 概念: 查询(DQL)是数据库中最为常用和复杂的一种SQL结构,学会编写查询SQL是程序员必须具备的能力. 要从数据库中查询数据,我们要使用SQL的SELECT语句.标准SELECT ...
- java数据库编程之高级查询
第三章:高级查询(-) 3.1:修改表 3.1.1:修改表 语法: Alter table <旧表名> rename [ TO] <新表名>; 例子:Alter table ` ...
- mysql数据库补充知识2 查询数据库记录信息之单表查询
一 单表查询的语法 SELECT 字段1,字段2... FROM 表名 WHERE 条件 GROUP BY field HAVING 筛选 ORDER BY field LIMIT 限制条数 二 关键 ...
- MySQL/MariaDB数据库的多表查询操作
MySQL/MariaDB数据库的多表查询操作 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.单表查询小试牛刀 [root@node105.yinzhengjie.org.cn ...
- [数据库]MySQL之SQL查询
一 关系表的介绍 * 课程表 * 学生表 * 选课表 二 SQL查询语句格式 /* SQL查询的一般格式 SELECT [ALL | DISTINCT] [* | coulmnNameA,coulmn ...
随机推荐
- centos7安装mailx
1.安装mailx yum install mailx -y 2.配置证书 mkdir -p /root/.certs echo -n | openssl s_client -connect smtp ...
- Spring rce CVE-2022-22965
原理大致是这样:spring框架在传参的时候会与对应实体类自动参数绑定,通过"."还可以访问对应实体类的引用类型变量.使用getClass方法,通过反射机制最终获取tomcat的日 ...
- 机器学习策略篇:详解正交化(Orthogonalization)
正交化 这是一张老式电视图片,有很多旋钮可以用来调整图像的各种性质,所以对于这些旧式电视,可能有一个旋钮用来调图像垂直方向的高度,另外有一个旋钮用来调图像宽度,也许还有一个旋钮用来调梯形角度,还有一个 ...
- 项目实战:Qt编译Qt库以及使用C#调用Qt库,并实现C#集成Qt的tcp客户端
需求 1.Qt已经开发了应用,封装成Qt库,以供C#调用. 2.Qt的tcp客户端封装,以供C#调用,双向传递数据. 原理 1.使用QtCreator编译msvc版本的Qt库: 2.使 ...
- beego中数据库表创建
package main import ( "fmt" "github.com/astaxie/beego/orm" _ "github.com/go ...
- Ubuntu18.04搭建Vue开发环境
更新软件源列表 sudo apt update nodejs安装 sudo apt install nodejs nodejs -v #查看版本 npm安装 sudo apt install npm ...
- 【Java复健指南10】OOP高级01-类变量、类方法和main
类变量 什么是类变量 类变量也叫静态变量/静态属性,是该类的所有对象共享的变量,任何一个该类的对象去访问它时,取到的都是相同的值,同样任何一个该类的对象去修改它时,修改的也是同一个变量. 如何定义类变 ...
- 我的第一个项目(七):(解决问题)Vue中canvas无法绘制图片
好家伙, 现在,我想要把我的飞机大战塞到我的主页里去,想办法把文件导入 然后,直接死在第一步,图片渲染都成问题 先用vue写一个测试文件 来测试canvas的绘制 <template> ...
- 【Azure 事件中心】Azure Event Hub客户端遇见 Expired Heartbeat 错误
问题描述 Azure Event Hub 在消费数端中,经常性遇见 Expired Heartbeat 错误 (consumer-xxxxxxxxxxxxx-c84873c6c828e8df6c843 ...
- 【Azure Redis 缓存】Azure Reids是否可以开启慢日志(slowlog)和执行config指令
问题描述 使用Azure Redis,是否可以开启慢日志来查看最近时间中执行比较耗时的指令呢? 同时,如何执行Redis的Config只能来修改配置呢? 根本原因 一:Azure Reids通过Red ...