在Informix中创建并使用函数索引

随着数据量以惊人速度不断增长,数据库管理系统将继续关注性能问题。本文主要介绍一种名为函数索引(functional index)的性能调优技术。根据数据库使用情况的统计信息创建并使用函数索引,可以显著提升SELECT 查询的性能。通过本文了解如何在IBM Informix Dynamic Server 中创建和使用函数索引并最大限度提升查询性能。

简介

在选择数据库管理系统(DBMS)时,性能是一个关键的考虑因素。在执行SELECT、INSERT、UPDATE 和 DELETE 操作时,很多因素都会对性能产生影响。这些因素包括:

持久性数据存储的速度和大小

数据存储结构

数据访问方法

随着数据集不断变大,查询性能愈发变得重要。

通常,使用索引可以改善查询性能。索引将数据库中的行位置与一组有序数据子集和/或数据派生物关联在一起。索引可以减少DBMS 在执行查询时检查的行(或 元组)数量,从而获得性能增益。有时,仅通过搜索索引即可完成查询,而不需要从表中取回任何元组(tuple)。例如,如果您在列 c1 中建有索引,并且发出查询select c1 from t1 where c1 < 10 ,那么索引中包含了可以满足查询的所有信息。

有趣的是,ANSI SQL 标准并没有说明如何创建、实现或维护索引。因此,数据库供应商可以按照自己的方式自由地实现索引。

本文讨论了 Informix Dynamic Server 的函数索引特性。要理解本文涉及的概念,您需要熟悉基本的数据库术语和概念,例如模式、表、行、列、索引和可扩展性。还需了解 Informix Dynamic Server (IDS) 的基本配置以及如何启动和停止服务器、如何使用 ONCONFIG 文件进行配置。此外,还需熟悉基本的 SQL 命令以及如何使用 dbaccess 对服务器执行 SQL 命令。

本文的目的是帮助您理解函数索引的定义以及使用。此外,您还将了解如何创建和使用函数索引,以及在创建函数索引之前需要考虑的一些问题。

函数索引的优势

索引按照某种顺序保存列值。函数索引对列中的数据进行转换并按照顺序保存转换后的值。

假设某个表中保存了一个企业的员工名称,并且需要保留名称的大小写形式。那么,如果查询需要执行大小写不敏感的搜索(如下所示),则必须转换数据:

SELECT * FROM t1 WHERE toUpper(name) LIKE 'ANTHONY % HOPKINS';

如果没有为名称建立索引,那么 DBMS 将执行全表扫描并对每个元组(tuple)的 name 列应用 toUpper 函数。要确定元组(tuple)是否满足查询,必须调用 toUpper 函数。当表非常大或者大量会话发出这种类型的查询时,性能将会有所下降。

避免调用 toUpper 函数的一种方法是在表中同时保存大小写混合的名称和大写名称。应用程序查询大小写不敏感的列:

SELECT * FROM t1 WHERE ucname like 'ANTHONY % HOPKINS';

如果没有为 ucname 创建索引,DBMS 仍然执行全表扫描,但是不会对数据进行进一步处理来判断其是否满足查询。尽管这样做改善了性能,但并不是理想的解决方案,因为表非常大,而且所有需要操纵或访问数据的应用程序必须包括处理 ucname 的逻辑。

改善查询性能的一种更好的方法是对 name 创建函数索引:

CREATE FUNCTION toUpper( name VARCHER(100) ) RETURNS VARCHAR(100)
WITH (NOT VARIANT);
RETURN upper( name );
END FUNCTION;
CREATE INDEX ucnameIndex ON t1 ( toUpper(name) );

当执行这种查询时,DBMS 可以使用函数索引判断哪些元组元组(tuple) 满足查询。DBMS 只获取并返回这些满足查询的元组(tuple),如下面的清单所示:

SELECT * FROM t1 WHERE toUpper(name) LIKE 'ANTHONY % HOPKINS';

DBMS 将自动管理函数索引以及不需要包含逻辑来管理大写形式数据的应用程序。通过使用 INSERT、UPDATE 和 DELETE 操作对索引进行更新,DBMS 能够确保索引始终与表数据一致。

接下来将深入讨论如何创建和使用函数索引,以及如何生成和检验查询计划,并提供具体的示例。

时间: 2024-08-30 13:24:49

在Informix中创建并使用函数索引的相关文章

arcgis engine-哪位大神能具体解释一些AE中创建泰森多边形这个函数的各个参数意义和怎么用

