重庆思庄Oracle、KingBase、PostgreSQL、Redhat认证学习论坛
标题:
[Oracle]数据库内部关系的优先级
[打印本页]
作者:
Inkcup
时间:
2025-9-13 10:45
标题:
[Oracle]数据库内部关系的优先级
1. 对象依赖关系的优先级(逻辑层面)------------------------------------------------------------------------------
这是最常见的“关系”理解,指数据库对象(如表、视图、过程等)之间的依赖关系。其优先级体现在创建、修改和删除的顺序上。
核心规则:被依赖者优先(先创建,后删除)。
优先级从高到低(即创建顺序)通常为:
用户(USER)/模式(SCHEMA):所有对象都必须属于一个用户。
CREATE USER -> GRANT privileges -> 创建其他对象
表空间(TABLESPACE):存储表的物理空间。
CREATE TABLESPACE -> 然后可以在创建表时指定该表空间。
表(TABLE):存储数据的核心对象。视图、函数、过程等都依赖于它。
CREATE TABLE -> 然后才能创建基于它的其他对象。
约束(CONSTRAINTS):依赖于表。
PRIMARY KEY, FOREIGN KEY, UNIQUE, CHECK 约束在表创建时或之后添加 (ALTER TABLE ... ADD CONSTRAINT)。
索引(INDEX):依赖于表(或簇)。通常用于提高查询速度和强制唯一性。
可以在创建约束(如PRIMARY KEY)时自动创建,或之后手动创建 (CREATE INDEX)。
视图(VIEW):依赖于一个或多个表(或其他视图)。
CREATE VIEW -> 视图的定义SQL依赖于底层表。
同义词(SYNONYM):依赖于其他对象(表、视图、过程等),为其提供别名。
CREATE SYNONYM -> 指向已存在的对象。
存储程序(PROCEDURE, FUNCTION, PACKAGE):依赖于表、视图等。
它们的代码中引用了其他对象。
触发器(TRIGGER):依赖于表或视图。
它们被定义在特定的表上,响应其DML操作。
删除时的优先级则完全相反:必须先删除依赖别人的对象,才能删除被依赖的对象。
例如:必须先 DROP VIEW my_view;,然后才能 DROP TABLE my_table;。
2. SQL语句执行顺序的优先级(执行层面)------------------------------------------------------------------------------
这决定了一个SQL查询(特别是SELECT)的结果是如何一步步产生的。理解这个顺序对编写正确高效的SQL至关重要。
执行顺序(优先级)从高到低:
FROM 和 JOIN:首先确定数据来源,并连接所有相关的表。
WHERE:然后对FROM和JOIN后的结果集进行过滤,排除不满足条件的行。
GROUP BY:对过滤后的行进行分组。
HAVING:对分组后的结果集进行过滤(与WHERE不同,WHERE过滤行,HAVING过滤组)。
SELECT:选择要返回的列,并计算任何字段别名或表达式。
窗口函数(如 OVER, RANK):在SELECT之后执行,对结果集进行窗口计算。
ORDER BY:最后对最终的结果集进行排序。
OFFSET / FETCH 或 ROWNUM:执行分页限制,这是最后一步。
注意:这是逻辑执行顺序,并非实际的物理执行计划。Oracle优化器可能会为了性能而调整步骤,但最终结果必须与遵循此逻辑顺序的结果一致。
3. 运算符的优先级(表达式层面)------------------------------------------------------------------------------
当在一个表达式中使用多个运算符时,Oracle会按照预先定义的优先级顺序来计算。
优先级从高到低:
优先级 运算符 描述
1 **, +(正), -(负), PRIOR, CONNECT_BY_ROOT 指数、一元运算符、层次查询
2 *, / 乘、除
3 +(加), -(减), || 加、减、字符串连接
4 =, !=, <, >, <=, >=, LIKE, BETWEEN, IN, IS 比较操作
5 NOT 逻辑非
6 AND 逻辑与
7 OR 逻辑或
示例:
WHERE NOT salary > 5000 AND department_id = 10 OR department_id = 20
这个条件会让人困惑。根据优先级,它等价于:
( (NOT (salary > 5000) ) AND (department_id = 10) ) OR (department_id = 20)
为了清晰,强烈建议使用括号 () 来明确指定优先级,而不是依赖记忆:
WHERE ( (NOT (salary > 5000)) AND (department_id = 10) ) OR (department_id = 20)
4. 事务隔离级别的“优先级”(并发控制层面)------------------------------------------------------------------------------
在并发事务中,不同隔离级别决定了事务之间“看到”数据的优先级和规则。虽然不叫优先级,但隔离级别从低到高定义了数据一致性的“强度”。
READ UNCOMMITTED:Oracle不支持。会读到脏数据。
READ COMMITTED(Oracle默认级别):只能读取已提交的数据。避免了脏读。
REPEATABLE READ:Oracle不直接提供,但通过其他机制(如乐观锁)实现类似效果。确保在同一事务中多次读取同一数据结果一致。
SERIALIZABLE:最高隔离级别。事务串行执行,完全避免脏读、不可重复读和幻读。
“优先级”体现在:更高级别的隔离性会降低并发性能(因为它需要锁定更多资源或使用多版本控制来维护数据的一致性版本),但保证了更高的数据准确性和一致性。DBA需要根据业务需求在性能和一致性之间做出权衡。
总结------------------------------------------------------------------------------------------------------------------------------------------------------------
在Oracle数据库中谈论“关系的优先级”,需要根据上下文来确定所指的维度:
设计数据库时,需考虑对象依赖关系的优先级。
编写和优化SQL时,需理解SQL执行顺序的优先级和运算符的优先级。
处理高并发场景时,需权衡事务隔离级别带来的数据一致性与性能的“优先级”。
欢迎光临 重庆思庄Oracle、KingBase、PostgreSQL、Redhat认证学习论坛 (http://bbs.cqsztech.com/)
Powered by Discuz! X3.2