- 浏览: 2542642 次
- 性别:
- 来自: 苏州
文章分类
最新评论
-
jsntghf:
peio 写道这个怎么运行?Ruby On Rails的环境搭 ...
多文件上传之uploadify -
peio:
这个怎么运行?
多文件上传之uploadify -
往事如烟1:
我的项目是自己init了一个原始的project,之后将ver ...
React Native热部署之CodePush -
jsntghf:
往事如烟1 写道我按照你的说明进行,发现app退出之后,在进入 ...
React Native热部署之CodePush -
往事如烟1:
我按照你的说明进行,发现app退出之后,在进入不正确,请问是什 ...
React Native热部署之CodePush
1、Where子句中的连接顺序
ORACLE采用自下而上的顺序解析WHERE子句。
根据这个原理,表之间的连接必须写在其他WHERE条件之前,那些可以过滤掉最大数量记录的条件必须写在WHERE子句的末尾。
举例:
(低效)
select ... from table1 t1 where t1.sal > 300 and t1.jobtype = '0001' and 20 < (select count(*) from table1 t2 where t2.pno = t1.tno);
(高效)
select ... from table1 t1 where 20 < (select count(*) from table1 t2 where t2.pno = t1.tno and t1.sal > 300 and t1.jobtype = '0001');
2、Select子句中避免使用“*”
当你想在select子句中列出所有的column时,使用动态SQL列引用 ‘*' 是一个方便的方法。不幸的是,这是一个非常低效的方法。
实际上,ORACLE在解析的过程中,会将 '*' 依次转换成所有的列名,这个工作是通过查询数据字典完成的,这意味着将耗费更多的时间。
3、减少访问数据库的次数
当执行每条SQL语句时,ORACLE在内部执行了许多工作:
解析SQL语句、估算索引的利用率、绑定变量、读数据块等等。
由此可见,减少访问数据库的次数,就能实际上减少ORACLE的工作量。
举例:
题目——我要查找编号为0001、0002学生的信息。
(低效)
select name,age,gender,address from t_student where id = '0001';
select name,age,gender,address from t_student where id = '0002';
(高效)
select a.name,a.age,a.gender,a.address,b.name,b.age,b.gender,b.address from t_student a,t_student b where a.id = '0001' and b.id = '0002';
4、使用Decode函数来减少处理时间
使用DECODE函数可以避免重复扫描相同记录或重复连接相同的表。
举例:
(低效)
select count(*), sum(banace) from table1 where dept_id = '0001' and name like 'anger%';
select count(*), sum(banace) from table1 where dept_id = '0002' and name like 'anger%';
(高效)
select count(decode(dept_id,'0001','XYZ',null)) count_01,count(decode(dept_id,'0002','XYZ',null)) count_02,
sum(decode(dept_id,'0001',dept_id,null)) sum_01,sum(decode(dept_id,'0002',dept_id,null)) sum_02
from table1
where name like 'anger%';
5、整合简单、无关联的数据库访问
如果你有几个简单的数据库查询语句,你可以把它们整合到一个查询中(即使它们之间没有关系)
举例:
(低效)
select name from table1 where id = '0001';
select name from table2 where id = '0001';
select name from table3 where id = '0001';
(高效)
select t1.name, t2.name, t3.name
from table1 t1, table2 t2, table3 t3
where t1.id(+) = '0001' and t2.id(+) = '0001' and t3.id(+) = '0001'
【注:上面例子虽然高效,但是可读性差,需要量情而定啊!】
6、删除重复记录
最高效的删除重复记录方法(因为使用了ROWID)
举例:
delete from table1 t1
where t1.rowid > (select min(t2.rowid) from table1 t2 where t1.id = t2.id);
7、尽量不要使用having子句,可以考虑用where替换
having只会在检索出所有记录之后才对结果集进行过滤,这个处理需要排序、总计等操作。如果能通过where子句限制记录的数目,那就能减少这方面的开销。
8、尽量用表的别名
当在SQL语句中连接多个表时,请使用表的别名并把别名前缀于每个Column上。
这样一来,就可以减少解析的时间并减少那些由Column歧义引起的语法错误。
9、用exists替代in
在许多基于基础表的查询中,为了满足一个条件,往往需要对另一个表进行联接。
在这种情况下,使用exists(或not exists)通常将提高查询的效率。
举例:
(低效)
select ... from table1 t1 where t1.id > 10 and pno in (select no from table2 where name like 'www%');
(高效)
select ... from table1 t1 where t1.id > 10 and exists (select 1 from table2 t2 where t1.pno = t2.no and name like 'www%');
10、用not exists替代not in
在子查询中,not in子句将执行一个内部的排序和合并。
无论在哪种情况下,not in都是最低效的 (因为它对子查询中的表执行了一个全表遍历)。为了避免使用not in,我们可以把它改写成外连接(Outer Joins)或not exists。
11、用exists替换distinct
当提交一个包含一对多表信息的查询时,避免在select子句中使用distinct,一般可以考虑用exists替换
举例:
(低效)
select distinct d.dept_no, d.dept_name from t_dept d, t_emp e where d.dept_no = e.dept_no;
(高效)
select d.dept_no, d.dept_name from t_dept d where exists (select 1 from t_emp where d.dept_no = e.dept_no);
exists使查询更为迅速,因为RDBMS核心模块将在子查询的条件一旦满足后,立刻返回结果。
12、用表连接替换exists
通常来说,采用表连接的方式比exists更有效率。
举例:
(低效)
select ename from emp e where exists (select 1 from dept where dept_no = e.dept_no and dept_cat = 'W');
(高效)
select ename from dept d, emp e where e.dept_no = d.dept_no and dept_cat = 'W';
13、避免在索引列上使用is null和is not null
避免在索引中使用任何可以为空的列,ORACLE将无法使用该索引。
对于单列索引,如果列包含空值,索引中将不存在此记录;
对于复合索引,如果每个列都为空,索引中同样不存在此记录;
如果至少有一个列不为空,则记录存在于索引中。
举例:
如果唯一性索引建立在表的A列和B列上,并且表中存在一条记录的A,B值为(123,null)。ORACLE将不接受下一条具有相同A,B值(123,null)的记录插入,然而如果所有的索引列都为空,ORACLE将认为整个键值为空。因此你可以插入1000条具有相同键值的记录,当然它们都是空! 因为空值不存在于索引列中,所以WHERE子句中对索引列进行空值比较将使ORACLE停用该索引。
14、复杂的sql,最好去看下它的执行计划,这样有利于你分析知道自己的sql效率如何。
发表评论
-
MySQL 5.6版本default-character-set=utf8报错问题
2017-02-17 11:18 1528MySQL 版本:5.6.13 OS:CentOS ... -
加速MySQL导入导出的方法
2013-05-16 18:47 1057MySQL导出的SQL语句在导入时有可能会非常慢,在处理百 ... -
ORACLE随机读取记录
2011-09-04 11:27 1012SELECT Field1, ..., FieldN ... -
修改MySQL root密码
2011-06-30 19:09 1377在忘记MySQL root用户的密码时,可通过如下方法重新设定 ... -
mysql The used table type doesn’t support FULLTEXT indexes
2011-05-19 10:44 2077出现这个错误:mysql The used table typ ... -
开启MySQL慢查询
2011-04-19 09:13 1469其实启用MySQL的慢查询日志很简单,只需要在MySQL的配置 ... -
当MySql的Where值类型和数据字段类型不一致时会发生什么?
2011-04-08 12:23 2500在多数时候我们都会对数据库建立索引,然后在SQL中尽可能的用上 ... -
MySQL查询优化
2011-03-18 13:49 1576数据一多,速度就慢,我这里讲解MySQL查询优化。 当 ... -
MySQL Show命令的使用
2011-03-11 18:58 1304show tables或show tables from da ... -
set define off
2011-02-09 08:17 2610通过sql向oracle数据库导入数据时,提示输入nbsp的值 ... -
MySQL汉字按拼音排序
2011-01-28 21:38 2710用过mysql数据库的都知道MySQL使用latin1的默认字 ... -
MySQL性能优化诊断脚本
2011-01-20 09:39 1833一个由MySQL职员写的优化脚本,可根据现有配置、系统配置、M ... -
ERROR 2003 (HY000): Can't connect to MySQL server on 'localhost' (10061)
2011-01-07 09:47 3700今天启动数据库时,突然报出以下这个错误: ERROR ... -
Oracle的中文字段排序
2010-12-22 08:43 1321Oracle中可以按照拼音、部首、笔画排序,可以通过设置NLS ... -
PostgreSQL数据库重命名
2010-12-14 10:01 5070ALTER DATABASE <old> RENA ... -
mysql中的交互命令
2010-08-06 12:59 1922mysql> \h For informa ... -
mysql中select count(primary)、count(1)、count(*)的区别
2010-07-28 15:56 3716有这样一个表结构: mysql> desc ... -
mysql中information_schema数据库介绍
2010-07-25 08:45 1986INFORMATION_SCHEMA提供了访问数据库元数据的方 ... -
mysql中的show命令
2010-07-02 22:46 1294a. show tables或show tables f ... -
MyISAM和InnoDB的异同
2009-12-13 11:18 1135InnoDB和MyISAM是在使用MySQL时最常用的两个表类 ...
相关推荐
【数据库培训高效率sql语句基础】 在数据库系统中,衡量效率主要依据响应时间和吞吐量。在系统开发初期,由于数据量较少,SQL语句的性能差异可能不太明显,但随着数据的增长,高效的SQL语句对提升系统响应速度至关...
【数据库培训-高效率sql语句基础】 在数据库系统中,效率是衡量其性能的关键指标,这主要体现在响应时间和吞吐量上。响应时间是指系统处理请求的速度,而吞吐量则是指单位时间内系统能处理的请求量。在开发阶段,...
如何写出高效率的SQL语句--SQL优化技巧 SQL 优化技巧是提高数据库性能的关键所在。编写高效率的 SQL 语句需要对索引的机制有一定了解,以下是关于索引的知识点: 索引的优点和局限 索引可以提高查询的效率,但会...
以下是三种常用的高效率SQL语句分页方法: 1. **基于行号的分页(利用自增ID)** 这种方法适用于表中存在自动增长的ID字段。首先,定义两个变量Page和PageCount,Page表示当前页数,PageCount表示每页的数据条数。...
本文将深入探讨如何在C#中自动生成SQL语句,以提高开发效率并减少手动编写SQL可能导致的错误。 一、Entity Framework与自动SQL生成 1. Entity Framework(EF)是微软提供的一个开源ORM(对象关系映射)框架,它...
### ArcGIS中的SQL语句详解 #### 一、SQL在ArcGIS中的角色与应用 SQL,全称为Structured Query Language,即结构化查询语言,是专为数据库设计的一种标准语言,用于管理和操作数据库中的数据。在ArcGIS环境中,SQL...
除了查看SQL语句本身,我们还需要关注会话的等待事件,这些事件可能会影响SQL语句的执行效率。 ```sql -- 查询当前会话的等待事件 select event, count(*) from v$session where event not in ('SQL*...
总结来说,"SQL语句辅助工具"是一个实用的开发辅助软件,通过将SQL语句转换为C#代码,简化了数据库操作的过程,提高了开发效率,同时也降低了出错的可能性。对于使用C#和SQL的开发人员来说,这是一款值得拥有的工具...
- **存储过程**:预编译的SQL语句集合,可封装复杂的业务逻辑,提高效率和安全性。 - **触发器**:在特定数据库操作(如INSERT、UPDATE或DELETE)发生时自动执行的代码段。 9. **窗口函数** - **ROW_NUMBER()、...
SQL语句可以用于跟踪流程状态、查询历史记录、分析流程效率等。例如,通过`JOIN`操作结合流程表和任务表,可以获取某个任务的所有处理人及他们的处理时间。 3. **效率排名SQL**: - 效率排名通常涉及对员工、部门...
8. **定制和配置**:高级的Sql语句生成器允许用户自定义输出格式,如添加注释、设置编码格式,甚至可以调整SQL语句的顺序以优化执行效率。 9. **错误处理和报告**:在迁移过程中,工具应能捕获和报告任何错误,便于...
总之,SQL语句格式化工具是提高SQL代码质量和团队效率的有效工具,尤其是在Windows环境下,丰富的选择和优秀的集成性使其成为开发者不可或缺的助手。通过合理利用这些工具,可以显著提升SQL编程的工作体验。
当业务需求变化时,我们只需修改实体类或调整泛型类的方法,而无需修改大量的SQL语句,这无疑提高了开发效率。 总之,泛型封装的SQL语句是利用泛型特性来优化数据库操作的有效手段。它将SQL语句的构建与业务逻辑...
### 高级SQL语句详解 #### 知识点一:高级SQL语句与数据处理 高级SQL语句是数据库管理中的重要工具,用于执行复杂的数据检索、更新和分析任务。这些语句超越了基本的SELECT、INSERT、UPDATE和DELETE命令,涵盖了更...
SQL语句基础教程 SQL(Structured Query Language)是一种特殊目的语言,用于管理关系数据库管理系统(RDBMS)。SQL语句基础教程旨在帮助新手和需要复习SQL的资料仓储业界老将,学习SQL基础知识和语法。 SQL指令 -...
标题"压测Oracle的SQL语句的性能情况"暗示了我们关注的是在高负载情况下,Oracle数据库处理SQL查询的能力。压力测试(Pressure Testing)是一种评估系统在极端工作条件下表现的方法,通过模拟大量并发用户执行SQL...
总结来说,SQL语句自动生成器是提高数据库管理效率、降低错误率的有效工具。它降低了SQL学习曲线,使得数据库操作更加便捷,尤其适合初学者和需要快速处理大量SQL语句的开发者。通过“SQL语句生成器.exe”这个执行...
通过使用这样的工具,用户不仅可以提高工作效率,还能在实践中学习和理解SQL语句的构造和作用。对于初学者来说,它是一个很好的学习辅助工具,能帮助他们逐步掌握SQL的精髓。同时,对于经验丰富的开发者,它则是一个...
4. **存储过程**: 存储过程是预编译的SQL语句集合,可重复使用,提高执行效率,减少网络通信。 5. **触发器**: 触发器是自动执行的程序,当特定的数据库操作(如INSERT、UPDATE、DELETE)发生时,会触发相应动作。 ...