Informix数据库利用索引提高查询效率

Informix数据库利用索引提高查询效率,第1张

Informix数据库利用索引提高查询效率,第2张

如果查询结果只有一行或者只有几行(高选择性),使用索引进行查询会大大提高效率。相反,如果没有索引,查询只能顺序扫描整个表。在OLTP环境中,事务在很大程度上依赖于索引。只有当表格很小时,才会按顺序扫描表格。系统将根据SQL语句中的WHERE子句确定是否使用索引。扫描顺序表会严重影响系统性能。主机中sysptntab表的pf_seqscnas列显示了顺序扫描。SET EXPLAIN命令还可以提供有关SQL语句如何访问数据库的重要信息。
DSS环境下的应用经常查询大量的数据(低选择性),甚至是整个表。顺序扫描更适合这类查询,因为顺序扫描可以利用光扫描。共享内存中光扫描缓冲区的虚拟段与常驻段无关。光扫描将在后面的章节中详细描述。

构建指数的成本

尽管索引可以极大地提高高选择性查询的性能,但是维护这些索引是有代价的。以INSERT语句为例。插入时,系统将首先读取插入的表的索引,以定位新的记录键。然后,在向数据页写入新记录时,系统还必须向inode写入新的索引项。如果索引节点被拆分,系统必须多次写入索引页。

与INSERT语句类似,delete语句也需要读取整个索引来定位inode位置,并设置DELETE标志。在删除索引时,我们还需要处理索引节点合并和排序的问题。

执行UPDATE语句时,必须首先找到并删除旧关键字,然后插入新关键字。所以索引必须在UPDATE语句中读取两次。

在实际系统中,索引的根节点和一级节点通常被读入共享内存,但如果需要访问更低级别的索引节点,就必须操作磁盘。

变址类型

通常会建立分离索引或基于表达式的碎片索引。分离索引和碎片索引可以使索引的范围页连续,从而提高性能。但是对于没有分片的表,在建立附属索引时,索引页和数据页是交替存放在一起的,这样会增加磁头的查找时间。

应该为中表和小表建立单独的索引。对于频繁访问的大表,要建立基于表达式的碎片索引,减少索引页数,提高检索速度。索引不要太零碎,以免表达式的计算开销过大。根据指数的大小,一般可以分为4块。索引碎片不支持循环调度。

分离的索引和数据页存储在不同的data 空房间中。

例如:

在idxldbs中的表table_name(col1)上创建索引index1

基于表达式的碎片索引是在FRAGMENT BY EXPRESSION子句中指定的data 空中创建的。

例如:

通过表达式在表table_name(col1)片段上创建索引index1

Col 1 > = 0且col1 = 25001且col1 col1 > = 50001且col1 = 750001且Col 1隐式索引
如果定义约束时没有可用的索引,系统将创建一个隐式索引。用户不能为隐式索引指定data 空之间的位置、碎片策略或填充因子。隐式索引是在数据库(不是表)所在的data room 空中创建的,对磁盘管理和性能有一些影响。

如果用户需要建立约束,他们可以首先创建一个与约束完全匹配的显式索引,然后使用ALTER TABLE命令增加约束。这样,约束条件可以利用显式索引而不是隐式索引。

例如,如下所示:

在tableldbs中创建表table_name( col1 INTEGER,col2 INTEGER,col3 CHAR(25),);

在idxldbs中的表table_name(col1)上创建唯一索引index1

ALTER TABLE TABLE _ name ADD CONSTRAINT primary key(col 1);

不要这样做:

创建表table_name( col1 INTEGER,col2 INTEGER,col3 CHAR(25),主键(col1))

在tableldbs中;

填充因子

对于选择操作,将填充因子设置为100。

对于选择和删除操作,将FILLFACTOR设置为100。

对于插入和更新操作,将FILLFACTOR设置为50到70。

在idx1 dbs FILLFACTOR 70中的表table_name(col1)上创建索引index1

填充因子决定了建立索引时每个索引页的填充程度。该参数可以更改。参数FILLFACTOR的默认值为90。如果只更改索引的设置,请使用CREATE INDEX的FILLFACTOR子句。

设置较大的填充因子可以使索引更紧凑,使缓冲区更有效,还可以减少检索记录时读取的页数。对于只读表,FILLFACTOR应设置为100。

对于只执行读和操作的表,如果FILLFACTOR设置为100,在删除记录时可以降低合并索引节点和排序索引树的可能性。

对于具有大量插入和更新操作的表,FILLFACTOR应该设置为50到70。因为填充因子很小,所以在插入和更新操作期间,索引节点(页)的拆分会延迟,从而提高系统性能。

以下是SQL FILLFACTOR示例:

在idxldbs FILLFACTOR 70中的表table_name(col1)上创建索引index1
建立索引的步骤
建立索引必须遵循以下步骤:

确定要构建的索引。

决定索引的类型,是拆分索引还是碎片索引。如果是碎片索引,确定表达式。

为每个索引确定填充因子。

索引计算所需的空间隔

确定索引数据空在磁盘上的位置。

为索引创建数据室空

确定临时纸浆数据空的大小和位置。可以分发和存储临时数据空。

使用DBSPACETEMP设置临时数据的大小空,使用onspace命令的-t选项创建临时数据空。

设置环境变量PDQPRIORITY和PSORT_NPROCS。

创建相应的配置文件。有关每个选项的设置,请参见并行排序和加载环境。

结构参数

步进期间参数的优化设置与上一章加载环境中的设置相同。以下是简要回顾:

NUMCPUVPS设置为CPU的数量。

缓冲设置尽可能多的缓冲。开始时,应该为缓冲区分配高达25%的内存。

SHMVIRTSIZE给出了初始段值。高达75%的可用内存

CKPTINTVL 3000 .物理日志确定何时生成检查点。

LRUS one LRU队列对包含500-700个缓冲区,允许LRU队列对达到128个。

Lur _ max _ dirt设置为80。

Lu _ min _ dirty设置为70。

RA_PAGES设置为128,

RA_THRESHOLD设置为120

DBSPACETEMP设置分布在不同设备上的多个相同大小空的临时数据。

DS_TOTAL_MEMORY 90%*SHMVIRTSIZE

DS_MAX_SCANS要构建的索引表的碎片数

以下是对环境变量的简要回顾:

PSORT_NPROCS设置为CPU的数量,即10

PDQPRIORITY设置为100

数据聚合

如果根据索引经常从表中读取大量数据,那么这些数据就会被聚合。通过建立聚合,可以减少读取页数,缩短检索时间,充分利用预读功能顺序扫描数据。

数据聚合是通过创建聚集索引来完成的。变更索引...TO CLUSTER语句可用于将原始索引更改为聚集索引,原始索引中数据记录的顺序将被重新排列。如果聚集索引是直接创建的,系统将对数据记录进行排序。请注意,在ATLTER索引之后...执行CLUSTER和CREATE CLUSTER INDEX语句时,新表将被构建,旧表将被删除。所以必须有足够的空空间来容纳新老手表。

如果可能的话,在加载之前按照索引顺序对数据进行排序,这样在构建索引时就不需要设置CLUSTER子句,这样就不需要聚合数据,避免了构建新表和删除旧表的开销。

位律师回复
DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
白度搜_经验知识百科全书 » Informix数据库利用索引提高查询效率

0条评论

发表评论

提供最优质的资源集合

立即查看 了解详情