
SQL
文章平均质量分 65
conggova
数据库、大数据、数据仓库、数据挖掘
展开
-
表联结中的ON条件与WHERE条件
CONG@ prod> select * from q1 ; ID---------- 1 3 2 5 rows selected. CONG@ prod> select * from q2 ; ID---------- 1原创 2017-08-24 00:49:26 · 398 阅读 · 0 评论 -
SQL空值在连接中的处理
一个简单的例子:q1包含两行空值CONG@ prod> select * from q1 ; ID---------- 1 3 rows selected. q2也是CONG@ prod> select * from q2 ; ID---------- 1原创 2017-08-24 00:47:02 · 1072 阅读 · 0 评论 -
Innodb的行级锁的特性
Innodb的行级锁依赖于索引,如果条件字段上没有索引,将会锁定全表。 SESSION1:mysql> create table t1 ( id int ) ;Query OK, 0 rows affected (0.09 sec) mysql> insert into t1 values(1 ), (2), ( 3) ;Query OK, 3 rows affecte原创 2017-08-24 00:20:01 · 265 阅读 · 0 评论 -
Oracle 11g引用分区reference partition
解决的问题:如果父表是分区表,子表想要按照父表的方式进行分区。父表中被引用的主键列不一定要是分区键。 一个例子:下面是设计分区方案过程中的一个典型问题,并非所有表都需要根据其进行分区的列。假设要创建一个销售系统,该系统包括两个简单的表(sales 和customers)。 customers 表的创建如下所示: create table customers原创 2017-09-01 22:40:48 · 2317 阅读 · 0 评论 -
Oracle优化——三种联结方法
NESTED LOOPS条件:内表必须有索引,否则会造成NESTED TABLE SCAN。选取比例小。SORT MERGE条件:选取表中行的比例较大。内表没有索引。缺点:需要对表排序,内存开销非常大。HASH JOIN(先将一张表做成HASH表,再做NESTED LOOPS)条件:必须是等值连接。优势:同等条件下强于SORT MERGE。选取行的比例大时,优于NESTED LO原创 2017-09-02 00:03:11 · 435 阅读 · 0 评论 -
外联结的ON条件与WHERE条件的区别
请注意以下联结的不同。employee_id = 200作为联结条件时,会有其余的行输出:HR@ prod> select /*+ ordered */ first_name , last_name , department_name 2 from employees e right outer join departments d on ( e.department_id = d.d原创 2017-09-02 00:10:14 · 380 阅读 · 0 评论 -
Oracle优化——外联结的执行计划
外联结不要使用Oracle自有的方式在where条件中加(+),而要用ANSI的方式(… OUTER JOIN)。Oracle的方式不支持全外联结,而且存在诡异的BUG。左外连接与右外连接时,Oracle会把返回全部记录的表做为驱动表,哪怕这样是违背了ordered提示。可以应用所有的联结方法,效率也与内联结相仿。HR@ prod> select /*+ ordered */ first_n原创 2017-09-02 00:12:16 · 356 阅读 · 0 评论 -
Oracle优化——星型联结转换(star_transformation_enabled)
参见 Oracle性能优化求生指南。另外请了解星型联结索引,此类问题的最佳实践。这是一个星型联结的例子,sales为事实表,其它为维度表。Where条件全部都作用在维度表上面。SH@ prod> select quantity_sold , amount_sold from sales s join products p using ( prod_id ) 2 join times原创 2017-09-02 00:16:42 · 1529 阅读 · 0 评论 -
Oracle SQL高级编程——子查询因子化全解析
参见《Oracle SQL高级编程》。概述子查询因子化就是ANSI中的公共表达式。 从11.2开始,子查询因子化开始支持递归。可以实现CONNECT BY的功能。标准的子查询因子化的例子这是一个非常复杂的查询,下面是不加因子化的版本。注意PIVOT的用法。select * from ( select /*+ gather_plan_statistics */ product ,原创 2017-09-02 01:31:33 · 666 阅读 · 0 评论 -
Oracle SQL高级编程——Model子句全解析
参见 《Oracle SQL高级编程》。第一个例子,初步认识SH@ prod> col product format a30SH@ prod> col country format a10SH@ prod> col region format a10SH@ prod> col year format 9999SH@ prod> col week format 99SH@ prod> col原创 2017-09-02 01:52:17 · 1551 阅读 · 0 评论 -
SQL中用一个参数决定选取部分还是全部
下面的例子中只有一个参数,但是可以决定是选取某个部门还是全部。 如果给定值(10)等于某个部门编号那么选取这个部门的SCOTT@ prod> with t as (select 10 from dual) 2 select * from emp where deptno = (select * from t) 3 union 4 select * from e原创 2017-08-24 00:52:52 · 633 阅读 · 0 评论 -
PIPELINED管道化(流水线)表函数
注意:表函数只能用SQL语句调用,而不能当作一个简单的PLSQL函数。 在实际的应用中,为了让PL/SQL 函数返回数据的多个行,必须通过返回一个 REF CURSOR 或一个数据集合来完成。REF CURSOR 的这种情况局限于可以从查询中选择的数据(数据可以通过一个查询得到)。数据集合则可以通过复杂的操作得到。Oracle 9i 通过引入的管道化表函数使得集合可以一边生成一边返原创 2017-08-24 00:57:51 · 919 阅读 · 0 评论 -
PLS-00653与管道化表函数的调用
Oracle 应用管道函数时出现PLS-00653:在 PL/SQL 定义域内不允许有聚集/表函数 创建一个表类型的 create or replace type str_list as table of varchar(300) ; 比如我们创建一个带pipelied 管道函数返回一张表或一个数据源数据的函数test5create or replace functi原创 2017-08-24 01:01:29 · 5463 阅读 · 0 评论 -
Oracle的多版本控制小实验
本文将演示Oracle的多版本控制,以及串行化事务。在session1中,建一个表,插入两条测试数据SESSION1:SCOTT@ prod> create table t ( x int ) ;Table created.SCOTT@ prod> insert into t values(1) ;1 row created.SCOTT@ prod> select * from t ;原创 2017-09-03 00:46:05 · 412 阅读 · 0 评论 -
Oracle用HASH簇表优化latch hit过低
部署测试环境以SYS用户在HR中建立与DBA_OBJECTS相同的表,重复插入得到100万行,并且添加一列ID,为这列添加连续的值,并建立唯一索引。 将AWR快照的产生时间设为10分钟。 在五个窗口并行执行:建立簇表所需信息HASHKEYS=distinct values SIZE=(avg_row_len*total_rows/HashKeys)*1.1 1.2可能更保险原创 2017-09-02 11:00:51 · 613 阅读 · 0 评论 -
脏读和READ UNCOMMITED隔离级别
读取到别的事务中尚未提交的数据,是绝对应该避免的。 一般来说脏读都是没意义的,都是坏事,在READ UNCOMMITED事务隔离级别下允许脏读。Oracle无论如何都不会出现脏读,不支持READ UNCOMMITED事务隔离级别。MySQL支持READ UNCOMMITED事务隔离级别(为了实现读的无阻塞):SESSION1:mysql> select @@tx_isola原创 2017-09-02 10:43:41 · 915 阅读 · 0 评论 -
Oracle TX锁(事务锁)
也叫事务锁。每个事务只能有一个。 每个事务对应该一个TX锁,在该事务中修改或者select for update的每一行都会指向这个锁(数据块的结构中有相关的标志)。 如果一个事务想修改的某条记录已经被另一个事务锁住,那么这个事务会等待,如果再有事务会形成一个列表,等待的信息可以在v$lock里面查到。做一个实验(在TOM书的197页)准备实验数据:SCOTT@ prod>原创 2017-09-02 10:40:04 · 748 阅读 · 0 评论 -
Oracle SQL高级编程——分析函数(窗口函数)全面讲解
参加《Oracle SQL高级编程》概述分析函数是以一定的方法在一个与当前行相关的结果子集中进行计算,也称为窗口函数。 一般结构为 Function(arg1 , arg2 ……) over(partition by clause order by clause windowing clause )Windowing clause : rows | range between start_ex原创 2017-09-02 02:16:36 · 1470 阅读 · 0 评论 -
Oracle优化——如何查看语句的准确的执行计划(explain plan可能不是真实的)
参见 Oracle性能优化求生指南。建虚拟索引HR@ prod> create index test_ix1 on employees4 ( employee_id ) nosegment;HR@ prod> alter session set "_use_nosegment_indexes" = true ;HR@ prod> set autotrace onHR@ prod> se原创 2017-09-02 00:23:00 · 848 阅读 · 0 评论 -
Oracle优化——LIKE与索引(以%开头的LIKE会不走索引或走索引全扫描)
这样会走索引范围扫描,因为这个表达式有前导性。SH@ prod> set autotrace onSH@ prod> select max(cust_credit_limit) , count(*) from customers_ne where cust_last_name like 'Vaugh%' ;MAX(CUST_CREDIT_LIMIT) COUNT(*)--------原创 2017-09-01 23:58:25 · 6888 阅读 · 0 评论 -
Oracle 用hint来影响执行计划
全表扫描提示SYS@ prod> grant plustrace to hr ;Grant succeeded.SYS@ prod> conn hr/hrConnected.HR@ prod> set autotrace onHR@ prod> select /*+ full(employees) */ first_name from employees where employe原创 2017-09-01 23:29:10 · 290 阅读 · 0 评论 -
NOT EXISTS不等于NOT IN,IN等于EXISTS
IN (select id from a ) 等价于EXISTS(select 1 from a where id = outer.id)。而NOT IN只在两个表的两个字段上面都不存在NULL值的时候才等价。当一个集合中存在NULL值的时候,NOT IN的结果是UNKNOW。判断一个NULL值在一个集合中是否存在,结果同样是UNKNOW。当mysql> select * from原创 2017-08-24 01:19:44 · 534 阅读 · 0 评论 -
用SQL分析世界杯数据
create table teams (id varchar2(3) primary key , name varchar2(20) not null ) ;create table match_results (team1 varchar2(3) references teams(id) not null, team1_goals integer not null ,team2 va原创 2017-08-24 01:04:55 · 650 阅读 · 0 评论 -
Oracle SQL高级编程——位图联结索引
参加《Oracle SQL高级编程》一个典型的数据仓库查询: 这个查询中sales 是事实表 , 一般很大。 Products , customers , channels是维度表 , 一般很小,可以有冗余。SH@ prod1> explain plan for 2 select sum( s.quantity_sold ) , sum( s.amount_sold ) from sal原创 2017-09-02 02:00:35 · 418 阅读 · 0 评论