暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

分布式数据库学习Note27:OceanBase社区版中,SORT 算子的用法?

SORT 算子用于对输入的数据进行排序。

示例:对 t1 表的数据排序,并按照 c1 列降序排列和 c2 列升序排列

obclient> CREATE TABLE t1(c1 INT, c2 INT);
Query OK, 0 rows affected

obclient> CREATE INDEX i1 ON t1(c1);
Query OK, 0 rows affected

obclient> EXPLAIN SELECT c1 FROM t1 ORDER BY c1 DESC, c2 ASC\G
*************************** 1. row ***************************

Query Plan: 
================================================
|ID|OPERATOR   |NAME          |EST. ROWS|COST  |
------------------------------------------------
|0 |SORT       |              |100000   |563390|
|1 | TABLE SCAN|T1(I1,Reverse)|100000   |385811|
================================================

Outputs & filters:
-------------------------------------
  0 - output([T1.C1]), filter(nil), sort_keys([T1.C1, DESC], [T1.C2, ASC]), prefix_pos(1)
  1 - output([T1.C1], [T1.C2]), filter(nil),
      access([T1.C1], [T1.C2]), partitions(p0)

1 row in set

上述示例中,执行计划展示中 0 号算子 SORT 对 t1 表的数据进行排序,执行计划展示中的 outputs & filters 详细展示了 SORT 算子的输出信息如下:

信息名称含义
output该算子的输出列。
filter该算子的过滤谓词。 由于示例中 SORT 算子没有设置 filter,所以为 nil
sort_keys([column, DESC],[column, ASC] ...)按 column 列排序。
  • DESC:降序排列。
  • ASC:升序排列。
例如,sort_keys([t1.c1, DESC],[t1.c2, ASC]) 中指定排序键分别为 c1 列和 c2 列,并且以 c1 列降序, c2 列升序排列。
prefix_pos(n)排序列的有序位置。 例如,sort_keys([t1.c1, DESC], [t1.c2, ASC]),prefix_pos(1) 表示 t1 表的数据在 c1 列上有序,仅需要对 c2 列排序。

如果 ORDER BY 语句块后面还有 LIMIT(仅适用于 MySQL 模式)语句,优化器会进一步优化执行计划,生成 TOP-N SORT算子,即采用堆排序来选择 TOP-N 的数据,示例如下:

obclient> EXPLAIN SELECT * FROM t1 WHERE c1 > 1 ORDER BY c1,c2 LIMIT 10\G
*************************** 1. row ***************************
Query Plan: 
========================================
|ID|OPERATOR    |NAME  |EST. ROWS|COST |
----------------------------------------
|0 |LIMIT       |      |10       |42432|
|1 | TOP-N SORT |      |10       |42431|
|2 |  TABLE SCAN|t1(i1)|10000    |41764|
========================================

Outputs & filters:
-------------------------------------
  0 - output([t1.c1], [t1.c2]), filter(nil), limit(10), offset(nil)
  1 - output([t1.c1], [t1.c2]), filter(nil), sort_keys([t1.c1, ASC], [t1.c2, ASC]), topn(10), prefix_pos(1)
  2 - output([t1.c1], [t1.c2]), filter(nil),
      access([t1.c1], [t1.c2]), partitions(p0)

1 row in set

上述示例的执行计划展示中,topn(10) 表示 LIMIT 10 需要的数据量。

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论