MSSQL网页设计利用索引的误区之六:为索引列都创建索...
有了数据以后,我们就要想一个比较统一的方法来闪回。上面我们说了对于DML操作,可以通过反向执行所有逆操作来实现,对于语句里面的DDL,只能直接跳过。原因是一个DDL不一定有直接的逆操作。索引利用索引的误区之六:为一切列都创建索引我们晓得,创建索引是为了进步查询的效力,可是同时也应当注重到,索引增添了对DML操纵(insert,update,delete)的价值,并且,一给中的索引假如太多,那末多半的索引是基本不会被利用到的,而另外一方面我们保护这些不被利用的以是还要年夜幅度下降体系的功能。以是,索引不是越多越好,而是要恰如其分的利用。
好比说,有些列因为利用了函数,我们要利用已有的索引(如一些复合索引)是不成能的(具体请拜见后面“函数索引”),那末就必需创建独自的函数索引,假如说这个函数索引很少会被使用(仅仅在几个出格的sql中会用到),我们就能够实验改写查询,而不往创建和保护谁人函数索引,比方:
C:>sqlplusdemo/demo
SQL*Plus:Release9.2.0.1.0-ProductiononSunOct1707:47:302004
Copyright(c)1982,2002,OracleCorporation.Allrightsreserved.
Connectedto:
Oracle9iEnterpriseEditionRelease9.2.0.1.0-Production
WiththeOLAPandOracleDataMiningoptions
JServerRelease9.2.0.1.0-Production
SQL>showuser
Useris"demo"
SQL>descemp
NameTypeNullableDefaultComments
-------------------------------------------
EMPNONUMBER(4)
ENAMEVARCHAR2(10)Y
JOBVARCHAR2(9)Y
MGRNUMBER(4)Y
HIREDATEDATEY
SALNUMBER(7,2)Y
COMMNUMBER(7,2)Y
DEPTNONUMBER(2)Y
SQL>createindexemp_id3onemp(hiredate);
Indexcreated
1,trunc函数
SQL>selectempno,ename,deptnofromempwheretrunc(hiredate)=2004-01-01;
norowsselected
ExecutionPlan
----------------------------------------------------------
0SELECTSTATEMENTOptimizer=CHOOSE
10TABLEACCESS(FULL)OFEMP
Statistics
----------------------------------------------------------
0recursivecalls
0dbblockgets
3consistentgets
0physicalreads
0redosize
328bytessentviaSQL*Nettoclient
372bytesreceivedviaSQL*Netfromclient
1SQL*Netroundtripsto/fromclient
0sorts(memory)
0sorts(disk)
0rowsprocessed
将下面的查询转换为:
SQL>selectempno,ename,deptnofromemp
2wherehiredate>=to_date(2004-01-01,yyyy-mm-dd)
3andhiredate<to_date(2004-01-01,yyyy-mm-dd)+0.999;
norowsselected
ExecutionPlan
----------------------------------------------------------
0SELECTSTATEMENTOptimizer=CHOOSE
10TABLEACCESS(BYINDEXROWID)OFEMP
21INDEX(RANGESCAN)OFEMP_ID3(NON-UNIQUE)
Statistics
----------------------------------------------------------
0recursivecalls
0dbblockgets
1consistentgets
0physicalreads
0redosize
328bytessentviaSQL*Nettoclient
372bytesreceivedviaSQL*Netfromclient
1SQL*Netroundtripsto/fromclient
0sorts(memory)
0sorts(disk)
0rowsprocessed
SQL>
2,to_char函数
SQL>selectempno,ename,deptnofromemp
2whereto_char(hiredate,yyyy-mm-dd)=2003-09-05;
norowsselected
ExecutionPlan
----------------------------------------------------------
0SELECTSTATEMENTOptimizer=CHOOSE
10TABLEACCESS(FULL)OFEMP
Statistics
----------------------------------------------------------
0recursivecalls
0dbblockgets
3consistentgets
0physicalreads
0redosize
328bytessentviaSQL*Nettoclient
372bytesreceivedviaSQL*Netfromclient
1SQL*Netroundtripsto/fromclient
0sorts(memory)
0sorts(disk)
0rowsprocessed
SQL>selectempno,ename,deptnofromemp
2wherehiredate=to_date(2003-09-05,yyyy-mm-dd);
norowsselected
ExecutionPlan
----------------------------------------------------------
0SELECTSTATEMENTOptimizer=CHOOSE
10TABLEACCESS(BYINDEXROWID)OFEMP
21INDEX(RANGESCAN)OFEMP_ID3(NON-UNIQUE)
Statistics
----------------------------------------------------------
0recursivecalls
0dbblockgets
1consistentgets
0physicalreads
0redosize
328bytessentviaSQL*Nettoclient
372bytesreceivedviaSQL*Netfromclient
1SQL*Netroundtripsto/fromclient
0sorts(memory)
0sorts(disk)
0rowsprocessed
SQL>
注重,转换时注重数据库中对字段的精度,如yyyymmyy,大概yyyymmddhh24miss
3,to_date函数
拜见下面的办法
4,substr函数
SQL>descdept
NameNull?Type
-----------------------------------------------------------------------------
DEPTNONUMBER(2)
DNAMEVARCHAR2(14)
LOCVARCHAR2(13)
SQL>createindexdept_id1ondept(dname);
Indexcreated.
SQL>selectdnamefromdeptwheresubstr(dname,1,3)=abc;
norowsselected
ExecutionPlan
----------------------------------------------------------
0SELECTSTATEMENTOptimizer=CHOOSE
10TABLEACCESS(FULL)OFDEPT
Statistics
----------------------------------------------------------
0recursivecalls
0dbblockgets
7consistentgets
0physicalreads
0redosize
221bytessentviaSQL*Nettoclient
372bytesreceivedviaSQL*Netfromclient
1SQL*Netroundtripsto/fromclient
0sorts(memory)
0sorts(disk)
0rowsprocessed
SQL>selectdnamefromdeptwherednamelikeabc%;
norowsselected
ExecutionPlan
----------------------------------------------------------
0SELECTSTATEMENTOptimizer=CHOOSE
10INDEX(RANGESCAN)OFDEPT_ID1(NON-UNIQUE)
Statistics
----------------------------------------------------------
0recursivecalls
0dbblockgets
1consistentgets
0physicalreads
0redosize
221bytessentviaSQL*Nettoclient
372bytesreceivedviaSQL*Netfromclient
1SQL*Netroundtripsto/fromclient
0sorts(memory)
0sorts(disk)
0rowsprocessed
SQL>
一般,为了平衡查询的效力和DML的效力,我们要细心的剖析使用,找出来呈现频次绝对较多、字段内容较少(好比varchar2(1000)就不合适创建索引,而varchar2(10)绝对来讲就合适创建索引)的列,公道的创建索引,好比偶然候我们但愿创建复合索引,偶然候我们更但愿创建单键索引。
现实上,oracle的索引另有良多话题,如监督索引的利用情形,Oracle9i推出的SKIPSCAN等等,鄙人一个会商中,我们会对这些话题具体论述。
优化的SQL查询算法,有效地提高查询速度 你可以简单地认为适合的就是好,不适合就是不好。 对于微软系列的东西除了一遍遍尝试还真没有太好的办法 对一张百万级别的表建游标,同时又没有什么过滤条件,取得游标效率是如果直接SQL查询百万条数据;如果再对每条记录做处理,耗时将更长。 对一张百万级别的表建游标,同时又没有什么过滤条件,取得游标效率是如果直接SQL查询百万条数据;如果再对每条记录做处理,耗时将更长。 外键的级联更能扩展可能大部分的同行在设计OLTP系统的时候都不愿意建立外键,都是通过程序来控制父子数据的完整性。 having子句的作用是筛选满足条件的组,即在分组之后过滤数据,条件中经常包含聚组函数,使用having条件显示特定的组,也可以使用多个分组标准进行分组。 比如,MicrosoftSQLServer2008的某一个版本可以满足现在的这个业务的需要,而且价格还比Oracle11g要便宜,那么这一产品就是适合的。 不过话说回来了,绝大多数的性能优化准则与对sqlserver存储的结构理解息息相关
页:
[1]