`
blueyanghualong
  • 浏览: 227282 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

sql写法的注意事项

 
阅读更多

 

基本的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;
分享到:
评论

相关推荐

    sql 优化语句的几个常用注意事项

    保证数据库性能的sql语句写法,注意事项,使得我们在书写时避免使数据库低效率的执行命令

    SQL写法—数据修改

    ### SQL写法——数据修改:条件 INSERT ALL 与 INSERT FIRST 在数据库操作中,SQL(Structured Query Language)作为处理关系型数据库的标准语言,其功能强大且应用广泛。本文将详细介绍如何利用Oracle数据库中的...

    优化sql语句执行效率几点注意事项

    本文将详细探讨几个关于优化SQL语句执行效率的重要注意事项,旨在帮助数据库管理员和开发者提升系统性能。 首先,理解索引的作用与创建策略是优化SQL的第一步。索引可以大幅提高数据检索速度,但并不是所有字段都...

    Access数据库升级为SQL数据库的注意事项和方法

    Access数据库升级为SQL数据库的注意事项和方法 Access数据库升级为SQL数据库是许多开发人员经常面临的问题。由于存在现有的Access升级向导,这一转变的过程变得相当简单,尤其是当你建立一个与SQL Server数据相联系...

    登录SQLServer服务器时的服务器名称.pdf

    #### 知识点四:注意事项 1. **实例名称**:确保使用正确的SQL Server实例名称,因为一个服务器上可能安装了多个SQL Server实例。 2. **网络配置**:检查SQL Server服务的网络配置是否允许使用相应的连接方式。...

    SqlServer2000触发器

    使用注意事项 - 触发器可能导致性能下降,因为它们增加了数据库操作的复杂性。 - 触发器中的事务处理必须谨慎,否则可能导致死锁或其他并发问题。 - 由于触发器是透明的,可能隐藏了业务逻辑,使得调试和维护变得...

    SqlServer高级命令

    通过以上对给定文件中的标题、描述、标签以及部分内容的详细分析,我们不仅了解了 `TRUNCATE TABLE`、`ALTER TABLE`、变量声明与赋值以及 `UPDATE` 语句等高级命令的具体用法,还掌握了它们在实际应用中的注意事项和...

    SQL Server数据库性能优化之SQL语句篇

    - **注意事项**:过渡表一旦创建就不会自动更新,因此在主表数据频繁变更时需要注意同步问题。 #### 五、避免在WHERE子句中使用函数 - **问题说明**:在WHERE子句中使用函数会导致索引失效,从而触发全表扫描,严重...

    sql 游标详解

    #### 五、游标的注意事项 1. **性能问题**:频繁使用游标可能导致性能下降,尤其是在大型数据集上。 2. **资源管理**:使用完游标后应及时关闭和释放资源,避免资源泄漏。 3. **安全性**:确保使用游标时不会引入...

    sql优化指南.pdf

    - **注意事项**: 过多的表连接可能会影响性能,应尽量减少不必要的连接。 - **性能考虑**: 在设计数据库结构时应考虑到将来可能出现的大规模连接需求,合理规划表结构和索引。 通过以上知识点的梳理,我们可以了解...

    ORACLE移植DB2注意事项

    ### ORACLE移植DB2注意事项 在进行Oracle到DB2数据库移植的过程中,需要注意多个方面的差异,以确保移植后的应用能够正常运行。以下将详细介绍几个关键点: #### 1. 字符串与数字的区别处理 在Oracle中,如果在...

    IGS使用ODBC Client驱动与SQL通讯.docx

    本文将详细介绍如何配置ODBC客户端驱动程序以实现IGS与SQL之间的数据交换,并提供具体的步骤和注意事项。 #### 二、ODBC简介 ODBC(Open Database Connectivity)是一种开放式的、标准的应用程序接口(API),它...

    Java访问SQLServer数据库配置及使用方法详解

    - **注意事项:** - 如果出现“Failed to”等警告,通常是因为缺少必要的环境配置或驱动版本不兼容导致的。确保安装了正确版本的驱动,并且在环境变量中设置了正确的路径。 **2. 使用Sun的JdbcOdbc访问SQL Server...

    sql server 生日提醒

    #### 四、注意事项 - 使用`{fn NOW()}`时需注意兼容性问题,因为某些版本的SQL Server可能不支持这种写法。 - 在实际应用中,可能还需要考虑闰年对日期计算的影响。 - 如果生日数据存储格式不统一,可能需要额外处理...

    jdbc数据库连接写法

    **注意事项:** - 需要替换`MyDbComputerNameOrIP`为实际的服务器名或IP地址。 - `myDatabaseName`应替换为具体的数据库名称。 - 使用`com.mysql.cj.jdbc.Driver`替代了较旧的`org.gjt.mm.mysql.Driver`,以保持与...

    SQLServer批量更新两个关联表数据的方法

    #### 关联查询与更新的注意事项: 1. **事务管理**:由于批量更新涉及到多行操作,建议使用`BEGIN TRANSACTION`、`COMMIT`或`ROLLBACK`来确保数据的一致性,防止因部分更新失败导致数据不一致。 2. **索引优化**:...

    85提纲挈领的告诉你,SQL语句的执行计划和性能优化有什么关系?.pdf

    3. 实践中的注意事项 - 性能优化是一个持续的过程,随着数据量的增长和查询负载的变化,需要不断监测和调整。 - 优化措施需要考虑对系统整体性能的影响,包括对其他查询和数据库操作的影响。 - 避免过度优化,...

    abap SQL优化

    - **注意事项**:如果表名以MANDT开头而索引不以MANDT开头,则优化器可能不会选择该索引。 #### 十、优化MOVE操作 1. **避免MOVE-CORRESPONDING**:相比于使用MOVE-CORRESPONDING,直接指定字段名称进行赋值可以...

    sql part2.docx

    注意事项: 1. 如果`SELECT`子句中包含了`USING`关键字所指明的列,则不应指明该列属于哪个表。 2. `USING`中可以指定多个列名。 3. `ON`和`USING`关键字是互斥的,不能同时使用。 ##### 7.2.5 外连接(包括左外...

Global site tag (gtag.js) - Google Analytics