zoukankan      html  css  js  c++  java
  • 数据库基础

     数据库基础问题汇总

    1.并发事务之间相互影响的类型?

    脏读:一个事务读取了另一个事务尚未提交的数据。

    不可重复读:同一个事物中前后两次相同的查询,结果不一样。

    幻读:一个事务中多次进行相同范围的查询,结果不一样。

    eg1 幻读:事务T1第一次查询select count(*) from people where age < 10得到了10,然后另一个事务T2此时插入了一条age=9的记录,然后T1再次执行age<10的查询时,结果等于11,两次结果不同,产生了幻读。

    2. SQL92标准定义的四种事务隔离级别?

    Read Uncommitted:未提交读,容许:脏读、不可重复读、幻读

    Read Committed:已提交读,不容许:脏读;容许:不可重复读、幻读

    Repeatable Read:可重复读,不容许:脏读、不可重复读;容许:幻读

    Serializable:串行化,不容许:脏读、不可重复读、幻读

    3.Oracle支持的事务隔离级别?

    Read Committed:(默认级别)语句级数据一致性,不能保证事务级数据一致性。

    Serializable:能保证事务级数据一致性

    read-only-mode:事务只能看到事务执行前已经提交的数据,且不能执行insert/update/delete语句。

    4.Oracle如何实现并发访问的数据一致性?

    利用“多版本一致性模型(Multiversion Consistency Model)”、各种锁和事务来共同实现。

    参考:http://blog.csdn.net/gufeng672/article/details/7489679

    多版本一致性模型:本质上是给每个查询约定了一个时间时间点,查询只能看到那个时间点的数据库数据,那个时间点之后数据库的修改对它是不可见的。

    Oracle中强制实现“语句级读一致性”和在Serializable模式下的“事务级读一致性”。

    语句级读一致性:通过保证单一查询(是单一查询而不是事务)的结果来自DML语句开始执行的时间点的所有数据,DML语句执行之后数据库的数据变化对该语句是不可见的。

    事务级读一致性:事务只能看到事务执行前已经提交的数据,和事务内部通过Insert、Update、Delete语句对数据的修改。

    5.Oracle数据库中的锁?

    有各种锁,如DML锁(数据锁)、DDL锁(字典锁)等,平时主要讲的数数据锁。

    DML锁又分为TM锁(表锁)、TX锁(行锁/事务锁),TX锁只有排他锁,TM锁有多种类型:S锁(共享锁)、X锁(排他锁)、SS锁(行共享锁)、SX锁(行排他锁)、SRX锁。

    参考:http://blog.csdn.net/liqfyiyi/article/details/7371723

    6.SQL语句执行顺序?

    参考:http://www.cnblogs.com/qanholas/archive/2010/10/24/1859924.html

    参考:http://www.tuicool.com/articles/fERNv2

    (8)SELECT (9)DISTINCT  (11)<Top Num> <select list>

    (1)FROM [left_table]

    (3)<join_type> JOIN <right_table>

    (2)ON <join_condition>

    (4)WHERE <where_condition>

    (5)GROUP BY <group_by_list>

    (6)WITH <CUBE | RollUP>

    (7)HAVING <having_condition>

    (10)ORDER BY <order_by_list>

    逻辑查询处理阶段简介

    1.FROM:对FROM子句中的前两个表执行笛卡尔积(Cartesian product)(交叉联接),生成虚拟表VT1

    2.ON:对VT1应用ON筛选器。只有那些使<join_condition>为真的行才被插入VT2

    3.OUTER(JOIN):如果指定了OUTER JOIN(相对于CROSS JOIN (INNER JOIN),保留表(preserved table:左外部联接把左表标记为保留表,右外部联接把右表标记为保留表,完全外部联接把两个表都标记为保留表)中未找到匹配的行将作为外部行添加到 VT2,生成VT3.如果FROM子句包含两个以上的表,则对上一个联接生成的结果表和下一个表重复执行步骤1到步骤3,直到处理完所有的表为止。

    4.WHERE:对VT3应用WHERE筛选器。只有使<where_condition>true的行才被插入VT4.

    5.GROUP BY:按GROUP BY子句中的列列表对VT4中的行分组,生成VT5.

    6.CUBE|ROLLUP:把超组(Suppergroups)插入VT5,生成VT6.

    7.HAVING:对VT6应用HAVING筛选器。只有使<having_condition>true的组才会被插入VT7.

    8.SELECT:处理SELECT列表,产生VT8.

    9.DISTINCT:将重复的行从VT8中移除,产生VT9.

    10.ORDER BY:将VT9中的行按ORDER BY 子句中的列列表排序,生成游标(VC10).

    11.TOP:从VC10的开始处选择指定数量或比例的行,生成表VT11,并返回调用者。

    7.连接查询有哪几种?

    内连接(等值连接)

    左外连接/右外连接

    交叉连接

    8.wherehaving子句区别?

    where是行级别筛选,having是组级别筛选,它们后面接的条件语法一样,这意味着用在where后面的语句,一般都可以用在having后(having中的字段必须出现在group by中吗?)。

    9.having可以在没有group by的查询中使用吗?结果会怎样?

    9.SQL中的派生表?

    派生表就是子查询产生的虚表。

    from (select * from t1)

    10.SQL窗口函数/分析函数能做什么?

    窗口函数用来指定聚集函数的计算范围,可以在不使用group by情况下,来指定每个聚集函数的作用范围。使用了group by子句后,select中能够操作的字段就会受限,而是用窗口函数则不会收影响。当然,有些情况下,可以先通过group by来做子查询,外部套用其它查询也能实现窗口函数的功能。事实上窗口函数能够提供更容易理解的SQL语句,同时窗口函数性能应该也更容易被DBMS优化。

    参考:http://blog.csdn.net/mfkpie/article/details/16364513

    “聚合函数over()”

    “聚合函数over(partition by 字段)” 按照字段分区后来进行聚合函数计算

    “聚合函数 over(order by 字段 [计算范围描述])”

    范围描述格式:

    [(range|rows)

      between

       (unbounded preceding|NUM preceding|current row)

      and

       (current row|unbounded follwing| NUM following)

    ]

    11.执行计划解读?

    每条sql语句都会被解析成执行计划,然后再执行。执行计划实际上是一个树状结构,每个节点表示一个操作,每个父操作都有一个或者多个子操作,调用时,从上往下依次调用,数据返回时,从下往上,子操作的数据返回给父操作,依次往上返回执行。

    每个操作可能需要谓词条件(比如where中提供的查询条件限制)。

    谓词条件:条件谓词、过滤谓词。要理解两种谓词的差别。

    条件谓词:用来定位从物理对象上定位符合条件的数据,然后读取。

    过滤谓词:过滤谓词操作的数据是已经从物理存储上读取了的数据。

    对象访问方式:表访问、索引访问、固态表访问、物化视图访问

    表访问:

    TABLE ACCESS ( FULL )

    TABLE ACCESS ( BY INDEX ROWID )从(全局分区)索引中获得rowid

    TABLE ACCESS ( BY LOCAL INDEX ROWID ) 本地分区索引获得roid

    TABLE ACCESS ( BY GLOBAL INDEX ROWID )

    TABLE ACCESS ( BY USER ROWID )

    LOAD AS SELECT

  • 相关阅读:
    Lookup注解
    解决数据量大,分页查询慢的方案
    一个http的请求分析
    MYSQL
    什么是性能优化
    编码规范随笔
    装饰者模式
    单例模式
    J.U.C并发包(1)
    Java内存模型
  • 原文地址:https://www.cnblogs.com/wrencai/p/5857076.html
Copyright © 2011-2022 走看看