|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
如果你需要额外的功能的话,MySQL的普及性实际上可以让你发现总有一个厂商会提供准确的解决方案,而这个方案会满足你的需要和需求。oracle|索引
在Oracle9i中我们晓得可以利用腾跃式索引扫描(IndexSkipScan).但是,能使用腾跃式索引扫描的情形实际上是有些限定的.
从Oracle的文档中我们能够找到如许的话:
IndexSkipScans
Indexskipscansimproveindexscansbynonprefixcolumns.
Often,scanningindexblocksisfasterthanscanningtabledatablocks.
Skipscanningletsacompositeindexbesplitlogicallyintosmallersubindexes.
Inskipscanning,theinitialcolumnofthecompositeindexisnotspecifiedinthequery.
Inotherwords,itisskipped.
Thenumberoflogicalsubindexesisdeterminedbythenumberofdistinctvaluesintheinitialcolumn.
Skipscanningisadvantageousiftherearefewdistinctvaluesintheleadingcolumnofthecomposite
indexandmanydistinctvaluesinthenonleadingkeyoftheindex.
也能够如许说,优化器依据索引中的前导列(索引到的第一列)的独一值的数目决意是不是利用SkipScan.
我们起首做个测试:
SQL>CREATETABLEtestAS
2SELECTROWNUMa,ROWNUM-1b,ROWNUM-2c,ROWNUM-3d,ROWNUM-4e
3FROMall_objects
4/
SQL>SELECTDISTINCTCOUNT(a)FROMtest;
COUNT(A)
----------
28251
表已创立。
SQL>
SQL>CREATEINDEXtest_idxONtest(a,b,c)
2/
索引已创立。
SQL>ANALYZETABLEtestCOMPUTESTATISTICS
2FORTABLE
3FORALLINDEXES
4FORALLINDEXEDCOLUMNS
5/
表已剖析。
SQL>SETautotracetraceonlyexplain
SQL>SELECT*FROMtestWHEREb=99
2/
ExecutionPlan
----------------------------------------------------------
0SELECTSTATEMENTOptimizer=CHOOSE(Cost=36Card=1Bytes=26)
10TABLEACCESS(FULL)OFTEST(Cost=36Card=1Bytes=26)
--可见这里CBO选择了全表扫描.
--我们接着做另外一个测试:
SQL>droptabletest;
表已抛弃。
SQL>CREATETABLEtest
2AS
3SELECTDECODE(MOD(ROWNUM,2),0,1,2)a,
4ROWNUM-1b,
5ROWNUM-2c,
6ROWNUM-3d,
7ROWNUM-4e
8FROMall_objects
9/
表已创立。
SQL>setautotraceoff
SQL>selectdistinctafromtest;
A
--
1
2
--A列只要两个独一值
SQL>CREATEINDEXtest_idxONtest(a,b,c)
2/
索引已创立。
SQL>ANALYZETABLEtestCOMPUTESTATISTICS
2FORTABLE
3FORALLINDEXES
4FORALLINDEXEDCOLUMNS
5/
表已剖析。
SQL>setautotracetraceonlyexplain
SQL>SELECT*FROMtestWHEREb=99
2/
ExecutionPlan
----------------------------------------------------------
0SELECTSTATEMENTOptimizer=CHOOSE(Cost=4Card=1Bytes=24)
10TABLEACCESS(BYINDEXROWID)OFTEST(Cost=4Card=1Bytes=24)
21INDEX(SKIPSCAN)OFTEST_IDX(NON-UNIQUE)(Cost=3Card=1)
Oracle的优化器(这里指的是CBO)能对查询使用IndexSkipScans最少要有几个前提:
1优化器以为是符合的.
2索引中的前导列的独一值的数目能满意必定的前提.
3优化器要晓得前导列的值散布(经由过程剖析/统计表失掉)
4符合的SQL语句
......
更多信息请参考:
http://www.itpub.net/showthread.php?threadid=85948
http://www.cnoug.org/bin/ut/topic_show.cgi?id=608&h=1&bpg=1&age=100
http://www.itpub.net/showthread.php?s=&postid=985602#post985602
Oracle9iDatabasePerformanceTuningGuideandReferenceRelease2(9.2)
PartNumberA96533-02
感激列入会商的列位妙手.
对于IT经理来说,令他们喜欢的MySQL的简单性还有另一方面。MySQL可以运行的更快速。某些人或许会说MySQL缺少了一些人们想要的功能。 |
|