您的位置:首页 > 其它

Bitmap 索引 vs. B-tree 索引:如何选择以及何时使用?——2-5

2012-11-11 20:54 465 查看
——理解适当使用每个索引对性能的影响

Bitmap索引vs.B-tree索引:如何选择以及何时使用?——1-5

Bitmap索引vs.B-tree索引:如何选择以及何时使用?——2-5

Bitmap索引vs.B-tree索引:如何选择以及何时使用?——3-5

Bitmap索引vs.B-tree索引:如何选择以及何时使用?——4-5

Bitmap索引vs.B-tree索引:如何选择以及何时使用?——5-5

 

本文内容

比较索引
步骤3A(TEST_NORMAL表EMPNO列创建Bitmap索引,执行范围查询)
步骤3B(TEST_NORMAL表EMPNO列创建B-tree索引,执行范围查询)
步骤4A(TEST_RANDOM表EMPNO列创建Bitmap索引,执行范围查询)
步骤4B(TEST_RANDOM表EMPNO列创建B-tree索引,执行范围查询)

步骤3A(在TEST_NORMAL)

该步骤创建Bitmap索引(同步骤1A)。我们已经知道索引大小(28MB)及其聚类系数(等于表的行数)。现在执行一些范围谓词谓词查询。

[code][code]SQL>dropindexnormal_empno_idx;




索引已删除。




SQL>createBitmapindexnormal_empno_bmxontest_normal(empno);




索引已创建。




SQL>analyzetabletest_normalcomputestatisticsfortableforallindexesfor


allcolumns;




表已分析。




SQL>

[/code]
[/code]


[code]
[code]SQL>setautottraceonly


SQL>select*fromtest_normalwhereempnobetween&range1and&range2;


输入range1的值:1


输入range2的值:2300


原值1:select*fromtest_normalwhereempnobetween&range1and&range2


新值1:select*fromtest_normalwhereempnobetween1and2300




已选择2300行。






执行计划


----------------------------------------------------------


Planhashvalue:641040856




-------------------------------------------------------------------------------------------------


|Id|Operation|Name|Rows|Bytes|Cost(%CPU)|Time|


-------------------------------------------------------------------------------------------------


|0|SELECTSTATEMENT||2299|85063|417(0)|00:00:06|


|1|TABLEACCESSBYINDEXROWID|TEST_NORMAL|2299|85063|417(0)|00:00:06|


|2|BITMAPCONVERSIONTOROWIDS||||||


|*3|BITMAPINDEXRANGESCAN|NORMAL_EMPNO_BMX|||||


-------------------------------------------------------------------------------------------------




PredicateInformation(identifiedbyoperationid):


---------------------------------------------------


3-access("EMPNO">=1AND"EMPNO"<=2300)






统计信息


----------------------------------------------------------


1recursivecalls


0dbblockgets


331consistentgets


0physicalreads


0redosize


130220bytessentviaSQL*Nettoclient


2202bytesreceivedviaSQL*Netfromclient


155SQL*Netroundtripsto/fromclient


0sorts(memory)


0sorts(disk)


2300rowsprocessed




SQL>

[/code]
[/code]

步骤3B(在TEST_NORMAL)

该步骤对TEST_NORMAL表EMPNO列使用B-tree索引,执行范围谓词查询。


[code]
[code]SQL>setautotoff


SQL>dropindexnormal_empno_bmx;


 


索引已删除。


 


SQL>createindexnormal_empno_idxontest_normal(empno);


 


索引已创建。


 


SQL>analyzetabletest_normalcomputestatisticsfortableforallindexesfor


allindexedcolumns;


 


表已分析。


 


SQL>

[/code]
[/code]


[code]
[code]SQL>setautottraceonly


SQL>select*fromtest_normalwhereempnobetween&range1and&range2;


输入range1的值:1


输入range2的值:2300


原值1:select*fromtest_normalwhereempnobetween&range1and&range2


新值1:select*fromtest_normalwhereempnobetween1and2300


 


已选择2300行。


 


 


执行计划


----------------------------------------------------------


Planhashvalue:1781697849


 


------------------------------------------------------------------------------------------------


|Id|Operation|Name|Rows|Bytes|Cost(%CPU)|Time|


------------------------------------------------------------------------------------------------


|0|SELECTSTATEMENT||2299|85063|23(0)|00:00:01|


|1|TABLEACCESSBYINDEXROWID|TEST_NORMAL|2299|85063|23(0)|00:00:01|


|*2|INDEXRANGESCAN|NORMAL_EMPNO_IDX|2299||8(0)|00:00:01|


------------------------------------------------------------------------------------------------


 


PredicateInformation(identifiedbyoperationid):


---------------------------------------------------


2-access("EMPNO">=1AND"EMPNO"<=2300)


 


 


统计信息


----------------------------------------------------------


1recursivecalls


0dbblockgets


329consistentgets


0physicalreads


0redosize


130220bytessentviaSQL*Nettoclient


2202bytesreceivedviaSQL*Netfromclient


155SQL*Netroundtripsto/fromclient


0sorts(memory)


0sorts(disk)


2300rowsprocessed


 


SQL>

[/code]
[/code]

当输入不同范围查询时,结果如下所示:

表4TEST_NORMAL表EMPNO列利用Bitmap和B-tree索引执行范围查询比较

BitmapB-tree
ConsistentReadsPhysicalReadsEMPNO(Range)ConsistentReadsPhysicalReads
331   

0

1-2300

329

0

285

0

8-1980

283

0

346

19

1850-4250

344

16

427

31

28888-31850

424

28

371

27

82900-85478

367

23

2157

149

984888-1000000

2139

35

