主要观点:从性能角度介绍使用 SQL 查询的最佳实践,以 Oracle 为主要参考,多数建议也适用于其他 RDBMS SQL 引擎。
关键信息:
- 高效解析别名使用:有效使用别名可减少语句的解析阶段,短别名比长表名或别名解析更快,应尽量将别名简化为单个字母。
- 驱动表:DML 语句中 FROM 和 WHERE 子句的结构对查询性能很重要,有基于成本和基于规则的优化器来选择驱动表,应将记录较少的表作为驱动表,注意限制条件的分组以引导优化器。
- 避免使用 Select 子句:使用 效率低,SQL 解析器需逐个转换为列名,耗时。
- Exists 与 In 的比较:Exists 函数搜索满足条件的单个行,In 语句搜索所有出现,Exits 性能更好。
- Not Exists 与 Not In 的比较:Not In 子查询会导致内部排序/合并,使用 Not Exists 更好。
- In 与 Minus 对比:对于非索引列,In 与 Minus 结合比 Not In 性能好。
- 不等式优化:使用不等式时,用 >= 替代 > 可提高性能,避免全索引扫描。
- 使用 Union 替代 Or:在 WHERE 子句中考虑使用 UNION 代替 OR,OR 会导致全表扫描。
- 使用 Union All 替代 Union:UNION 操作需排序,UNION All 不排序且包含重复行,除非需要消除重复行,否则使用 Union All。
- 使用 Union 替代 Outer Joins:用 FULL OUTER JOIN 和 NVL 函数重写 UNION 性能更快。
- 使用索引提高性能:避免在有索引的列上使用函数,可使用功能索引;若无法避免,引用列值时需加单引号。
- 避免在 WHERE 子句中使用转换后的列:在过滤器或连接谓词中使用 SQL 函数时,应将函数放在谓词的另一侧,使用未转换的列值。
重要细节:通过具体示例详细说明了每个最佳实践的用法和效果,如不同查询语句的执行过程和性能差异等。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。