Oracle
执行计划
使用 EXPLAIN PLAN
得到 SQL 语句的执行计划:
EXPLAIN PLAN FOR SELECT * FROM emp WHERE deptno = 10 ORDER BY ename;
SELECT plan_table_output FROM TABLE(DBMS_XPLAN.DISPLAY('PLAN_TABLE'));
-- 或者
SELECT * from table(dbms_xplan.display);
Oracle 执行计划显示的是一个树形结构,其阐述了 SQL 引擎执行操作的顺序,树的每一个节点代表一个操作:表访问、连接或排序等,各个操作之间存在父子关系。
Operation | 解释 | SQL |
---|---|---|
TABLE ACCESS FULL | 全表扫描 | |
PARTITION RANGE SINGLE | 单个分区扫描 | SELECT * FROM t WHERE n1 = 3 AND d1 = to_date('2007-07-19', 'yyyy-mm-dd') |
PARTITION RANGE ITERATOR | 多个分区扫描 | SELECT * FROM t WHERE n1 = 3 AND d1 < to_date('2007-07-19', 'yyyy-mm-dd') |
PARTITION RANGE INLIST | 存在 IN 的多个分区扫描 |
SELECT * FROM t WHERE n1 IN (1, 3) AND d1 = to_date('2007-07-19', 'yyyy-mm-dd') |
PARTITION RANGE ALL | 所有分区扫描 | SELECT * FROM t WHERE n1 BETWEEN 6000 AND 7000 |
PARTITION RANGE OR | OR 条件分区扫描 | SELECT * FROM t WHERE n1 = 3 OR d1 = to_date('2007-07-19', 'yyyy-mm-dd') |
INDEX FULL SCAN | 全索引扫描 | |
INDEX FAST FULL SCAN | 快速全索引扫描 | |
TABLE ACCESS BY USER ROWID | 直接指定 ROWID | SELECT * FROM emp WHERE rowid IN ('ASDJOWF', 'ADSOFJO') |
TABLE ACCESS BY INDEX ROWID | ||
INDEX UNIQUE SCAN | 用上了唯一索引 | |
INDEX RANGE SCAN | 用上了非唯一索引 |
Oracle vs MySQL
Oracle | MySQL | |
---|---|---|
事务默认隔离级别 | read commited |
repeatable read |
价格 | ORACLE 11g 标准版售价在六位数 | 开源免费 |
AUTO_INCREMENT | 不可以声明,主键自带自增长 | 可以声明 |
索引 | Oracle 的索引是数据库级别,不可以同名 | MySQL 的索引是表级别的,可以同名 |
数字类型 | NUMBER | INT/DECIMAL |
分页 | Oracle 是需要用到伪列 ROWNUM 和嵌套查询 |
LIMIT X, Y |
默认端口 | 1521 |
3306 |