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索引,执行范围查询)
[/code]
[/code]
[/code]
[/code]
[/code]
[/code]
[/code]
[/code]
当输入不同范围查询时,结果如下所示:
表4TEST_NORMAL表EMPNO列利用Bitmap和B-tree索引执行范围查询比较
如上表所示,两个索引的consistentgets和physicalreads值很接近。表最后一行查询范围(984888-1000000)返回了将近15000行。因此,当我们要求一个全表扫描时(指定优化器提示为/*+full(test_normal)*/),consistentread和physicalread值分别为7239和5663。
3A和3B的演示,在TEST_NORMAL表执行范围查询时,优化器使用了EMPNO列上的相应索引,逻辑IO和物理IO只是稍有差异。
本文内容
比较索引步骤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索引执行范围查询比较
Bitmap | B-tree | |||
ConsistentReads | PhysicalReads | EMPNO(Range) | ConsistentReads | PhysicalReads |
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 |
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]
由于聚类系数的原因,优化器选择了全表扫描,而不是索引:
Bitmap | B-tree | |||
ConsistentReads | PhysicalReads | EMPNO(Range) | ConsistentReads | PhysicalReads |
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 |
4A和4B的演示,在TEST_RANDOM表执行范围查询时,当索引时Bitmap索引时,优化器使用了;可当索引时B-tree索引时,优化器没有使用,而是进行了全表扫描,逻辑IO和物理IO自然也就差异很大。
原因就在于TEST_NORMAL表是已组织的,而TEST_RANDOM表示无组织的。这就好像数据结构中的查找算法或排序算法,如果当前数组是已有序的,查找和排序会快很多。
下面步骤会揭示关于索引更有趣的事实。
相关文章推荐
- Bitmap 索引 vs. B-tree 索引:如何选择以及何时使用?——1-5
- Bitmap 索引 vs. B-tree 索引:如何选择以及何时使用?——3-5
- Bitmap 索引 vs. B-tree 索引:如何选择以及何时使用?——4-5
- Bitmap 索引 vs. B-tree 索引:如何选择以及何时使用?——5-5
- Bitmap 索引 vs. B-tree 索引:如何选择以及何时使用?(归档)
- bitmap 索引和 B-tree 索引在使用中如何选择
- bitmap 索引和 B-tree 索引在使用中如何选择
- 如何以及何时使用一只耳朵唤起9例情况
- 学习何时以及如何使用 POSIX AIO API
- 如何以及何时使用sIFR
- 使用ajax时浏览器何时缓存以及如何避免浏览器缓存
- python pandas 如何找到NaN、缺失值或者某些元素的索引名称以及位置,np.where的使用
- 索引的应用场景以及如何使用
- SQL Server 索引使用分析(4)- 如何选择聚集索引
- 能使用异步 I/O 大大提高应用程序的性能 学习何时以及如何使用 POSIX AIO API
- 如何优化因将B-tree索引转换成位图索引(BITMAP CONVERSION )而导致SQL执行很慢
- 如何使用jquery选择多个checkbox以及如何判断checkbox选中的数量
- !important CSS 声明: 如何以及何时使用
- 如何以及何时使用sIFR
- SQL Server2000 索引结构及其使用 (聚集索引的重要性和如何选择聚集索引)