如上表所示,两个索引的consistentgets和physicalreads值很接近。表最后一行查询范围(984888-1000000)返回了将近15000行。因此,当我们要求一个全表扫描时(指定优化器提示为/*+full(test_normal)*/),consistentread和physicalread值分别为7239和5663。


3A和3B的演示,在TEST_NORMAL表执行范围查询时,优化器使用了EMPNO列上的相应索引,逻辑IO和物理IO只是稍有差异。



步骤4A(在TEST_RANDOM)

该步骤在TEST_RANDOM表EMPNO列使用Bitmap索引进行范围查询,检查consistentgets和physicalreads值。这里,你会看到聚类系数的影响。


[code]
[code]SQL>dropindexrandom_empno_idx;


 


索引已删除。


 


SQL>createBitmapindexrandom_empno_bmxontest_random(empno);


 


索引已创建。


 


SQL>analyzetabletest_randomcomputestatisticsfortableforallindexesfor


allindexedcolumns;


 


表已分析。


 


SQL>

[/code]
[/code]


[code]
[code]SQL>setautottraceonly


SQL>select*fromtest_randomwhereempnobetween&range1and&range2;


输入range1的值:1


输入range2的值:2300


原值1:select*fromtest_randomwhereempnobetween&range1and&range2


新值1:select*fromtest_randomwhereempnobetween1and2300


 


已选择2300行。


 


 


执行计划


----------------------------------------------------------


Planhashvalue:4105816815


 


-------------------------------------------------------------------------------------------------


|Id|Operation|Name|Rows|Bytes|Cost(%CPU)|Time|


-------------------------------------------------------------------------------------------------


|0|SELECTSTATEMENT||2299|89661|418(1)|00:00:06|


|1|TABLEACCESSBYINDEXROWID|TEST_RANDOM|2299|89661|418(1)|00:00:06|


|2|BITMAPCONVERSIONTOROWIDS||||||


|*3|BITMAPINDEXRANGESCAN|RANDOM_EMPNO_BMX|||||


-------------------------------------------------------------------------------------------------


 


PredicateInformation(identifiedbyoperationid):


---------------------------------------------------


3-access("EMPNO">=1AND"EMPNO"<=2300)


 


 


统计信息


----------------------------------------------------------


1recursivecalls


0dbblockgets


2463consistentgets


0physicalreads


0redosize


130220bytessentviaSQL*Nettoclient


2202bytesreceivedviaSQL*Netfromclient


155SQL*Netroundtripsto/fromclient


0sorts(memory)


0sorts(disk)


2300rowsprocessed


 


SQL>

[/code]
[/code]

步骤4B(在TEST_RANDOM)

该步骤在TEST_RANDOM表EMPNO列使用B-tree索引进行范围查询。回忆一下索引的聚类系数非常接近表中行数(因此,不会很有效)。下面看看优化器是如何说的:


[code]
[code]SQL>dropindexrandom_empno_bmx;


 


索引已删除。


 


SQL>createindexrandom_empno_idxontest_random(empno);


 


索引已创建。


 


SQL>analyzetabletest_randomcomputestatisticsfortableforallindexesfor


2allindexedcolumns;


 


表已分析。


 


SQL>

[/code]
[/code]


[code]
[code]SQL>select*fromtest_randomwhereempnobetween&range1and&range2;


输入range1的值:1


输入range2的值:2300


原值1:select*fromtest_randomwhereempnobetween&range1and&range2


新值1:select*fromtest_randomwhereempnobetween1and2300


 


已选择2300行。


 


 


执行计划


----------------------------------------------------------


Planhashvalue:2650160170


 


---------------------------------------------------------------------------------


|Id|Operation|Name|Rows|Bytes|Cost(%CPU)|Time


---------------------------------------------------------------------------------


|0|SELECTSTATEMENT||2299|89661|1740(1)|00:00:21|


|*1|TABLEACCESSFULL|TEST_RANDOM|2299|89661|1740(1)|00:00:21|


---------------------------------------------------------------------------------


 


PredicateInformation(identifiedbyoperationid):


---------------------------------------------------


1-filter("EMPNO"<=2300AND"EMPNO">=1)


 


 


统计信息


----------------------------------------------------------


1recursivecalls


0dbblockgets


6412consistentgets


0physicalreads


0redosize


121076bytessentviaSQL*Nettoclient


2202bytesreceivedviaSQL*Netfromclient


155SQL*Netroundtripsto/fromclient


0sorts(memory)


0sorts(disk)


2300rowsprocessed


 


SQL>

[/code]
[/code]

由于聚类系数的原因,优化器选择了全表扫描,而不是索引:

BitmapB-tree
ConsistentReadsPhysicalReadsEMPNO(Range)ConsistentReadsPhysicalReads
2463   

1200

1-2300

6415

4910

2114

31

8-1980

6389

4910

2572

1135

1850-4250

6418

4909

3173

1620

28888-31850

6456

4909

2762

1358

82900-85478

6431

4909

7254

3329

984888-1000000

7254

4909

只有表最后一行,对Bitmap索引,优化器选择了全表扫描,而对于所有的范围查询,对B-tree索引,优化器选择全表扫描。这种差异是由于簇因素:当使用bitmap索引产生执行计划时,优化器不考虑聚类系数的值,而对B-tree索引,则考虑。在这个场景,Bitmap索引比B-tree索引更有效率。

4A和4B的演示,在TEST_RANDOM表执行范围查询时,当索引时Bitmap索引时,优化器使用了;可当索引时B-tree索引时,优化器没有使用,而是进行了全表扫描,逻辑IO和物理IO自然也就差异很大。


原因就在于TEST_NORMAL表是已组织的,而TEST_RANDOM表示无组织的。这就好像数据结构中的查找算法或排序算法,如果当前数组是已有序的,查找和排序会快很多。



下面步骤会揭示关于索引更有趣的事实。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐
章节导航