问题描述 哪位大神能具体解释一些AE中创建泰森多边形这个函数的各个参数意义和怎么用 void ConvertToVoronoiRegions(ESRI.ArcGIS.Geodatabase.IFeatureClass pFeatureClass , ESRI.ArcGIS.Geodatabase.ITinFilter pFilter , ESRI.ArcGIS.Geometry.IPolygon pClippingPolygon , string indexFieldName , string

Oracle 数据库中创建合理的数据库索引_oracle

笔者认为,在创建索引时要做到三个适当,即在适当的表上.适当的列上创建适当数量的索引.虽然这可以通过一句话来概括优化的索引的基本准则,但是要做到这一点的话,需要数据库管理员做出很大的努力.具体的来说,要做到这个三个适当有如下几个要求. 一. 根据表的大小来创建索引. 虽然给表创建索引,可以提高查询的效率.但是数据库管理员需要注意的是,索引也需要一定的开销的.为此并不是说给所有的表都创建索引,那么就可以提高数据库的性能.这个认识是错误的.恰恰相反,如果不管三七二十一,给所有的表都创建了索引,那么其反

Oracle之函数索引

Oracle之函数索引 在Oracle中,有一类特殊的索引,称为函数索引(Function-Based Indexes,FBI),它基于对表中列进行计算后的结果创建索引.函数索引在不修改应用程序的逻辑基础上提高了查询性能.如果没有函数索引,那么任何在列上执行了函数的查询都不能使用这个列的索引.当在查询中包含该函数时,数据库才会使用该函数索引.函数索引可以是一个B-Tree索引或位图索引. 用于生成索引的函数可以是算术表达式,也可以是一个包含SQL函数.用户定义PL/SQL函数.包函数,或C调用的

第十章——维护索引(8)——在计算列中创建索引提高性能

原文:第十章--维护索引(8)--在计算列中创建索引提高性能 前言: 在理解计算列上的索引之前,先了解计算列的基本知识.计算列由可以使用同一表中的其他列的表达式计算得来.表达式可以是非计算列的列名.常量.函数,也可以是用一个或多个运算符连接的上述元素的任意组合.表达式不能为子查询. 默认情况下,计算列是一个虚拟的列,并且可以在调用时重新计算,直到在CREATE TABLE或者ALTER TABLE 命令中使用PERSISTED. 如果列定义成PERSISTED,会存放计算值,并存放在原始列上更新

在Word2010文档中创建包含函数的公式

第1步,打开Word2010文档窗口,切换到"插入"功能区.在"符号"分组中单击"公式"按钮(非"公式"下拉三角按钮),如图1所示. 图1 单击"公式"按钮 第2步,在Word2010文档中创建一个空白公式框架,在"公式工具/设计"功能区中,单击"结构"分组中的"函数"按钮.在打开的函数结构列表中会显示三角函数.反函数.双曲函数.反双曲函数等多种类

Word中怎样创建含有数学函数公式

接下来一起来看看具体操作步骤: 第1步,打开Word2010文档窗口,切换到"插入"功能区.在"符号"分组中单击"公式"按钮(非"公式"下拉三角按钮),如图1所示. 图1单击"公式"按钮 第2步,在Word2010文档中创建一个空白公式框架,在"公式工具/设计"功能区中,单击"结构"分组中的"函数"按钮.在打开的函数结构列表中会显示三角函数.反函数

在服务器的mysql中创建自定义函数出错

问题描述 在服务器的mysql中创建自定义函数出错 我的一台机器,连接服务器上mysql,创建自定义函数报错[Err] 1418 - This function has none of DETERMINISTIC NO SQL or READS SQL DATA in its declaration and binary logging is enabled (you might want to use the less safe log_bin_trust_function_creators

c语言-关于c++在函数中创建指针的两个问题

问题描述 关于c++在函数中创建指针的两个问题 解决方案 delete[] ps,是释放了ps指向的内存,但是并没有擦除原内存中的数据,所以在该内存未被写入其他数据之前,还能输出ps: cout<<&p,输出的并非指针(动态申请的地址),而是局部变量p的地址,所以不变(输出的栈地址) 解决方案二: 第一个问题: delete确实已经释放了ps所指向的那块内存,但所谓释放并不是清空,而是把那块内存重新回收到系统中,告诉系统这块内存又可以重新分配了. delete的时候,系统只是将指针指向

link中发射调用的函数和直接调用的函数,创建的变量都是可移动的还是静止的?

问题描述 link中发射调用的函数和直接调用的函数,创建的变量都是可移动的还是静止的? link中发射调用的函数和直接调用的函数,创建的变量都是可移动的还是静止的? 解决方案 什么叫可移动的??- 解决方案二: 这哥们对linq走火入魔,地球人已经看不懂了