论文部分内容阅读
摘 要:随着数据库应用系统中数据的增加,系统的响应速度成为系统设计中需要解决的主要问题。由于用户对数据库的要求越来越高,因此必须对数据库进行优化。系统优化的一个很重要的方面就是SQL语句本身的优化,文章从应用的角度论述了SQL语句优化的一些方法。
关键词:数据库 优化 SQL Oracle
中图分类号:TP3 文献标识码:A 文章编号:1672-3791(2012)12(b)-0031-01
在信息化告诉发展的今天,数据库的竞争和更新技术日新月异,部署有ERP、CRM等关键应用的企业中,数据库是不可或缺的组成部分。本文结合Orac数据库,并通过多年的工作经验,谈谈SQL的一些优化方法在计费帐务核查中应用。
1 SQL的一些优化方法在计费帐务稽核中的应用
在目前的帐务稽核中,所有的检查都是通过编写SQL语句向数据库提交需求的,面对全省同时提交的数百个数据需求,服务器接受的任务过多,往往会出现任务被吊起、长时间不响应的现象,甚至影响了帐务结算工作。经过核查,造成死锁的原因很大部分是因为提交的语句存在各种语法或逻辑问题,易造成死锁,极大的浪费了系统资源。因此必须对编写和提交的SQL语句进行优化,减少系统资源被无效占用和损耗,这是提高帐务结算及稽核效率,按期完成工作的前提。
1.1 依据“共享池中重用SQL语句”的原则,规定统一的语句语法
Oracle提供在数据库中存储代码的能力。当应用系统开始运行时,从数据库中读取代码传递到共享池中去处理。从数据库中取出的代码是编译过的并驻留在共享池中。当SQL语句被传递给Oracle处理时,如果Oracle接受了一个与共享池中的语句相一致的语句,就重用共享池中的语句。两条SQL语句必须是语法、文本完全相同,才能视为可共享的SQL,利用Oracle的共享区。
帐务稽核工作是由全省各地本地网的人员同时参与,人员较多且语句的编写思路均存在差异,但最终的需求是一致的,依据共享原则,由区公司帐务处理部门按照稽核要求和内容,规定稽核点和稽核方法,下发经过整理的具有标准格式、大小写以及相同变量等遵循约定的稽核语句和过程,从而可以最大限度的重用共享池中的SQL语句。
1.2 对索引的有效利用
在Oracel的执行规则中,如果目标表无索引、语句中无条件限定、条件指定为NULL或者是不相等、或将条件在表达式里使用以及使用Like操作以及值以‘%’开始等等,系统会进行全表扫描,效率低下,因此在语句的编写中应避免上述情况,尽量采用能够使用索引的条件,对于必须使用到的列在使用前务必建立相应的索引。
最基本的客户、账户、用户三级关系,在查询或其他应用中均会用到这三列,系统内的表在这三列上均建有索引,因此在进行帐务稽核或者后期的数据提取中,应对涉及到此字段的临时表建立相同的单列索引,在有索引的列上进行条件限定,如下实例:
(1)及时建立索引:
create table tmp_alt_check_1009 as
select*from tmp_alt_check_1009_dsb
union all
select*from tmp_alt_check_1009_yhz;
create index tmp_alt_check_1009_serv on tmp_alt_check_1009 (serv_id);
create index tmp_alt_check_1009_cust on tmp_alt_check_1009 (cust_id);
create index tmp_alt_check_1009_acct on tmp_alt_check_1009 (acct_id);
上述应用中对新建表tmp_alt_check_1009分别建立了serv_id,acct_id,cust_id的单列索引,以便在其后的使用中提高搜索效率。
(2)条件限定时避免使用Like操作或者限定值以‘%’开始,不使用NULL或者是不相等。
如:将select*from product_offer_t where region_id like‘1020%’;
替換为:
select*from product_offer_t where region_id=’1020’;
将select*from product_offer_t
Where pricing_pla_id is not null or pricing_pla_id<>0;
替换为:
select*from product_offer_t Where pricing_pla_id>0;
通过以上细节的注意和替换,可避免系统对全表进行扫描,有效利用索引,提高系统响应效率。
1.3 使用选择性好的索引
索引的选择性是指索引列里不同值的数目与表中记录数的比。最好的可能性选择是1.0,即表内索引列上无重复记录。
在做帐务稽核中,常常会基于某种条件和需求建立一些临时表,并为临时表建立索引,在临时表的建立和使用中,应判断建立索引的字段的选择性和有效性的好坏,避免低效率的操作和资源的浪费。
1.4 根据实际情况区别使用UNION ALL和UNION操作
最常用的集操作是UNION和UNION ALL操作,UNION操作使多个记录集联结成为单个集,返回记录的单个集并且没有重复的行,进行表链接后会对所产生的结果集进行排序运算,删除重复的记录再返回结果。UNION ALL是一个行操作,操作允许重复,不要求SORT UNIQUE操作,从而节省了开销。当UNION ALL操作产生巨大的结果集时,不需要任何排序便返回记录给应用,检索的响应时间更快,对临时空间的要求也更低。
在稽核过程中,需要根据需求确定是否需要滤重,尽量避免不需滤重的情况下而用UNION操作,如果作为结果子集时,更应该避免使用UNION操作,浪费排序的时间和空间资源。
稽核中最常见的需求是对营业区或着支局或某个帐目、事件等产生的费用或话务量进行与历月的对比,以确定发生的数据是否脱离了正常规律,结果是否正确。若采用UNION会把重复记录滤除掉,结果是不符合需求的,且采用UNION ALL操作,系统的响应速度更快,最终根据需求确定此类稽核都需要采用UNION ALL操作,来保留所有完整的数据记录。
1.5 将复杂的多子集连接操作转化为小的带索引的临时表
在帐务稽核中,往往需要把符合条件的几部分数据汇总,形成一个新的结果表,处理方式有两种:一种是用直接union all操作把各个查询子集连接形成最终的结果表;另一种是分别将各个子集建成新的小表,再将小表用union all操作建成最终的结果表。第一种方法需要大量的临时空间作为查询结果子集的临时存储空间,对系统资源的占用也较大,经过实践验证,采用第二种方式往往能获得更快的响应速度。
2 结语
文章结合省电信公司的收费系统,结合Oracle数据库,简单讨论了数据库库的应用,在生活中,数据库的应用还很多,比如数据库在电信收入保障的应用等等。
参考文献
[1] 郎宇征,贾美英.服务器集群为数据库系统搭台[J],2005.
[2] 党正科,王新英.Oracle8.X For Windows NT实用教程[M].清华大学出版社,1999.
关键词:数据库 优化 SQL Oracle
中图分类号:TP3 文献标识码:A 文章编号:1672-3791(2012)12(b)-0031-01
在信息化告诉发展的今天,数据库的竞争和更新技术日新月异,部署有ERP、CRM等关键应用的企业中,数据库是不可或缺的组成部分。本文结合Orac数据库,并通过多年的工作经验,谈谈SQL的一些优化方法在计费帐务核查中应用。
1 SQL的一些优化方法在计费帐务稽核中的应用
在目前的帐务稽核中,所有的检查都是通过编写SQL语句向数据库提交需求的,面对全省同时提交的数百个数据需求,服务器接受的任务过多,往往会出现任务被吊起、长时间不响应的现象,甚至影响了帐务结算工作。经过核查,造成死锁的原因很大部分是因为提交的语句存在各种语法或逻辑问题,易造成死锁,极大的浪费了系统资源。因此必须对编写和提交的SQL语句进行优化,减少系统资源被无效占用和损耗,这是提高帐务结算及稽核效率,按期完成工作的前提。
1.1 依据“共享池中重用SQL语句”的原则,规定统一的语句语法
Oracle提供在数据库中存储代码的能力。当应用系统开始运行时,从数据库中读取代码传递到共享池中去处理。从数据库中取出的代码是编译过的并驻留在共享池中。当SQL语句被传递给Oracle处理时,如果Oracle接受了一个与共享池中的语句相一致的语句,就重用共享池中的语句。两条SQL语句必须是语法、文本完全相同,才能视为可共享的SQL,利用Oracle的共享区。
帐务稽核工作是由全省各地本地网的人员同时参与,人员较多且语句的编写思路均存在差异,但最终的需求是一致的,依据共享原则,由区公司帐务处理部门按照稽核要求和内容,规定稽核点和稽核方法,下发经过整理的具有标准格式、大小写以及相同变量等遵循约定的稽核语句和过程,从而可以最大限度的重用共享池中的SQL语句。
1.2 对索引的有效利用
在Oracel的执行规则中,如果目标表无索引、语句中无条件限定、条件指定为NULL或者是不相等、或将条件在表达式里使用以及使用Like操作以及值以‘%’开始等等,系统会进行全表扫描,效率低下,因此在语句的编写中应避免上述情况,尽量采用能够使用索引的条件,对于必须使用到的列在使用前务必建立相应的索引。
最基本的客户、账户、用户三级关系,在查询或其他应用中均会用到这三列,系统内的表在这三列上均建有索引,因此在进行帐务稽核或者后期的数据提取中,应对涉及到此字段的临时表建立相同的单列索引,在有索引的列上进行条件限定,如下实例:
(1)及时建立索引:
create table tmp_alt_check_1009 as
select*from tmp_alt_check_1009_dsb
union all
select*from tmp_alt_check_1009_yhz;
create index tmp_alt_check_1009_serv on tmp_alt_check_1009 (serv_id);
create index tmp_alt_check_1009_cust on tmp_alt_check_1009 (cust_id);
create index tmp_alt_check_1009_acct on tmp_alt_check_1009 (acct_id);
上述应用中对新建表tmp_alt_check_1009分别建立了serv_id,acct_id,cust_id的单列索引,以便在其后的使用中提高搜索效率。
(2)条件限定时避免使用Like操作或者限定值以‘%’开始,不使用NULL或者是不相等。
如:将select*from product_offer_t where region_id like‘1020%’;
替換为:
select*from product_offer_t where region_id=’1020’;
将select*from product_offer_t
Where pricing_pla_id is not null or pricing_pla_id<>0;
替换为:
select*from product_offer_t Where pricing_pla_id>0;
通过以上细节的注意和替换,可避免系统对全表进行扫描,有效利用索引,提高系统响应效率。
1.3 使用选择性好的索引
索引的选择性是指索引列里不同值的数目与表中记录数的比。最好的可能性选择是1.0,即表内索引列上无重复记录。
在做帐务稽核中,常常会基于某种条件和需求建立一些临时表,并为临时表建立索引,在临时表的建立和使用中,应判断建立索引的字段的选择性和有效性的好坏,避免低效率的操作和资源的浪费。
1.4 根据实际情况区别使用UNION ALL和UNION操作
最常用的集操作是UNION和UNION ALL操作,UNION操作使多个记录集联结成为单个集,返回记录的单个集并且没有重复的行,进行表链接后会对所产生的结果集进行排序运算,删除重复的记录再返回结果。UNION ALL是一个行操作,操作允许重复,不要求SORT UNIQUE操作,从而节省了开销。当UNION ALL操作产生巨大的结果集时,不需要任何排序便返回记录给应用,检索的响应时间更快,对临时空间的要求也更低。
在稽核过程中,需要根据需求确定是否需要滤重,尽量避免不需滤重的情况下而用UNION操作,如果作为结果子集时,更应该避免使用UNION操作,浪费排序的时间和空间资源。
稽核中最常见的需求是对营业区或着支局或某个帐目、事件等产生的费用或话务量进行与历月的对比,以确定发生的数据是否脱离了正常规律,结果是否正确。若采用UNION会把重复记录滤除掉,结果是不符合需求的,且采用UNION ALL操作,系统的响应速度更快,最终根据需求确定此类稽核都需要采用UNION ALL操作,来保留所有完整的数据记录。
1.5 将复杂的多子集连接操作转化为小的带索引的临时表
在帐务稽核中,往往需要把符合条件的几部分数据汇总,形成一个新的结果表,处理方式有两种:一种是用直接union all操作把各个查询子集连接形成最终的结果表;另一种是分别将各个子集建成新的小表,再将小表用union all操作建成最终的结果表。第一种方法需要大量的临时空间作为查询结果子集的临时存储空间,对系统资源的占用也较大,经过实践验证,采用第二种方式往往能获得更快的响应速度。
2 结语
文章结合省电信公司的收费系统,结合Oracle数据库,简单讨论了数据库库的应用,在生活中,数据库的应用还很多,比如数据库在电信收入保障的应用等等。
参考文献
[1] 郎宇征,贾美英.服务器集群为数据库系统搭台[J],2005.
[2] 党正科,王新英.Oracle8.X For Windows NT实用教程[M].清华大学出版社,1999.