关于索引压缩的研究
当单列索引和复合索引中的数据列重复项比较多的时候,可以考虑进行索引压缩。索引压缩可以在某种程度上减小索引所占空间,减小扫描索引时候的I/O,提高查询的性能。
语法:create index index_name on table_name(col1,col2 ….coln) compress n; (n>0)
不输入n的话,默认压缩所有的索引列
索引中的前n项被压缩,称做前缀。
事实上,压缩索引所能节约的空间百分比大小与压缩索引的前缀字段大小占总字段大小的百分比有关系。前缀字段所占百分比越大,则节约空间越大,压缩效果越明显;反之,则节约空间越小,压缩效果越不明显。
由此可见,使用压缩索引的前提必须是前缀列的重复项比较多,否则会对性能产生更坏的影响。
通过dump的结果就可以看到压缩索引节约空间的原因了。经过其他的一些实验还发现以下几点:
1, 仅仅该BLOCK中存在该前缀对应的记录,该前缀的说明才会在BLOCK中出现。
2, 当索引中记录增多到引起叶的分裂的时候,相同前缀的记录会尽量存储在相同的BLOCK中,即BLOCK中的记录会发生重组。
实验三:压缩索引对查询性能的影响
一般说来,因为索引压缩后所占用的空间比较小,所以在发生索引扫描的时候需要访问的索引块比较小,会提高查询的性能。
Actually I was wrong in asking you that question. Although single column compression is not commonly done, it does what it's supposed to do. Here's an extreme case (on Oracle 10gR1):
create table test (a number);
insert into test select 1 from dba_objects; -- inserted 49807 rows
create index test_ind on test (a);
exec dbms_stats.gather_index_stats('YONG', 'TEST_IND')
user_indexes shows that compress='DISABLED', leaf_blocks=98, avg_blocks_per_key=98
alter index test_ind rebuild compress;
user_indexes shows that compress='ENABLED', leaf_blocks=77, avg_blocks_per_key=77
So we reduced the size by 21 blocks.
The reason single column indexes are normally not compressed is that (1) B-tree indexes should be created when keys have high selectivity or they would be useless, (2) single column unique indexes can't be compressed, (3) bitmap indexes have very low selectivity but they can't be compressed and don't need to be (they're already very compact).
--------------------------------------
ORA FAQ 性能调整系列之——压缩索引会提高性能么?
Will compressing my indexes improve performance ?
压缩索引会提高性能么?
Author's name: Jonathan Lewis
Author's Email: [email]Jonathan@jlcomp.demon.co.uk[/email]
Date written: 26th Feb 2003
Oracle version(s): 8.1 - 9.2
Compressed indexes have been around for a couple of years now - but will compressing your indexes automatically improve performance ?
压缩索引已经存在好几年了——那么压缩索引会自动提高性能么?
Oracle introduced a compression option for indexes in Oracle 8.1. You can create an index as compressed, or rebuild it to compress it (although there are some restrictions about online rebuilds, rebuilds of partitioned indexes etc.) Typical syntax might be:
Oracle在Oracle 8.1中引入了索引的压缩特性。你可以创建一个压缩索引,或者重建时压缩一个索引(尽管对在线重建、重建分区索引等有一些限制)。标准语法如下:
create index t1_ci_1 on t1(col1, col2, col3, col4) compress 2;
alter index t1_ci_1 rebuild compress 2;
The benefits of compression come from the fact that a properly compressed index uses a smaller number of leaf blocks - which tends to mean that less I/O is involved when the index is used, there is a reduced amount of buffer cache flushing, and the optimizer is likely to calculate a lower cost for using that index for range scans. (There is a tiny chance that the number of branch blocks, and the index height might be reduced, too, but that is a little unlikely).
压缩的优势来自一个恰当压缩的索引使用更少的叶块——这样当用到索引时涉及更少的I/O,buffer cache清洗量减小,优化器对index range scan代价的计算可能更低。(甚至有机会分支块数与索引高度也会减少,但这不太可能)。
But compressing indexes, especially compressing the wrong number of columns, can have negative impact on your performance. If you compress more columns than you should, the 'compressed' index may be larger than the uncompressed index. Use the validate option on the index, and check view index_stats to find out the optimum compression count. How did I know that I should compress just the first two columns of the t1_ci_1 index ? (Apart from knowing the data, that is):
但压缩索引,特别是压缩烈数不正确时,会对性能产生负面影响。如果压缩了过多的列,“压缩”了的索引可能比未压缩的索引更大。对索引使用validate 选项,然后检查视图index_stats找到最优的压缩数。我如何知道只需要压缩索引t1_ci_1的前两列?(不需要知道数据):
validate index t1_ci_1;
select
opt_cmpt_count, opt_cmpr_pctsave
from
index_stats;
opt_cmpt_count opt_cmpr_pctsave
-------------------------------
2 50
Unfortunately these two columns don't exist in 8.1, only in version 9 (possibly only 9.2). Fortunately Steve Adams has a script on his website to recommend a compression level (see [url]www.ixora.com.au[/url] )
不幸的是这两列在8.1中不存在,只存在于9(可能仅仅9.2)。幸运的是Steve Adams在他的站点上有一个脚本以推荐压缩度(参考www.ixora.com.au)
Even if you get the 'right' number of columns compressed, there is a price to pay: The main penalties are: (a) reads and mods of a compressed index cost more CPU than they would (typically) for an equivalent uncompressed index (b) execution paths change - and you may not have predicted the changes, and some nominally cheaper paths may actually be slower. for example: Oracle may choose an index fast full scan instead of an index range scan because the compressed index is now much smaller, and your setting for parameter db_file_multiblock_read_count is large; or Oracle may choose to use an index and do a nested loop because the index is now 30% smaller, where previously it was doing a table scan and hash join.
即使你得到了压缩列的“正确”数字,还有一个代价:主要的性能损失是:(a)读、改一个压缩索引比一个同等的未压缩索引消耗更多的CPU;(b)执行路径改变——并且你可能没有意识到这个改变,一些看似代价更低的路径可能反而慢。例如:由于压缩索引现在更小了,对参数 db_file_multiblock_read_count也较大,那么Oracle可能选择一个index fast full scan而不是index range scan;或者由于索引减小了30%,Oracle选择使用一个索引和nested loop,而之前它用表扫描和hash join。
So - don't go and compress all the indexes in your schema.
所以——不要压缩所有索引。
Think carefully about which indexes could give you significant gains, and whether you can afford some CPU loss to reduce buffer thrashing and I/O.
想好那个索引会给你较大的性能提高,你是否能够承受一些CPU损耗来降低buffer清洗和I/O。
Remember too, if the way you use an index is such that the column order doesn't matter, then perhaps you could rearrange the column order to maximise the compression. The most critical point, perhaps, is that you should avoid moving a column that is typically used with a range scan towards the front of the index.t
还要记住,若你使用索引时并不在意列的顺序,那么也许你可以重新安排列的顺序来提高压缩率。最关键的一点也许是你应当避免向索引前移一个一般用来range scan的列。
分享到:
相关推荐
随着技术的发展,倒排索引和索引压缩技术不断进步,出现了更多的压缩算法和数据结构,如Frame of Reference、Patched Frame of Reference、Roaring Bitmaps等。这些技术能够进一步减少索引所占空间,提高检索效率。 ...
在本项目中,`SPIMI`算法被用来构建倒排索引,同时采用了`Gamma`编码进行数据压缩,以节省存储空间。 首先,让我们详细了解一下`SPIMI`算法。`SPIMI`的核心思想是在倒排列表中引入顺序Posting List,即将同一文档中...
### 全文自动检索系统中的快速检索与索引文件压缩算法 #### 摘要与背景 随着信息技术的迅速发展,人类面临的信息处理量日益增大,尤其在处理海量数据(通常指数百兆字节以上)时,传统的信息处理速度已无法满足...
sql学习 压缩技术2_索引压缩.sql
深入搜索引擎--海量信息的压缩、索引和查询中文版(5/6).zip.005深入搜索引擎--海量信息的压缩、索引和查询中文版(5/6).zip.005
这就需要有效的索引压缩机制来减少存储和传输的开销,同时还要保证副本定位的效率。 在此背景下,提出了一个基于大规模分布式副本定位的资源索引分级压缩机制。该机制的关键在于超级节点索引方式的应用。在这一方式...
3.4 索引压缩方法的效果 3.5 签名文件和位图 签名文件 位片签名文件(Bitsliced signature files) 签名文件分析 位图 签名文件和位图的压缩 3.6 索引方法的比较 3.7 大小写折叠、词根化和停用词 大小写折叠 词根化 ...
深入搜索引擎--海量信息的压缩、索引和查询
《深入搜索引擎:海量信息的压缩、索引和查询》是斯坦福大学信息检索和挖掘课程的首选教材之一,并已成为全球主要大学信息检索的主要教材。《深入搜索引擎:海量信息的压缩、索引和查询》理论和实践并重,深入浅出地给...
资源名称:深入搜索引擎——海量信息的压缩、索引和查询内容简介:本书是斯坦福大学信息检索和挖掘课程的首选教材之一,并已成为全球主要大学信息检索的主要教材。本书理论和实践并重,深入浅出地给出了海量信息数据...
众所周知,海量数据处理是搜索引擎最耀眼的核心技术之一,本书准确和系统地阐明了海量数据处理中压缩、索引和查询的理论、技术和实现,由此奠定了其搜索引擎圣经的美名,至今对学术界和行业界都产生着巨大的影响。...
在ITAS的三项关键技术中,我们重点研究位图索引压缩算法,并在本文中进行了详细的调查。当前最新的位图索引编码方案包括:BBC,WAH,PLWAH,EWAH,PWAH,CONCISE,COMPAX,VLC,DF-WAH和VAL-WAH。基于分段,分块,...
基于谓词索引的大数据压缩
面对图数据管理中查询耗时高和空间占比大的难题,提出一种图数据二 级索引压缩算法——GComIdx。该算法利用有序的键值(Key-Value)结构将相关节点和边尽可能地以相邻的方式 存储,并为高效的属性查询和邻居查询分别...
总共有3个文件包。请大家找我名字获得。 三个文件包下载完后即可解压了。 深入搜索引擎:海量信息的压缩、索引和查询 高清PDF完整版 适合搜索引擎SEO人员的阅读提高
总共有3个文件包。请大家找我名字获得。 三个文件包下载完后即可解压了。 深入搜索引擎:海量信息的压缩、索引和查询 高清PDF完整版 适合搜索引擎SEO人员的阅读提高
深入搜索引擎--海量信息的压缩、索引和查询 著名教材 共4部分,全部下载后解压part1即可。绝对没有错误! 第一部分:深入搜索引擎--海量信息的压缩、索引和查询part1 第二部分:深入搜索引擎--海量信息的压缩、索引和...