待审核文件数据库sql review_第1页
待审核文件数据库sql review_第2页
待审核文件数据库sql review_第3页
待审核文件数据库sql review_第4页
待审核文件数据库sql review_第5页
已阅读5页,还剩11页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

规则一SQL语句中尽量避免全表扫 规则二SQL语句应尽可能使用索引提高执行效 规则三避免使用动态 规则四尽量使用绑定变 规则五SQL不宜太 规则六SQL中尽量避免使用低效的子句,如notin 规则七执行DML,需要提供必要的回退措 规则十一若索引列允许null,应避免又用ISNULL和ISNOT 规则十二内嵌视图与临时 规则十三用循环代替游 规则十四避免使用SELECT 规则十五SQLServer事务编写注 规则十七最好使用单表简单操作 前必须对所运行的SQL进行评估。SQLOLTP数据库里应该尽可能避免全表扫描,尤其是针对大表。全表扫描时,数据库为了查询到满储系统带来巨大的IO负担,响应变得异常缓慢。率也越高。由此产生的IO负载也越小,从而响应时间也越快。候考虑使用权表扫描,目的还是降低IO数,因为此时全表扫描所经历的数据块少。Select*fromempwhereempid1Empid上面有所有,走了索引。Select*fromempwheredepid= 2.1中已经说明全表扫描的弊端,SQL查询应尽可能使用索引。然而,在有些情况下,即使表上Select*fromempwhereempid1Empid上面有所有,走了索引。Select*fromempwhereCAST(empidASvarchar(12))=解析,动态SQL会加重cpu负担。udpateempsetempname=‘dd’whereempid=Executeimmediate‘udpateempsetempname=‘dd’whereempid= udpateempsetempname=:varNamewhereempid=:varName,intEmpidStringv_id=Stringv_sqlselectnamefromtable_awhereid嵌入绑定变量stmt=con.prepareStatement(v_sql);stmt.setString(1v_id为绑定变量赋值selectb.idfromselectb.idfromTM_INF_FEEDBACKa,TM_INF_tac_FEEDBACKbwherea.case_id=b.case_idand empWherea.empidin(selectempidfrom empWherea.empidin *empa.empidin(selectempidfromselectfrom(SELECTto_char(trunc(sysdate-b.SCHEDULE_DATE))vehicle_ageFROMvw_product_withpricea,tm_vehicleb,tm_corporationdWHERE(NOTEXISTS(SELECTWHEREb.vehicle_id=e.vehicle_id)ORnot(SELECTWHEREe.vehicle_id=AND(e.statusIN(1205,andNOTEXISTS(selectfromTT_SGM_SALES_ORDERwherej.Vehicle_ID=andj.statusnotin(3661,3656,duct_id=andb.vhcl_type(selectfromtm_system_statuswherea.STATUS_TYPE=anda.STATUS_CODEnotinANDb.node_status=0ANDb.hold_status=0ANDb.node<=140andb.corp_id=_id=groupgroupbyTO_CHAR(TRUNC(SYSDATE-orderbyb.create_datedesc)whererownum<2 UPDATESETNUMBEROFCUSTOMER=1+WHERECUSTLIST_XXX=endif;ENDCLOSEwhenothersthen Like子句使用不当,会造成全表扫描。通常形如like‘string%’子句可以使用列上索引,而like empWherea.empidlike empWherea.empidlike WHEREsalesorder.vehicle_id=vehicle.vehicle_idANDsalesorder.customer_id=person.customer_idANDsalesorder.customer_id=customer.customer_idANDsalesorder.customer_id=vehicle.customer_idANDduct_id=duct_idANDPACKAGE.package_id=ANDvehicle.ORG_ID=ANDvehicle.Node=ANDvehicle.Node_Status=ANDvehicle.Hold_Status=ANDcustomer.customer_status=Andvehicle.vinLike,CREATEORREPLACEVIEWCREATEORREPLACEVIEWV_OFM_GBOM_MATERIALNOLISTSELECTROWNUMASID,material_noFROM(SELECTDISTINCT ParallelOLTPparallel提示时,将会消耗更多资源,且协调进程分并行SQL执行在OLTP中不是理想方法。 /*+parallel(a)fromempaWhereempname=’dddd’;nullISNULLISNOT规则十二SQL语句会创建一个临时表,将数据插入该表中,将其他数据与该表进行联接,然后除去该临时表。这会导致此查询进行大量I/O操作,因此,可以重新编写查询,使用内的临时表上耗费大量I/O和磁盘访问,而可以使用内嵌视图得到同样的结果SQLSQLINSERT,或INSERTSQLSQL,则不会获得期望的值。您必须运行下列代码才能检索紧跟在INSERTSQL之后且位于同一连接上的IDENTITY,如下所示:规则十三DECLARE@rint;DECLARE@numberint;DECLARE@tb1table(numbint,tidint)insertinto@tb1(numb,tid)SELECTROW_NUMBER()OVER(ORDERBYuseridASnumber,tidFROMTableName;--关键SELECT@number=MAX(numb)FROM@tb1;SET@r=1WHILE(@r<=@number)---sqlselectnumbfrom@tb1wherenumb=@r;SET@r=@r+1规则十四避免使用SELECT 26 from 1规则十五SQLServerSQLServer中数据库事务处理是个重要的概念,也稍微有些不容易理解,下面介绍了三种不beginupdatestatement1...updatestatement2...deletestatement3...createtabledemo(idintnotnull)begininsertintodemovalues(null)insertintodemovalues(2)notnull约束的错误信息,但随后又提示(1row(s)affected)select*fromdemoinsertintodemovalues(2)?sqlserver在发生runtime错误时,默认会rollback引起错误的语句,而继续执行后续语句。beginupdatestatement1...updatestatement2...deletestatement3...committranxact_aborton时,sqlserverrollbackbeginupdatestatement1if@@error<>0beginrollbacktrandeletestatement2if@@error<>0beginrollbacktranbeginbeginupdatestatement1...deletestatement2endtryif@@trancount>0rollbacktranendif@@trancount>0committransetnocountbeginupdatestatement1if@@error<>0beginrollbacktranreturn-1deletestatement2if@@error<>0beginrollbacktranreturn-1时间偏长。所以要控制表数,比如不超过4个,并为每个表指定别名Select*fromtba,tbb,tbc,tbd,tbeWheretba.id=tbb.id tbb.id= tbc.id= tbd.id=selectselect(selectfromTT_WHM_STOCK_OUTBOUNDttwhmstock1_,TE_IMES_SAP_DLOC_TRANSFORMteimessapd2_, wherettwhmstock1_.OUTBOUND_QTY=andtmbaspart3_.TM_BAS_PART_ID=ttwhmstock1_.TM_BAS_PART_IDandtmbasplant4_.TM_BAS_PLANT_ID=ttwhmstock1_.TM_BAS_PLANT_IDandtmbasplant4_.PLANT_NO=teimessapd2_.SOURCE_PLANT_NOandtmbaspart3_.PART_NO=andteimessapd2_.TRANSFOR_DATE=andteimessapd2_.TRANSFOR_TIME=andttwhmstock1_.OUTBOUND_TIME>=andttwhmstock1_.OUTBOUND_TIME<:2)andttwhmstock5_.TT_WHM_STOCK_OUTBOUND_IDisnullandttwhmstock0_.OUTBOUND_TIME>=:3andttwhmstock0_.OUTBOUND_TIME< nestedloop连接通常使用小的表作为基准表(或者称为驱动表),根据连接条件,将表中的数Hashjoin适合数据量大的两表,且小表大部分数据需要连接(等连接)。数据库会选择较小的Sortmergejoin可以被使用来连接两个独立的行源(表或子查询)。Sortmergejoin的优势是当两表的连接为非等

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论