二元高度(binary height)

http://book.51cto.com/art/200812/104308.htm


2.6  二元高度(binary height)

索引的二元高度对把ROWID返回给用户进程时所要求的I/O数量起到关键作用。二元高度的每个级别都会增加一个额外的读取块,而且由于这些块不能按顺序读取,它们都要求一个独立的I/O操作。在图2-1中,我们检索一个二元高度为3的索引,这样会返回一行数据给用户,同时有4个块被读取:3个来自索引,一个来自表。随着索引的二元高度的增加,检索数据所要求的I/O数量也会随之增加。

在对索引进行分析后,可以通过查询DBA_INDEXES的blevel列查看它的二元高度:

 
图2-1  具有二元高度或blevel=3的索引(级别3是树叶块驻留的级别)
XECUTE DBMS_STATS.GATHER_INDEX_STATS ('SCOTT','EMP_ID1');
PL/SQL procedure successfully completed.
select      blevel, index_name
from        dba_indexes
where       index_name = 'EMP_ID1';
BLEVEL   INDEX_NAME
----------  ------------------------------
0   EMP_ID1

技巧:

对索引或者表进行分析可以得到索引的二元高度。使用USER_INDEXES视图里的blevel列可以检查所有索引的二元高度。

二元高度主要随着表中索引列的非NULL值数量以及索引列中值的范围狭窄程度而变化。索引上如果有大量被删除的行,它的二元高度也会增加。重建索引可能会降低二元高度。虽然这些步骤可以减少针对索引执行的I/O数量,但对性能的改进却很小。如果一个索引中被删除的行接近20%~25%,重建索引会降低二元高度以及在一次I/O中所读取的空闲空间。

技巧:

一般来说,数据库块尺寸越大,索引的二元高度就越低。二元高度中的每个额外级别(blevel)在DML操作期间会增加额外的性能成本。


好的,下面是实现方法UnaryOperation和BinaryOperation的参考代码: ```c++ #include <iostream> #include <string> #include <algorithm> #include <functional> using namespace std; enum IMG_STORE_TYPE{GRAY,GRAY_A,RGB,RGB_A}; class Img { public: Img() {} Img(int width, int height, IMG_STORE_TYPE store_type) { pixel_data = new short[width * height]; this->store_type = store_type; } void readImg(string file) { // 从文件中读取图像数据,这里省略具体实现 } void writeImg(string file) { // 将图像数据写出到文件中,这里省略具体实现 } Img UnaryOperation(function<short(short)> unary_op) { Img result(width, height, store_type); for (int i = 0; i < width * height; ++i) { result.pixel_data[i] = unary_op(pixel_data[i]); } return result; } Img BinaryOperation(const Img& img, function<short(short, short)> binary_op) { Img result(width, height, store_type); for (int i = 0; i < width * height; ++i) { result.pixel_data[i] = binary_op(pixel_data[i], img.pixel_data[i]); } return result; } private: int width; int height; IMG_STORE_TYPE store_type; short* pixel_data; }; ``` 在这段代码中,我们使用了C++11中的`std::function`库来实现函数的传递。`std::function`能够接受任何可调用对象,包括函数指针、成员函数指针、函数对象、Lambda表达式等。 在`UnaryOperation`和`BinaryOperation`函数中,我们将`short`类型的一元运算符和二元运算符作为参数传递给函数,然后使用`std::function`对象进行调用。这样做的好处在于,我们可以在运行时动态地决定使用哪种操作符,而不用修改函数的代码。 需要注意的是,在`BinaryOperation`函数中,我们传递了一个常量引用`const Img& img`作为参数,以避免不必要的内存复制操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值