
# Sort
#### 算子说明
对底层节点返回的元组进行排序。Sort算子的作用是将查询结果按照指定的排序规则进行排序，然后返回有序的结果集。
#### 典型场景
- 当查询语句中包含order by子句时，GaussDB会在执行计划中选择sort算子来进行排序操作。
- 采用MergeJoin来进行连接操作。
 
#### 示例
**示例：**查询语句中包含ORDER BY子句。
```
--数据准备。 
gaussdb=# CREATE TABLE student(id integer, class_id integer, grade number); 
CREATE TABLE 
gaussdb=# INSERT INTO student VALUES(generate_series(1,50), 1, floor(100 * random())); 
INSERT 0 50 
gaussdb=# INSERT INTO student VALUES(generate_series(51,100), 2, floor(100 * random())); 
INSERT 0 50 
gaussdb=# INSERT INTO student VALUES(generate_series(101,150), 3, floor(100 * random())); 
INSERT 0 50 
gaussdb=# INSERT INTO student VALUES(generate_series(151,200), 3, floor(100 * random())); 
INSERT 0 50
--执行结果。 
gaussdb=# EXPLAIN SELECT * FROM student ORDER BY grade; 
                              QUERY PLAN
----------------------------------------------------------------------
 Streaming (type: GATHER)  (cost=14.18..14.62 rows=21 width=40)
   Merge Sort Key: grade
   Node/s: All datanodes
   ->  Sort  (cost=13.37..13.40 rows=21 width=40)
         Sort Key: grade
         ->  Seq Scan on student  (cost=0.00..13.13 rows=20 width=40)
(6 rows)
--删除。
gaussdb=# DROP TABLE student;
```
上述示例中，Sort算子输出信息如下所示。
| 信息名称     | 含义                        |
|:---|:---|
| Sort     | 算子的名称。                    |
| Sort Key | Sort算子排序的依据关键字。示例中为grade。 |
   
**示例：**采用MergeJoin来进行连接操作。
```
--数据准备。 
gaussdb=# DROP TABLE IF EXISTS t1;
gaussdb=# DROP TABLE IF EXISTS t2;
gaussdb=# CREATE TABLE t1(id int,info text); 
CREATE TABLE 
gaussdb=# CREATE TABLE t2(id int,info text); 
CREATE TABLE 
gaussdb=# INSERT INTO t2 SELECT generate_series(1,100000),'bill'||generate_series(1,100000); 
INSERT 0 100000 
gaussdb=# INSERT INTO t1 SELECT generate_series(1,100000),'bill'||generate_series(1,100000); 
INSERT 0 100000
--收集统计信息。
gaussdb=# ANALYZE t1;
gaussdb=# ANALYZE t2;
--执行结果。 
gaussdb=# EXPLAIN SELECT /*+ MERGEJOIN(t2 t1) */ * FROM t2 JOIN t1 ON (t1.id=t2.id); 
                                 QUERY PLAN
----------------------------------------------------------------------------
 Streaming (type: GATHER)  (cost=9352.82..15036.32 rows=100000 width=26)
   Node/s: All datanodes
   ->  Merge Join  (cost=9348.82..10348.82 rows=100000 width=26)
         Merge Cond: (t2.id = t1.id)
         ->  Sort  (cost=4674.41..4799.41 rows=100000 width=13)
               Sort Key: t2.id
               ->  Seq Scan on t2  (cost=0.00..772.00 rows=100000 width=13)
         ->  Sort  (cost=4674.41..4799.41 rows=100000 width=13)
               Sort Key: t1.id
               ->  Seq Scan on t1  (cost=0.00..772.00 rows=100000 width=13)
(10 rows)
--删除。
gaussdb=# DROP TABLE t1,t2;
```
