基础的了解数据库的优化

来源:互联网 发布:java c3p0连接池使用 编辑:程序博客网 时间:2024/05/16 07:56
一、数据库语句优化
1.分页的sql语句查询语句
(1).查询数据量小时适用
    select * from (select d.*,rownum rn from dept d where rownum<=5) where rn>=1;
(2).速度较稳定,推荐使用
    select * from( select row_number()over(order by deptno)rn,d.* from dept d)
    where rn between 1 and 5;


(3).提示:(SQL ROW_NUMBER() OVER函数的基本用法用法)


语法:ROW_NUMBER() OVER(PARTITION BY COLUMN ORDER BY COLUMN)


简单的说row_number()从1开始,为每一条分组记录返回一个数字,这里的ROW_NUMBER() OVER (ORDER BY xlh DESC) 是先把xlh列降序,再为降序以后的没条xlh记录返回一个序号。 
示例: 
xlh           row_num 
1700              1 
1500              2 
1085              3 
710               4


row_number() OVER (PARTITION BY COL1 ORDER BY COL2) 表示根据COL1分组,在分组内部根据 COL2排序,而此函数计算的值就表示每组内部排序后的顺序编号(组内连续的唯一的)


实例:


初始化数据


create table employee (empid int ,deptid int ,salary decimal(10,2))
insert into employee values(1,10,5500.00)
insert into employee values(2,10,4500.00)
insert into employee values(3,20,1900.00)
insert into employee values(4,20,4800.00)
insert into employee values(5,40,6500.00)
insert into employee values(6,40,14500.00)
insert into employee values(7,40,44500.00)
insert into employee values(8,50,6500.00)
insert into employee values(9,50,7500.00)


数据显示为


empid       deptid      salary
----------- ----------- ---------------------------------------
1           10          5500.00
2           10          4500.00
3           20          1900.00
4           20          4800.00
5           40          6500.00
6           40          14500.00
7           40          44500.00
8           50          6500.00
9           50          7500.00


需求:根据部门分组,显示每个部门的工资等级


预期结果:


empid       deptid      salary                                  rank
----------- ----------- --------------------------------------- --------------------
1           10          5500.00                                 1
2           10          4500.00                                 2
4           20          4800.00                                 1
3           20          1900.00                                 2
7           40          44500.00                                1
6           40          14500.00                                2
5           40          6500.00                                 3
9           50          7500.00                                 1
8           50          6500.00                                 2


SQL脚本:


SELECT *, Row_Number() OVER (partition by deptid ORDER BY salary desc) rank FROM employee
2.数据库性能优化
(1).合理使用索引(索引建好后,由oracle自己来决定是不是使用该索引,并不需要手动来调用,不过在oracle中,也可以用hint来指明调用某个索引.)
   ①.创建索引的根本目的是:提高查询效率。
     使用原则如下:
     1.在条件表达式中经常用到的不同值较多的列上建立索引。
     2.在不同值少的列上不要创建索引或位图索引。
      比如:在员工表的【性别】列上只有“男”或者“女”两个不同值,如果建立索引,不但不会提高查询效率,反而会降低更新速度。
     3.在经常进行连接,但是没有指定为外键的列上建立索引。
     4.在频繁进行排序或分组的列上建立索引,如果待排序的列有多个,可以建立组合做引。
      如:order by D,E那要注意:在建立索引时D列和E列和排序后面的顺序要相同。
     5.如果条件表达式中经常对某个列应用某个函数后指定查询条件,则应建立函数索引。
(2).避免或者简化排序
(3).消除对大表的扫描
(4).避免困难的通配符的匹配
(5).调整子查询的性能
(6).EXISTS和IN运算符
(7).通过索引提高查询效率
(8).分页查询
0 0
原创粉丝点击