第二周周报

要求:

1、了解索引、序列、触发器等;

2、学习存储过程,并要求熟练掌握;

3、了解sql语句优化,数据库表空间查询管理,session管理;

 

简要说明我的学习过程和问题及解决

1,group by来分组数据时特别说明了select 列表项中不存在的列可以出现在group by的列表项中,但反过来就不行了,在select列表项中出现的列必须全部出现在group by后面

2,FIRST_VALUE返回组中数据窗口的第一个值。有些类似于SQL Server中的first()。oracle 中很多函数与SQL92标准中的函数不一致,出现关键字无效这样的错误,可以首先查询是不是内置函数不一致。

3,在进行SQL语句编写时,会遇到大量的同时进行Insert/Update的语句,也就是说当存在记录时,就更新(Update),不存在数据时,就插入(Insert)merge into 语法不仅没有if exists语法啰嗦,而且比if exists还要高效很多。

4,查询一张表的列数目!selectcount(column_name) from user_tab_columns where table_name=upper('qj_test');

网上查找大量资料,都是错误的解法,目前只了解到此方法查询出列数目!

5,快速粘贴复制excel的方法,SELECT * FROM qj_test8 FOR UPDATE前提是表的字段和excel的字段要匹配上打开锁,再按一下加号.鼠标点到第一列的列头,使全列成选中状态,然后粘贴,最后commit提交即可

6,过程和函数统称为PL/SQL子程序,他们是被命名的PL/SQL块,均存储在数据库中,并通过输入、输出参数或输入/输出参数与其调用者交换信息。过程和函数的唯一区别是函数总向调用者返回数据,而过程则不返回数据

7,存储过程的写法中,(qj_autoid IN qj_test5.qj_autoid%TYPE) 修改为(qj_autoid IN NUMBER)如果不修改,则需要在相应的位置处添加:,SQL%NOTFOUND 是一个布尔值。与最近的sql语句(update,insert,delete,select)发生交互,当最近的一条sql语句没有涉及任何行的时候,则返回true。否则返回false。这样的语句在实际应用中,是非常有用的。例如要update一行数据时,如果没有找到,就可以作相应操作。

8,当数据库或PL/SQL在运行时发生错误时,一个异常被PL/SQL运行时引擎自动抛出。异常也可以通过RAISE语句抛出RAISE exception_name;

9,符号的说明,||用来连接字符串

10,使用过程与函数的原则:1、如果需要返回多个值和不返回值,就使用过程;如果只需要返回一个值,就使用函数。2、过程一般用于执行一个指定的动作,函数一般用于计算和返回一个值。3、可以SQL语句内部(如表达式)调用函数来完成复杂的计算问题,但不能调用过程。所以这是函数的特色。

11,体验索引的作用,先写了一个存储过程在一张表中插入了10W数据,结论是加索引和不加索引几乎没有区别,于是重新写了一个插入500W随机生成数据的4张表,索引添加之后,效率果然大幅度提升了,结果:17 18表没有建立索引,17表是15表的复制  18表是16表的复制数据完全一样,执行查询同样的语句,加索引的15 16表只用了0.032s而没加索引的 17 18 表却用了24.149s。(用一张加索引的表和一张没有加索引表多表查询,效率和两张都没有加索引的表基本没有差别)

12,oracle 随机生成函数

1小数( 0 ~ 1) select dbms_random.value from dual

2指定范围内的小数 ( 0 ~ 100 ) select dbms_random.value(0,100) from dual

3指定范围内的整数 ( 0 ~ 100 )select trunc(dbms_random.value(0,100)) from dual

4长度为20的随机数字串select substr(cast(dbms_random.value as varchar2(38)),3,20) from dual

5、正态分布的随机数select dbms_random.normal from dual

6随机字符串select dbms_random.string(opt, length) from dual

13select * from user_indexes where table_NAME ='QJ_TEST15';可以查看表添加的索引  !!!select * from user_ind_columns where index_name='QJ_TESTINDEX'建好的索引,查看它建立在哪个表的哪个列上

14,回话和JOB的查询,select * from v$session  WHERE machine LIKE '%QIJIN%'

SELECT * FROM DBA_JOBS_RUNNING

15sql优化,当一个sql语句提交后,oracle会首先检查一下共享缓冲池(shared pool)里有没有与之完全相同的语句,如果有的话只须执行软分析即可,否则就得进行硬分析。

16,基于oracle的应用系统很多性能问题,是由应用系统sql性能低劣引起的,所以,sql的性能优化很重要,分析与优化sql的性能我们一般通过查看该sql的执行计划,本文就如何看懂执行计划,以及如何通过分析执行计划对sql进行优化做相应说明。

17,学会了查询动态性能表,select *

from v$db_object_cache

where name LIKE 'SELECT * FROM qj_test5%'

v$db_object_cache中的常用列:OWNER:对象拥有者
NAME:对象名称
TYPE:对象类型(如,sequence,procedure,function,package,package body,trigger)
KEPT
:告知是否对象常驻shared pool(yes/no),有赖于这个对象是否已经利用PL/SQL 过程DBMS_SHARED_POOL.KEEP“保持(永久固定在内存中)
SHARABLE_MEM:共享内存占用
PINS:当前执行对象的session
LOCKS:当前锁定对象的session

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

19,在子查询中,NOT IN子句将执行一个内部的排序和合并. 无论在哪种情况下,NOT IN都是最低效的 (因为它对子查询中的表执行了一个全表遍历).  使用NOT EXISTS 子句可以有效地利用索引。尽可能使用NOT EXISTS来代替NOT IN,尽管二者都使用了NOT(不能使用索引而降低速度),NOT EXISTS要比NOT IN查询效率更高。

20,尽量多使用COMMIT回滚段上用于恢复数据的信息.被程序语句获得的锁redo log buffer 中的空间ORACLE为管理上述3种资源中的内部花费,通过使用>=<=等,避免使用NOT命令,避免在索引列上使用计算

21,分区表,当表中的数据量不断增大,查询数据的速度就会变慢,应用程序的性能就会下降,这时就应该考虑对表进行分区。表进行分区后,逻辑上表仍然是一张完整的表,只是将表中的数据在物理上存放到多个表空间(物理文件上),这样查询数据时,不至于每次都扫描整张表。

你可能感兴趣的:(oracle,sql,sql,数据库,session,server,insert)