精华内容
下载资源
问答
  • oracle 查询执行顺序

    万次阅读 2011-09-22 21:27:40
    oracle 语句提高查询效率的方法 1:.. where column in(select * from ... where ...); 2:... where exists (select 'X' from ...where ...); 第二种格式要远比第一种格式的效率高。在Oracle中可以几乎将所有...
      
    

    oracle 语句提高查询效率的方法
    1:.. where column in(select * from ... where ...);
    2:... where exists (select 'X' from ...where ...);
    第二种格式要远比第一种格式的效率高。在Oracle中可以几乎将所有的IN操作符子查询改写为使用EXISTS的子查询
    使用EXISTS,Oracle系统会首先检查主查询,然后运行子查询直到它找到第一个匹配项,这就节省了时间
    Oracle系统在执行IN子查询时,首先执行子查询,并将获得的结果列表存放在在一个加了索引的临时表中

    避免使用having字句
    避免使用HAVING子句, HAVING 只会在检索出所有记录之后才对结果集进行过滤. 这个处理需要排序,总计等操作. 如果能通过WHERE子句限制记录的数目,那就能减少这方面的开销。

     

    SQL Select语句完整的执行顺序:

    1、from子句组装来自不同数据源的数据;
    2、where子句基于指定的条件对记录行进行筛选;
    3、group by子句将数据划分为多个分组;
    4、使用聚集函数进行计算;
    5、使用having子句筛选分组;
    6、计算所有的表达式;
    7、使用order by对结果集进行排序。

     

    例:update tablename set columnName=colunName+1,columnNameBa group by

    在select 语句中可以使用group by 子句将行划分成较小的组,然后,使用聚组函数返回每一个组的汇总信息,另外,可以使用having子句限制返回的结果集。group by 子句可以将查询结果分组,并返回行的汇总信息Oracle 按照group by 子句中指定的表达式的值分组查询结果。在带有group by 子句的查询语句中,在select 列表中指定的列要么是group by 子句中指定的列,要么包含聚组函数select max(sal),job emp group by job;(注意max(sal),job的job并非一定要出现,但有意义)查询语句的select 和group by ,having 子句是聚组函数唯一出现的地方,在where 子句中不能使用聚组函数。select deptno,sum(sal) from emp where sal>1200 group by deptno having sum(sal)>8500 order by deptno;

    当在gropu by 子句中使用having 子句时,查询结果中只返回满足having条件的组。在一个sql语句中可以有where子句和having子句。having 与where 子句类似,均用于设置限定条件

    where 子句的作用是在对查询结果进行分组前,将不符合where条件的行去掉,即在分组之前过滤数据,条件中不能包含聚组函数,使用where条件显示特定的行。
    having 子句的作用是筛选满足条件的组,即在分组之后过滤数据,条件中经常包含聚组函数,使用having 条件显示特定的组,也可以使用多个分组标准进行分组。

    查询每个部门的每种职位的雇员数
    select deptno,job,count(*) from emp group by deptno,job;

    Oracle SQL 性能优化技巧

    1.选用适合的ORACLE优化器
         ORACLE的优化器共有3种

         A、RULE (基于规则) b、COST (基于成本) c、CHOOSE (选择性)

         设置缺省的优化器,可以通过对init.ora文件中OPTIMIZER_MODE参数的各种声明,如RULE,COST,CHOOSE,ALL_ROWS,FIRST_ROWS 。你当然也在SQL句级或是会话(session)级对其进行覆盖。

         为了使用基于成本的优化器(CBO, Cost-Based Optimizer) , 你必须经常运行analyze 命令,以增加数据库中的对象统计信息(object statistics)的准确性。

         如果数据库的优化器模式设置为选择性(CHOOSE),那么实际的优化器模式将和是否运行过analyze命令有关。如果table已经被analyze过, 优化器模式将自动成为CBO , 反之,数据库将采用RULE形式的优化器。

    在缺省情况下,ORACLE采用CHOOSE优化器,为了避免那些不必要的全表扫描(full table scan) ,你必须尽量避免使用CHOOSE优化器,而直接采用基于规则或者基于成本的优化器。

    2.访问Table的方式
         ORACLE 采用两种访问表中记录的方式:
         A、 全表扫描
              全表扫描就是顺序地访问表中每条记录。ORACLE采用一次读入多个数据块(database block)的方式优化全表扫描。
         B、 通过ROWID访问表
              你可以采用基于ROWID的访问方式情况,提高访问表的效率, ROWID包含了表中记录的物理位置信息。ORACLE采用索引(INDEX)实现了数据和存放数据的物理位置(ROWID)之间的联系。通常索引提供了快速访问ROWID的方法,因此那些基于索引列的查询就可以得到性能上的提高。

    3.共享SQL语句
         为了不重复解析相同的SQL语句,在第一次解析之后,ORACLE将SQL语句存放在内存中。这块位于系统全局区域SGA(system global area)的共享池(shared buffer pool)中的内存可以被所有的数据库用户共享。因此,当你执行一个SQL语句(有时被称为一个游标)时,如果它和之前的执行过的语句完全相同, ORACLE就能很快获得已经被解析的语句以及最好的执行路径。ORACLE的这个功能大大地提高了SQL的执行性能并节省了内存的使用。

         可惜的是ORACLE只对简单的表提供高速缓冲(cache buffering),这个功能并不适用于多表连接查询。

         数据库管理员必须在init.ora中为这个区域设置合适的参数,当这个内存区域越大,就可以保留更多的语句,当然被共享的可能性也就越大了。

         当你向ORACLE提交一个SQL语句,ORACLE会首先在这块内存中查找相同的语句。这里需要注明的是,ORACLE对两者采取的是一种严格匹配,要达成共享,SQL语句必须完全相同(包括空格,换行等)。

         数据库管理员必须在init.ora中为这个区域设置合适的参数,当这个内存区域越大,就可以保留更多的语句,当然被共享的可能性也就越大了。

         共享的语句必须满足三个条件:

         A、 字符级的比较:当前被执行的语句和共享池中的语句必须完全相同。

         B、 两个语句所指的对象必须完全相同:

         C、两个SQL语句中必须使用相同的名字的绑定变量(bind variables)。

    4.选择最有效率的表名顺序(只在基于规则的优化器中有效)
         ORACLE的解析器按照从右到左的顺序处理FROM子句中的表名,因此FROM子句中写在最后的表(基础表 driving table)将被最先处理。在FROM子句中包含多个表的情况下,你必须选择记录条数最少的表作为基础表。当ORACLE处理多个表时,会运用排序及合并的方式连接它们。首先,扫描第一个表(FROM子句中最后的那个表)并对记录进行派序,然后扫描第二个表(FROM子句中最后第二个表),最后将所有从第二个表中检索出的记录与第一个表中合适记录进行合并。

         如果有3个以上的表连接查询,那就需要选择交叉表(intersection table)作为基础表,交叉表是指那个被其他表所引用的表。

    5.WHERE子句中的连接顺序
         ORACLE采用自下而上的顺序解析WHERE子句,根据这个原理,表之间的连接必须写在其他WHERE条件之前,那些可以过滤掉最大数量记录的条件必须写在WHERE子句的末尾。

    6.SELECT子句中避免使用 ' * '
         当你想在SELECT子句中列出所有的COLUMN时,使用动态SQL列引用 '*' 是一个方便的方法。不幸的是,这是一个非常低效的方法。实际上,ORACLE在解析的过程中,会将'*' 依次转换成所有的列名,这个工作是通过查询数据字典完成的,这意味着将耗费更多的时间。

    7.减少访问数据库的次数
         当执行每条SQL语句时,ORACLE在内部执行了许多工作:解析SQL语句,估算索引的利用率,绑定变量,读数据块等等。由此可见,减少访问数据库的次数,就能实际上减少ORACLE的工作量。

    8.使用DECODE函数来减少处理时间
         使用DECODE函数可以避免重复扫描相同记录或重复连接相同的表。

    9.整合简单,无关联的数据库访问
         如果你有几个简单的数据库查询语句,你可以把它们整合到一个查询中(即使它们之间没有关系)

    10.删除重复记录

    11.用TRUNCATE替代DELETE
         当删除表中的记录时,在通常情况下,回滚段(rollback segments ) 用来存放可以被恢复的信息。如果你没有COMMIT事务,ORACLE会将数据恢复到删除之前的状态(准确地说是恢复到执行删除命令之前的状况)。

         而当运用TRUNCATE时,回滚段不再存放任何可被恢复的信息。当命令运行后,数据不能被恢复。因此很少的资源被调用,执行时间也会很短。

    12.尽量多使用COMMIT
         只要有可能,在程序中尽量多使用COMMIT,这样程序的性能得到提高,需求也会因为COMMIT所释放的资源而减少

         COMMIT所释放的资源:

         A、 回滚段上用于恢复数据的信息。

         B、被程序语句获得的锁。

         C、 redo log buffer 中的空间。

         D、ORACLE为管理上述3种资源中的内部花费。

    13.计算记录条数
         和一般的观点相反,count(*) 比count(1)稍快,当然如果可以通过索引检索,对索引列的计数仍旧是最快的。例如 COUNT(EMPNO)

    14.用Where子句替换HAVING子句
         避免使用HAVING子句,HAVING 只会在检索出所有记录之后才对结果集进行过滤。这个处理需要排序,总计等操作。如果能通过WHERE子句限制记录的数目,那就能减少这方面的开销。

    15.减少对表的查询
         在含有子查询的SQL语句中,要特别注意减少对表的查询。

    16.通过内部函数提高SQL效率。

    17.使用表的别名(Alias)
         当在SQL语句中连接多个表时,请使用表的别名并把别名前缀于每个Column上。这样一来,就可以减少解析的时间并减少那些由Column歧义引起的语法错误。

    18.用EXISTS替代IN
         在许多基于基础表的查询中,为了满足一个条件,往往需要对另一个表进行联接。在这种情况下,使用EXISTS(或NOT EXISTS)通常将提高查询的效率。

    19.用NOT EXISTS替代NOT IN
         在子查询中,NOT IN子句将执行一个内部的排序和合并。无论在哪种情况下,NOT IN都是最低效的 (因为它对子查询中的表执行了一个全表遍历)。为了避免使用NOT IN ,我们可以把它改写成外连接(Outer Joins)或NOT EXISTS。

    20.用表连接替换EXISTS
         通常来说 ,采用表连接的方式比EXISTS更有效率

    21.用EXISTS替换DISTINCT
         当提交一个包含一对多表信息(比如部门表和雇员表)的查询时,避免在SELECT子句中使用DISTINCT。一般可以考虑用EXIST替换


    展开全文
  • oracle查询数据顺序问题

    千次阅读 2018-12-29 15:41:37
    oracle查询数据顺序问题 [问题点数:20分,结帖人gingkoc] 收藏帖子 回复 gingkoc 结帖率 50% 在不动表数据的情况下,同一句sql每次查询的数据顺序是否是一致的? 问题点数:20分  0 2016-08-31 11:21:...

    oracle查询数据顺序问题 [问题点数:20分,结帖人gingkoc]

    gingkoc

    Bbs1

    结帖率 50%

    在不动表数据的情况下,同一句sql每次查询的数据顺序是否是一致的?

    问题点数:20分

     0 2016-08-31 11:21:37

    回复数 4 只看楼主 引用 举报 楼主

    卖水果的net

    Bbs9 版主

    Blank Blank Blank Blank

    加了 order by 就是一样,如果不加,稳定性就差了。

    1 2016-08-31 11:30:00

    只看TA 引用 举报 #1    得分 5

    oracle 无order by , 默认排序问题Oracle会根据具体的数据块的存储返回记录. oracle数据库是没有默认排序的  要排序必须加上order  by  因为oracle是按块进行读取数据的  如果数据按顺序存储,则可能使读取出来的数据是按顺序的,给用户误解为默认排序 oracle没有进行任何排序操作,rowid表示的是数据存放的数据块内部地址,如果没有要求排序,oracle会顺序的从数据块中读取符合条件的数据返回到客

    ghx287524027

    Bbs6

    Blank Blank

    不要指望oracle主动去给你做这些,应该是你告诉oracle怎么做~

    1 2016-08-31 11:45:41

    只看TA 引用 举报 #2    得分 5

    ORACLE 导大数据混合使用rownum和order by引起的乱序问题原排序代码:       select id ,rn from(                    select id ,rownum rn from temp_org order by  id )           where rn >10000 and rn 由于原库是生成库,所以为了安全起见,我新建了一张临时表 :create table temp_org as select

    js14982

    Bbs6

    Blank Blank

    简单的查询一样,复杂加关联后的一般都不一样了

    1 2016-08-31 11:48:57

    只看TA 引用 举报 #3    得分 5

    转载http://www.xuanhun521.com/Blog/2014/8/13/google-hack-%E4%B9%8B-%E6%9F%A5%E8%AF%A2%E8%AF%AD%E6%B3%9google hack 之 查询语法 08/13/2014     玄魂     0    244 谷歌网页搜索技术,大部分在百度等搜索引擎中也适用。同样,这些搜索技术是来源于传统数据库检索技术,因而,对这部分的学习,能为后续章节的数据库检索奠定基础,并能获得直观的认识。本部分结合应

    wugang789

    Bbs1

    表不动,语句动不动?语句不动基本后面查询都是从内存里面取了。理论上我觉得应该一样。

    展开全文
  • linux oracle 依赖顺序

    2014-09-14 19:21:30
    linux oracle 依赖顺序
  • oracle查询执行顺序规则

    千次阅读 2018-11-23 09:10:47
    SELECT [DISTINCT] * | 列 [别名] , 列 [别名] , ... 执行顺序 3、控制要显示的数据列 FROM 表名称 [别名] 执行顺序 1、确定数据来源 [WHERE 条件(s...

    SELECT [DISTINCT] * |  列  [别名] , 列  [别名] , ...                        执行顺序   3、控制要显示的数据列
    FROM  表名称  [别名]                                                                    执行顺序   1、确定数据来源
    [WHERE  条件(s)]                                                                          执行顺序   2、根据判断条件选择参与的数据行
    [ORDER BY  字段  [ASC  | DESC] ,  字段  [ASC | DESC] , ..]   ;   执行顺序   4、数据排序

    展开全文
  • oracle查询语句执行顺序

    千次阅读 2006-08-05 12:52:00
    oracle查询语句执行顺序1.根据where子句选择行2.根据group by子句组合行3.为每个组计算分组函数结果4.再根据having子句选择和排除组5.根据order by 子句中的分组函数的结果对组进行排序. order by 子句必须使用...
    oracle中查询语句执行顺序
    
    1.根据where子句选择行
    2.根据group by子句组合行
    3.为每个组计算分组函数结果
    4.再根据having子句选择和排除组
    5.根据order by 子句中的分组函数的结果对组进行排序. order by 子句必须使用分组函数或者在group by指定的列 
    展开全文
  • Oracle根据查询条件 in 里的参数顺序排序 1、表内容 2、普通查询结果 select * from Test t where t.name in (‘33’,‘22’,‘44’,‘55’); 3、按in排序的结果 select * from Test t where t.name in (‘33’,...
  • 查询语句中各个语句的执行顺序,比如:select ... from ....这里先执行的是from然后再执行select,不过谁有官方提供的文档看看。谢谢了!
  • 以前对查询语句不是很了解,只会简单的查询,经常会犯一些错误,在此列出一种,以此为戒。 SELECT … FROM … WHERE … GROUP BY … HAVING … ORDER BY … LIMIT …
  • 1)LIKE:模糊查询,需要借助两个通配符,%:表示0到多个字符;_:标识单个字符。 2)IN(list):用来取出符合列表范围中的数据。 3)NOT IN(list): 取出不符合此列表中的数据记录。 4)BETWEEN…AND…:用来...
  • Oracle高级查询

    千次阅读 2016-11-06 23:49:10
    概述高级查询在数据库的开发过程中应用广泛,本博文将从分组查询、多表查询和子查询三个方面介绍Oracle的高级查询,最后典型案例的应用。sql窗口修改已执行的sqled表示编辑上个sql / 表示执行上个sql分组查询分组...
  • Oracle修改字段顺序

    2013-12-12 11:21:22
    Oracle Pl/SQL 修改各字段显示的顺序
  • Oracle 语句提高查询效率的方法 1:.. where column in(select * from ... where ...); 2:... where exists (select 'X' from ...where ...); 第二种格式要远比第一种格式的效率高。在Oracle中可以几乎将所有的...
  • Oracle自定义顺序排序

    千次阅读 2019-09-24 09:17:56
    表中有如下数据按BBTYPE字段排序 ...可借助decode函数,自定义顺序排序。 order by decode(bbtype, '1', 1, '2', 2, '4', 3, '5', 4, '3', 5); decode含义解释 decode(条件,值1,返回值1,值2,返回值2,…值n,返回值n,...
  • 因在工作中数据库查询数量百万级表中需要多条件查询,但是筛选条件只有一列有索引,查询效率很低,后查阅资料后修改where后执行的条件顺序,瞬间执行查询语句提速至毫秒级。故以此为记。 eg:SELECT 列名 FROM 表名...
  • 当多表查询、子查询、集合查询都能完成同样任务时,考虑到效率问题,我们优先选择多表查询,其次是子查询,迫不得已时使用集合查询
  • Oracle分组查询

    千次阅读 2018-08-12 22:24:59
    Oracle分组查询 select 组信息 from 表名 [where条件] group by 分组字段 [having分组条件] [order by 排序字段 asc|desc]; 常用的聚合函数: count(字段名|*):求总的记录数; sum(字段名):求和; avg...
  • 修改Oracle字段顺序

    千次阅读 2018-05-23 17:58:22
    Oracle数据库在创建表之后,是不支持用工具或代码直接修改字段的顺序的,但还是有其他方式修改的。比较流行的有以下两种方式:一、1....2.在oracle中每张表在系统中都对应一个id,所以查询出需要修改表的id。select ...
  • 在一些需求中会要求打乱结果集顺序随机展示。 Oracle 实现select(查询)的结果集随机顺序展示
  • 本篇文章是对oracle select执行顺序进行了详细的分析介绍,需要的朋友参考下
  • oracle查询中表的连接顺序 手工指定

    千次阅读 2012-02-17 09:49:29
    对那些连接了很多表的查询Oracle需要花费大量的时间来检测连接这些表的适当顺序。 评估表的连接顺序 在SQL语句的准备过程中,花费最多的步骤是生成执行计划,特别是处理有多个表连接的查询。当Oracle评估表的...
  • ORCLE-Select 语句执行顺序以及如何提高Oracle 基本查询效率  今天把这几天做的练习复习了一下,不知道自己写得代码执行的效率如何以及要如何提高,于是乎上网开始研究一些材料,现整理如下:  ...
  • Oracle查询死锁表

    2011-08-02 10:24:14
    OracleOracle查询死锁表OracleOracle查询死锁表OracleOracle查询死锁表
  • ORACLE分级查询

    千次阅读 2016-11-27 14:08:50
    分级查询主要用于查询树形结构的记录。树形结构的数据存放在表中,数据之间的层次关系即父子关系,通过表中的列与列间的关系来描述。
  • Oracle递归查询

    2012-07-17 22:50:55
    有的情况下,我们需要用递归的方法整理数据,这才程序中很容易做到,但是在数据库 ...下面我以最典型的树形结构来说明下如何在Oracle使用递归查 询。 为了说明方便,创建一张数据库表,用于存储一个简单的树形结构
  • 今天把这几天做的练习复习了一下,不知道自己写得代码执行的效率如何以及要如何提高,于是乎上网开始研究... 首先,要了解在Oracle中Sql语句运行的机制。以下是sql语句的执行步骤:  1)语法分析,分析语句的语法是
  • 语句 执行顺序 select –5 from –1 where –2 group by –3 having –4 order by ...
  • Oracle中子查询

    千次阅读 2016-11-30 17:46:18
    1.单行子查询 select * from emp where sal > (select sal from emp where empno > 7876); 2.子查询空值/多值问题 如果子查询未返回任何行,则主查询也不会返回任何结果。 (空值)select * from emp where sal >...
  • 主要介绍了Oracle数据库中ORDER BY排序和查询按IN条件的顺序输出的方法,其中ORDER BY的排序结果需要注意其是否稳定,需要的朋友可以参考下
  • Oracle 模糊查询方法

    万次阅读 热门讨论 2014-10-12 21:12:36
    那么在Oracle中模糊查询是如何实现的呢?   一、我们可以在where子句中使用like关键字来达到Oracle模糊查询的效果;在Where子句中,可以对datetime、char、varchar字段类型的列用Like关键字配合通配符来实现...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 164,561
精华内容 65,824
关键字:

oracle顺序查询