基本的Sql编写注意事项
- 尽量少用IN操作符,基本上所有的IN操作符都可以用EXISTS代替。
- 不用NOT IN操作符,可以用NOT EXISTS或者外连接+替代。
- Oracle在执行IN子查询时,首先执行子查询,将查询结果放入临时表再执行主查询。而EXIST则是首先检查主查询,然后运行子查询直到找到 第一个匹配项。NOT EXISTS比NOT IN效率稍高。但具体在选择IN或EXIST操作时,要根据主子表数据量大小来具体考虑。
- 不用“<>”或者“!=”操作符。对不等于操作符的处理会造成全表扫描,可以用“<” or “>”代替。
- Where子句中出现IS NULL或者IS NOT NULL时,Oracle会停止使用索引而执行全表扫描。可以考虑在设计表时,对索引列设置为NOT NULL。这样就可以用其他操作来取代判断NULL的操作。
- 当通配符“%”或者“_”作为查询字符串的第一个字符时,索引不会被使用。
- 对于有连接的列“||”,最后一个连接列索引会无效。尽量避免连接,可以分开连接或者使用不作用在列上的函数替代。
- 如果索引不是基于函数的,那么当在Where子句中对索引列使用函数时,索引不再起作用。
- Where子句中避免在索引列上使用计算,否则将导致索引失效而进行全表扫描。
- 对数据类型不同的列进行比较时,会使索引失效。
- 用“>=”替代“>”。
- UNION操作符会对结果进行筛选,消除重复,数据量大的情况下可能会引起磁盘排序。如果不需要删除重复记录,应该使用UNION ALL。
- Oracle从下到上处理Where子句中多个查询条件,所以表连接语句应写在其他Where条件前,可以过滤掉最大数量记录的条件必须写在Where子句的末尾。
- Oracle从右到左处理From子句中的表名,所以在From子句中包含多个表的情况下,将记录最少的表放在最后。(只在采用RBO优化时有效,下文详述)
- Order By语句中的非索引列会降低性能,可以通过添加索引的方式处理。严格控制在Order By语句中使用表达式。
- 不同区域出现的相同的Sql语句,要保证查询字符完全相同,以利用SGA共享池,防止相同的Sql语句被多次分析。
- 多利用内部函数提高Sql效率。
- 当在Sql语句中连接多个表时,使用表的别名,并将之作为每列的前缀。这样可以减少解析时间。
需要注意的是,随着Oracle的升级,查询优化器会自动对Sql语句进行优化,某些限制可能在新版本的Oracle下不再是问题。尤其是采用CBO(Cost-Based Optimization,基于代价的优化方式)时。
我们可以总结一下可能引起全表扫描的操作:
- 在索引列上使用NOT或者“<>”;
- 对索引列使用函数或者计算;
- NOT IN操作;
- 通配符位于查询字符串的第一个字符;
- IS NULL或者IS NOT NULL;
- 多列索引,但它的第一个列并没有被Where子句引用;
Oracle优化器
Oracle优化器(Optimizer)是Oracle在执行SQL之前分析语句的工具。
Oracle的优化器有两种优化方式:基于规则的(RBO)和基于代价的(CBO)。
- RBO: 优化器遵循Oracle内部预定的规则。
- CBO: 依据语句执行的代价,主要指对CPU和内存的占用。优化器在判断是否使用CBO时,要参照表和索引的统计信息。统计信息要在对表做analyze后才会有。Oracle8及以后版本,推荐用CBO方式。
Oracle优化器的优化模式主要有四种:
- Rule:基于规则;
- Choose:默认模式。根据表或索引的统计信息,如果有统计信息,则使用CBO方式;如果没有统计信息,相应列有索引,则使用RBO方式。
- First rows:与Choose类似。不同的是如果表有统计信息,它将以最快的方式返回查询的前几行,以获得最佳响应时间。
- All rows:即完全基于Cost的模式。当一个表有统计信息时,以最快方式返回表所有行,以获得最大吞吐量。没有统计信息则使用RBO方式。
设定优化模式的方式
- Instance级别:在init<SID>.ora文件中设定OPTIMIZER_MODE;
- Session级别:通过SQL> ALTER SESSION SET OPTIMIZER_MODE=;来设定。
- 语句级别:通过SQL> SELECT /*+ALL+_ROWS*/ ……;来设定。可用的HINT包括/*+ALL_ROWS*/、/*+FIRST_ROWS*/、/*+CHOOSE*/、/*+RULE*/ 等。
要注意的是,如果表有统计信息,则可能造成语句不走索引的结果。可以用SQL>ANALYZE TABLE table_name DELETE STATISTICS; 删除索引。
对列和索引更新统计信息的SQL:
SQL> ANALYZE TABLE table_name COMPUTE STATISTICS;
SQL> ANALYZE INDEX index_name ESTIMATE STATISTICS;
相关推荐
Oracle SQL是数据库管理员和开发人员在Oracle数据库系统中进行数据查询和管理的重要工具。这篇笔记主要涵盖了Oracle SQL的...这两份“Oracle SQL笔记”文档应包含了上述各个方面的详细解释和实例,值得仔细阅读和学习。
sql fundament 读书笔记 oracle 原厂 培训 金领DBA
精通Oracle SQL【第2版】ORACLE SQL高级编程【第二版】学习笔记
"Oracle优化笔记"可能涵盖了如何有效地优化SQL查询,特别是针对where条件的编写技巧,以及如何利用FORALL和BULK COLLECT等特性来提升性能。下面我们将详细探讨这些关键知识点。 1. **SQL优化基础**: SQL优化的...
【Oracle SQL笔记详解】 Oracle SQL是用于访问和操作Oracle数据库的强大工具,涵盖了各种查询、更新和管理数据的方法。以下是对笔记中提及的一些关键知识点的详细解释: 1. **登录Oracle数据库**:通常以超级管理...
### Oracle SQL 笔记知识点详解 #### 一、SQLPlus 命令及环境变量 Oracle_sid - **SQLPlus 命令位置**:在 Oracle 安装目录下的 `bin` 文件夹中,可以通过 SQLPlus 来执行 SQL 命令。 - **Oracle_sid 环境变量**:...
Oracle 10g SQL 学习笔记涵盖了Oracle数据库的基础知识,包括版本信息、数据库系统特点、关系型数据库结构、SQL语言、操作环境以及常见的数据库操作。以下是对这些知识点的详细说明: 1. **Oracle 9i基础知识**: ...
Oracle和SQL Server是两大主流的关系型数据库管理系统,广泛应用于企业级的数据存储和处理。这篇学习笔记将深入探讨这两个系统的概念、特性和应用。 一、Oracle数据库系统 Oracle数据库是由甲骨文公司开发的一款...
本文主要围绕ORACLE数据库的性能优化,特别是如何通过不同的方式来追踪和分析SQL语句的执行,从而找出性能瓶颈。 首先,了解如何查询当前正在执行语句的执行计划是至关重要的。通过`V$SQL_PLAN`视图,我们可以获取...
### Oracle优化笔记 #### SQL语句优化 在SQL语句优化方面,主要关注查询效率、减少数据冗余以及提升整体性能。以下几点是常见的优化手段: 1. **使用索引**:合理创建索引可以显著提高查询速度。例如,基于功能的...
Oracle SQL编程是数据库管理的重要组成部分,特别是在Oracle数据库系统中,SQL与PL/SQL结合使用,大大增强了数据库操作的灵活性和效率。以下是一些关键知识点的详细说明: 1. **PL/SQL**: PL/SQL(Procedural ...
Oracle SQL是用于管理和操作Oracle数据库的关键工具,涵盖了数据查询、数据操纵、数据定义以及数据控制等多个方面。在本文中,我们将深入探讨Oracle SQL中的数据控制语句(DCL)、数据定义语句(DDL)以及一些基本的...
【标题】:“(转)最全的SQL(Oracle)笔记集录” 这篇资源是一个全面的SQL,特别是针对Oracle数据库的学习笔记集合。Oracle是世界上最广泛使用的数据库管理系统之一,它提供了丰富的功能来处理各种类型的数据和满足...
根据提供的文件信息,我们可以归纳出一系列重要的Oracle SQL知识点,这些知识点涵盖了从基本的SQL概念到高级的数据库管理技术。下面是对这些知识点的详细说明: ### 1. SQL介绍 #### 结构化查询语言 (Structured ...
3. Oracle数据库的架构和存储结构,例如表空间、段、数据块等概念,对这些基础概念的深入理解对于数据迁移和性能优化至关重要。 4. Oracle的数据备份和恢复技术,因为数据迁移往往需要确保数据的安全性和完整性,...
Oracle性能优化涵盖广泛的领域,包括数据库架构设计、SQL优化、索引管理、资源分配和备份恢复策略等。DBA需要综合运用各种工具和方法,持续监控数据库运行状态,及时调整和优化,以保证数据库高效、稳定地运行。
### Oracle SQL 培训笔记知识点详解 #### 一、常用 SQL 语句 1. **聚合查询(Group By)** - **语法**: `SELECT name, COUNT(*) FROM table WHERE ... GROUP BY name;` - **说明**: 使用 `GROUP BY` 子句对指定...
Oracle数据库是全球广泛使用的...总的来说,Oracle数据库SQL学习笔记应该涵盖这些核心领域,并深入探讨每个主题,包括实例、最佳实践和问题解决策略。通过持续学习和实践,你可以成为一名熟练的Oracle数据库专业人员。
在深入探讨《Mastering Oracle SQL学习笔记》的内容之前,我们先理解一下这门课程的核心目标:帮助初学者更好地掌握SQL语言中的关键概念和操作,尤其是针对Oracle数据库的特性。这包括了SQL语句的构建、数据筛选、...
Oracle SQL是一种强大的数据库查询语言,广泛应用于数据管理和分析。以下是从《从实践中学习 oracle/SQL》一书第一章和第二章中提取的知识点: 1. **简单查询语句**:基本的查询语句由`SELECT`和`FROM`构成,如`...