Oracle SQL学习

1、SQL中逻辑比较的可能结果是TRUE、FALSE、未知。当其中包含空值(null)的时候,比较结果就会是未知

2、WHERE子句是对FROM子句的结果集进行过滤。

3、GROUP BY子句是将执行FROM和WHERE子句后得到的结果集进行聚合。Select列表中的任何非聚合字段都必须包含在GROUP BY表达式中。

4、HAVING子句是在GROUP BY子句执行后用来筛选汇总值的WHERE子句。

5、SELECT子句中的子查询称为标量子查询,标量子查询在结果集中的每一行结果产生时都要执行一遍。

6、DISTINCT子句用来在其他子句执行完毕以后,从结果集中去除重复的行。

7、ORDER BY子句会在其他所有子句都执行完之后,按照指定的顺序对最终结果集进行排序。需要排序的数据量大小是非常重要的。数据量大小是指结果集中所包含的总字节数。可以通过行数乘以每一行的字节数来估计数据集的大小。较小的排序会完全在内存中来实现,而较大的排序将不得不使用临时磁盘空间来完成。在内存中完成的排序比必须使用磁盘来完成的排序要快。一般来说,排序是查询过程中开销相当大的一个处理步骤,尤其当返回结果集很大的时候。

8、共享池是Oracle缓存程序数据的地方。执行过的每一句SQL语句,在共享池中都存有解析后的内容。共享池中存储这些语句的地方称为库高速缓存。在解析每一句语句之前,Oracle都会检查库高速缓存中是否已经存在相同的语句,如果存在,Oracle就会直接从缓存中读取并使用该信息,而不会将同样的语句再解析一遍。不管有多少个用户想要执行同样的SQL语句,Oracle通常都会只解析该语句一次,然后在所有想要使用的用户之间共享。Oracle会根据算法来管理缓存,旧的并很少使用的语句将会被清除掉。为了最有效地使用共享池,语句需要可以共享。如果所写的每一条语句都是唯一的,基本上就违背了设立共享池的初衷。语句共享性越差,对响应时间的影响也就会越大。

9、Oracle中语句的解析包括验证语句的语法、检验提及的对象、确认该对象的用户权限。如果这些检查都通过了,下一个步骤就是要看看这个语句之前是不是执行过。如果是,Oracle将取回之前解析的信息并重用。这种类型的解析被称为软解析。如果该语句执行没有被执行过,那么Oracle就将执行所有的工作来为当前的语句生成执行计划,并且将它存在缓存中以便将来重用,这种类型的解析被称为硬解析。

select * from employess where department_id = 60

软解析耗时:0.000095秒,硬解析耗时:0.060374秒

10、字母大小写、是否添加注释等,任何的不同都会使语句具有不同的散列值(Oracle根据散列值来判断语句是否相同),从而导致Oracle对语句进行硬解析。所以在SQL中应该使用绑定变量而不是常量,当使用绑定变量时,即使改变了绑定变量的值,Oracle还是可以共享这个语句。

1)使用绑定变量:

select * from employees where department_id = :v_dept

对变量v_dept分别传入10、20,是软解析

2)使用常量:

select * from employees where department_id = 10

select * from employees where department_id = 20

这两条语句是不同的,会进行硬解析

11、缓冲区缓存是系统全局内存区域最大的部分之一。在数据库块从硬盘中读取出来后或者写入硬盘之前,它用来存储数据库块。块是Oracle进行操作的最小单位。块中含有表数据行或者索引条目,一些块还会包括用来排序的临时数据。Oracle必须读取块来获得SQL语句需要的数据行。写SQL语句的时候,应该使语句在获取能够满足查询需要的数据行时访问尽可能少的数据块,这有助于Oracle使用较少的锁存器。

12、查询语句通过了语法和权限检查之后,就进入了查询转换阶段。查询转换的主要目的就是确定如果改变查询的写法会不会提供更好的查询计划。查询转换有可能会产生不同的结果。

13、谓语前推就是将筛选动作更早地进行。如果一个谓语可以通过将它前推到不可合并查询块中更早地执行,在剩下的执行计划中所需要抓取的数据就会更少,更少的数据意味着要做的事情也更少,所花的时间也就更少。

14、

15、当谓语中包含使用UNIQUE或PRIMARY KEY 索引的列作为条件的时候,就会选用索引唯一扫描。

16、当谓语中包含将会返回一定范围数据的条件时,就会选择索引范围扫描。索引可以是唯一或者不唯一的,因为是由该条件来确定是否会返回多个数据行。所指定的条件可以使用诸如<、>、LIKE、BETWEEN甚至是=等运算符。当以通配符开头的条件(如 ’%abc’ 的LIKE运算符),优化器将不会选用该列上的索引范围扫描。因为条件太宽泛了。

17、当没有谓语但是所需获取列的列表可以通过其中一列的索引来获得、或者谓语中包含一个位于索引中非引导列上的条件、或者数据可以通过一个排过序的索引来获取并且会省去单独的排序步骤,将会选择索引全扫描。

18、索引全扫描比全表扫描效率要高,是因为每一个索引块要比表数据块包含更多条目,从而总的需要访问的块数就相应较少。在查询字段列表中所有字段都是索引条目的一部分的时候,就能完全跳过访问表的步骤。

19、在第一对表联结以后,下一张表是与第一个联结得到结果进行联结。这个过程会不断进行直到所有的表都被联结。

20、所有进行集合运算的查询都必须符合下面的条件:

       1)所有的查询必须返回相同数目,相同类型(按照顺序比较,可以隐式转换)的列

       2)ORDER BY子句不能在某个单独的查询中出现,只能用在整个查询的最后,用来对

整个集合运算的结果集进行排序。

3)列名源自第一个查询。

每个查询都是先被单独处理,然后进行集合运算。除了UNION ALL,其它所有的集合运算都需要对结果进行排序/取唯一值操作,这就意味着需要额外的支出来处理查询。如果知道不会出现重复或者不关心是否会出现重复,请一定使用UNION ALL。

 

      

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值