仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1055|回复: 7
打印 上一主题 下一主题

[学习教程] MYSQL网页设计关于Oracle 9i 腾跃式索引扫描(Index S...

[复制链接]
冷月葬花魂 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-16 22:32:04 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

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缺少了一些人们想要的功能。
只想知道 该用户已被删除
沙发
发表于 2015-1-18 07:53:22 来自手机 | 只看该作者
理解了存储结构,再阅读下性能优化的章节基本上会对sqlserver有个清晰地认识
兰色精灵 该用户已被删除
板凳
发表于 2015-1-21 13:39:28 | 只看该作者
但是随着数据量的增大,这种成本差距会逐渐减小,趋于相等。(500万数量级只相差10%左右)
再现理想 该用户已被删除
地板
发表于 2015-1-30 19:26:56 | 只看该作者
但换公司用MSSQL2K感觉自己好像根本就不了解MSSQL。什么DTS触发器以前根本没用过。
柔情似水 该用户已被删除
5#
发表于 2015-2-6 15:19:07 | 只看该作者
你可以简单地认为适合的就是好,不适合就是不好。
愤怒的大鸟 该用户已被删除
6#
发表于 2015-2-16 20:50:29 | 只看该作者
可以动态传入参数,省却了动态SQL的拼写。
再见西城 该用户已被删除
7#
发表于 2015-3-5 09:31:16 | 只看该作者
对于微软系列的东西除了一遍遍尝试还真没有太好的办法
分手快乐 该用户已被删除
8#
发表于 2015-3-12 03:03:47 | 只看该作者
你可以简单地认为适合的就是好,不适合就是不好。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-12-22 20:34

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表