Informix数据库利用索引提高查询效率
如果查询结果只有一行或者只有几行(高选择性),使用索引进行查询会大大提高效率。相反,如果没有索引,查询只能顺序扫描整个表。在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子句,这样就不需要聚合数据,避免了构建新表和删除旧表的开销。
位律师回复
0条评论