Oracle排序一种实现不参与的方式(oracle不参与排序)
Oracle排序:一种实现不参与的方式
在日常生活中,我们经常会需要对数据进行排序操作。而对于数据库系统来说,排序更是一项基本操作。在Oracle数据库中,排序的实现方式有很多种,其中一种比较特殊的方式是实现不参与排序。
在这种方式下,排序操作不会直接参与到排序中,而是在最后输出结果时再进行排序处理。这样做的好处是可以提高排序的效率,尤其是在处理大数据量时更为明显。
下面通过一个实例来演示这种实现方式。
创建一个测试表student,包含学号(sid)和分数(score)两个字段:
CREATE TABLE student(
sid INT PRIMARY KEY,score INT NOT NULL
);
插入测试数据,共100万条:
DECLARE
i NUMBER;BEGIN
FOR i IN 1 .. 1000000 LOOPINSERT INTO student(sid, score)
VALUES(i, ROUND(DBMS_RANDOM.VALUE(1, 100), 0));COMMIT;
END LOOP;END;
然后,使用SQL语句查询所有学生的信息,并输出结果。这里使用了ORDER BY语句对结果进行排序,但并没有使用“实现不参与”的方式。
SELECT * FROM student ORDER BY score DESC;
结果:
![](https://cdn.jsdelivr.net/gh/Misty-PEi/images/20211110002918.png)
查询耗时:
![](https://cdn.jsdelivr.net/gh/Misty-PEi/images/20211110003807.png)
可以看到,查询结果正确,但是查询耗时较长,需要进行优化。
接下来,使用实现不参与的方式来查询同样的数据:
SELECT * FROM (
SELECT /*+ NO_MERGE */ * FROM student) ORDER BY score DESC;
结果:
![](https://cdn.jsdelivr.net/gh/Misty-PEi/images/20211110000958.png)
查询耗时:
![](https://cdn.jsdelivr.net/gh/Misty-PEi/images/20211110000922.png)
可以看到,查询结果和上面的查询结果完全一致,但是查询时间大大缩短,从原来的8秒左右降至2秒左右。
上述SQL语句中,关键在于NO_MERGE提示,其含义是告诉Oracle查询优化器不要使用合并(MERGE)操作,而是将子查询的结果直接输出。这样,就可以实现不参与的排序方式。
在进行优化时,应当根据实际情况选择是否采用该方式,因为该方式并不适用于所有情况,例如当所查询的结果较小时,优化效果就不会很明显。
总体来说,实现不参与的方式是一种非常实用的优化方式,可以在处理大数据量时提高查询效率,特别是在排序操作上。使用该方法需要注意合理的SQL编写,以便达到最优效果。