前言:
武汉达梦数据库股份有限公司成立于2000年,为中国电子信息产业集团(CEC)旗下基础软件企业,致力于数据库管理系统与大数据平台的研发、销售和服务,同时可为用户提供全栈数据产品和解决方案。多年来,达梦公司始终坚持原始创新、独立研发,目前已掌握数据管理与数据分析领域的核心前沿技术,拥有全部源代码,具有完全自主知识产权。在40余年的发展过程中,达梦公司在国产数据库行业持续领跑,先后完成了近60项国家及省市级的科研开发项目,取得了近400项研究成果,皆为国际先进、国内领先水平,有30多项国家、省部级奖励。达梦公司建立了稳定有效的市场营销渠道和技术服务网络,可为用户提供定制产品和本地化原厂服务,充分满足用户的个性化需求。达梦公司产品已成功应用于金融、电力、航空、通信、电子政务等50多个行业领域。
一)基本概念介绍
这里主要简单介绍以下几个简单但重要的概念:数据库、实例、用户、表空间、模式、表、角色、数据文件。
数据库:数据存储的物理介质。广义上讲任何存储数据的物理介质都可叫着数据库,例如一个word文档。但实际上,我们说数据库一般是指像MySQL,ORACLE, HBASE等之类的软件系统。这些系统除了提供数据的存储外,还提供一整套相关的工具或接口对存储的数据进行管理。达梦数据库就是这样的一种系统。
数据库实例:已实例化可存储数据的仓库。达梦数据库与MySQL数据库有一个很大的差别就是:MySQL服务启动后通过create database语句创建N个数据库(数据库实例);而达梦数据库一个实例就只能挂一个数据库(即一个实例就是一个数据库),如果想建多个数据库,则需配置启动相应数量的实例。达梦的每个实例有一系列的后台进程和内存结构,这些是相互独立的。
用户:达梦数据库用户是建在实例下的,因为实例相互独立,所有达梦数据库不同的实例下可以有相同的用户名。另外,在达梦数据库中通过create user语句创建用户时,会同时创建一个同名的“模式”。也可以通过create schema语句单独创建模式(特别注意:在Oracle中,用户与schema是一一对应的,不能单独创建模式,要想创建模式得需通过创建一个同名用户来实现),并授权给某个已存在的用户,因此在达梦数据库中用户与模式是1:N的关系。(注:如果先通过create schema创建了模式,再通过create user创建同名用户,不能创建成功。)
表空间:是一个用来管理数据存储的概念,表空间只是和数据文件(ORA或者DBF文件)发生关系,数据文件是物理的,一个表空间可以包含多个数据文件,而一个数据文件只能隶属一个表空间。可以将表空间理解为对应一块物理存储区,专门用来存储数据文件。实例化达梦数据库时,默认会创建MAIN、ROLL、SYSTEM、TEAM及HMAIN五个表空间。ROLL、SYSTEM、TEAM表空间系统自行维护,用户所建表(如果未指定存放表空间的话)默认放在MAIN表空间。用户也可自定义表空间,然后在创建用户时指定为默认表空间;也可以在建表时通过加"tablespace SpaceName"语句动态指定该表的存储表空间。
用户的模式(SCHEMA):指的是用户账号拥有的对象集,在概念上可将其看作是包含表、视图、索引和权限定义的对象。在DM中,一个用户可以创建多个模式,一个模式中的对象(表、视图)可以被多个用户使用。模式不是严格分离的,一个用户可以访问他所连接的数据库中有权限的任意模式中的对象。也就是说,用户和模式是N:M的关系。
系统为每一个用户自动建立了一个与用户名同名的模式作为其默认模式,用户还可以用模式定义语句建立其它模式。
1.一个用户一般对应一个schema,该用户的schema名等于用户名,并作为该用户缺省schema;
2.一个用户还可以使用其他的schema(Oracle数据库也可通过权限管理实现访问其他schema);
3.创建模式不指定用户时,该模式默认为SYSDBA拥有;
4.在同一模式下不能存在同名对象,但在不同模式中的对象名称可以相同;
5.用户可以直接访问同名模式对象,但如果要要访问其他模式对象,则必须具有对象权限;
6.当用户要访问其他模式对象时,必须附加模式名作后缀(schema.table);
- 用户是用来连接数据库对象,而模式是用来创建及管理对象的。
表:这个就不用说了吧,但要说明的一点是一个表只能属于一个表空间。
角色:在达梦数据库中,每个用户都有角色。它决定了该用户有什么权限,比如DBA,拥有最高权限。补充说明一点是,实例化的达梦数据库默认有3种角色:DBA, PUBLIC,RESOURCE。新建的用户只拥有PUBLIC角色,该角色几乎做不了撒,因此一般新建用户后,需要单独对他(她)进行授权。
数据文件:数据的物理载体。
“我们可以把Database看作是一个大仓库,仓库分了很多很多的房间,Schema就是其中的房间,一个Schema代表一个房间,Table可以看作是每个Schema中的床,Table(床)被放入每个房间中,不能放置在房间之外,那岂不是晚上睡觉无家可归了,然后床上可以放置很多物品,就好比 Table上可以放置很多列和行一样,数据库中存储数据的基本单元是Table,现实中每个仓库放置物品的基本单位就是床, User就是每个Schema的主人,(所以Schema包含的是Object,而不是User),user和schema是一一对应的,每个user在没有特别指定下只能使用自己schema(房间)的东西,如果一个user想使用其他schema(房间)的东西,那就要看那个schema(房间)的user(主人)有没有给你这个权限了,或者看这个仓库的老大(DBA)有没有给你这个权限了。换句话说,如果你是某个仓库的主人,那么这个仓库的使用权和仓库中的所有东西都是你的(包括房间),你有完全的操作权,可以扔掉不用的东西从每个房间,也可以放置一些有用的东西到某一个房间,你还可以给每个User分配具体的权限,也就是他到某一个房间能做些什么,是只能看(Read-Only),还是可以像主人一样有所有的控制权(R/W),这个就要看这个User所对应的角色Role了。”
- 安装及配置
安装后实例化数据库,以Windows为例:
开始-》所有程序-》达梦数据库,实例化需要用到以下红框内客户端,双击它:
出现如下所示界面,我们可以看到这货中文名叫达梦数据库配置助手,通过这个图形化的界面来创建一个数据库,按照默认“创建数据库实例”,点击“开始”:
指定数据库模板,默认“一般用途”,点击“下一步” :
数据库目录,以后放数据的地方,这里自行选择目录,点击“下一步”:
数据库标识,第一次创建时,默认的库名,实例名,端口号如下图所示,继续点击“下一步” :
数据库文件,按默认的来,点击“下一步”:
初始化参数,依旧默认(这里注意字符集,如果有需求可更改为需要的字符集),点击“下一步” :
口令管理,为了方便,我选择第二个“所有用户(这里指系统默认可登录用户:SYSDBA, SYSAUDITOR)使用同意口令”,然后输入口令,点击“下一步” :
创建实例库,对于初学者,建议都勾选上,这样实例化的数据库的同时会创建BOOKSHOP和DMHR两个模式及相应用户,便于学习。点击“下一步” :
创建摘要,点击“完成”:
至此,实例化数据库完成!
三)基本使用
查表空间
select * from V$TABLESPACE;
查询模式
SELECT owner FROM dba_segments group by OWNER;
查询表
select * from dba_tables where tablespace_name='TEMP'; //根据表空间查询表
SELECT * FROM SYSOBJECTS WHERE schid = (SELECT object_id from all_objects where object_name = 'CTISYS' and object_type = 'SCH') and (SUBTYPE$ = 'UTAB' or SUBTYPE$ = 'STAB'); //object_name指模式名, UTAB用户表,STAB系统表
表空间脱机及上线
alter tablespace "DMHR" offline;
alter tablespace "DMHR" online; //同一表空间可以存在同名对象
模式切换
SELECT SYS_CONTEXT ('userenv', 'current_schema') FROM DUAL; //查询当前模式
SET SCHEMA "SYSDBA"; //设置当前登录用户的默认模式
数据大小
SELECT SUM(bytes) from dba_data_files; //数据库占用空间
SELECT TABLE_USED_SPACE('DMHR', 'REGION') * 1024; //表大小
归档模式
select arch_mode from v$database; //归档是否打开
select * from V$DM_ARCH_INI; //归档信息
系统数据查询
select * from dba_tables; //系统所有表查询
select * from user_tables; //登录用户所有表查询
select * from user_tablespaces; //表空间查询
select * from dba_users; //系统所有用户查询
二、索引的创建及索引适用场景
1. 聚集索引:每一个普通表有且只有一个聚集索引;
2. 唯一索引:索引数据根据索引键唯一;
3. 函数索引:包含函数/表达式的预先计算的值;
4. 位图索引:对低基数的列创建位图索引;
5. 位图连接索引:针对两个或者多个表连接的位图索引,主要用于数据仓库中;
6. 全文索引:在表的文本列上而建的索引。
索引在逻辑上和物理上都与相关的表的数据无关,作为无关的结构,索引需要存储空间。
创建或删除一个索引,不会影响基本的表、数据库应用或其他索引。当插入、更改和删除相
关的表的行时,DM8 会自动管理索引。如果删除索引,所有的应用仍继续工作,但访问以前被索引了的数据时速度可能会变慢。
在表中插入数据后创建索引效率
一般情况下,在插入或装载了数据后,为表创建索引会更加有效率。如果在装载数据之
前创建了一个或多个索引,那么在插入每行时 DM8 都必须更改和维护每个索引,使得插入效
率降低。
索引正确的设置及适用
使用下面的准则来决定何时创建索引:
1. 如果需要经常地检索大表中的少量的行,就为查询键创建索引;
2. 为了改善多个表的连接的性能,可为连接列创建索引;
3. 主键和唯一键自动具有索引,在外键上很多情况下也创建索引;
4. 小表不需要索引。
选取表中的索引列时可以考虑以下几点:
1. 列中的值相对比较唯一 ;
2. 取值范围大,适合建立索引;
3. CLOB 和 TEXT 只能建立全文索引、BLOB 不能建立任何索引。
表的统计查询性能差
在 CREATE INDEX 语句中列的排序会影响查询的性能。通常,将最常用的列放在最前
面。
如果查询中有多个字段组合定位,则不应为每个字段单独创建索引,而应该创建一个组
合索引。当两个或多个字段都是等值查询时,组合索引中各个列的前后关系是无关紧要的。
但是如果是非等值查询时,要想有效利用组合索引,则应该按等值字段在前,非等值字段在
后的原则创建组合索引,查询时只能利用一个非等值的字段。
表的索引对于经常修改以插入的不宜过多
一个表可以有任意数量的索引。但是,索引越多,修改表数据的开销就越大。当插入或
删除行时,表上的所有索引也要被更改;更改一个列时,包含该列的所有索引也要被更改。
因此,在从表中检索数据的速度和更新表的速度之间有一个折衷。例如,如果一个表主要仅
用于读,则索引多就有好处;如果一个表经常被更新,则索引不宜多建。
估计索引大小和设置存储参数
创建索引之前先估计索引的大小能更好地促进规划和管理磁盘空间。可以用索引以及回
滚段、重做日志文件的组合估计的大小来决定支持所期望的数据库所需的磁盘空间的大小。
通过这些估计,就可以购买合适的硬件和做出其他正确的决定。
用单个索引估计的大小能更好地管理索引使用的磁盘空间。创建索引时,可以设置适当
的存储参数,并改善使用该索引的应用的 I/O 性能。例如,假设在创建索引之前估计索引的
最大大小,之后就可以在创建该索引时设置适当的存储参数,就能很少为表的数据段分配簇。
并且,所有的该索引的数据都被保存在相对连续的磁盘空间扇区中,这就减少了使用该索引
的磁盘 I/O 操作所需的时间。
为每个索引指定表空间
可以在除临时表空间、日志表空间和回滚段表空间外的其他任何表空间中创建索引,也
可以在其索引的表的相同或不同的表空间中创建索引。如果表及其索引使用相同的表空间 能
更方便地对数据库进行管理(如表空间或文件备份)或保证应用的可用性,因为所有有关的
数据总是在一起联机。然而,将表及其索引放在不同的表空间(在不同磁盘上)产生的性能
比放在相同的表空间更好,因为这样做减少了磁盘竞争。但是将表及其索引放在不同的表空
间时,如果一个表上某索引所在的表空间脱机了,则涉及这张表的 SQL 语句可能由于执行计
划仍旧需要使用被脱机的索引而不能成功执行。
创建索引
可以用 CREATE INDEX 语句明确地创建索引。如下语句在 emp 表的 ename 列上创建
一个名为 emp_ename 的索引,该索引使用表空间 users。
CREATE INDEX emp_ename ON emp(ename)
STORAGE (
INITIAL 50,
NEXT
50,
ON
USERS);
注意,上述语句为该索引明确地指定了几个存储设置和一个表空间。如果没有给索引指
定存储选项,则 INITIAL 和 NEXT 等存储选项会自动使用表空间的默认存储选项。
创建聚集索引
DM8 中表(列存储表和堆表除外)都是使用 B+树索引结构管理的,每一个普通表都有
且仅有一个聚集索引,数据都通过聚集索引键排序,根据聚集索引键可以快速查询任何记录。
当建表语句未指定聚集索引键时,DM8 的默认聚集索引键是 ROWID。若指定索引键,表
中数据都会根据指定索引键排序。
建表后,DM8 也可以用创建新聚集索引的方式来重建表数据,并按新的聚集索引排序。
例如,可以对 emp 表以 ename 列新建聚集索引。
CREATE CLUSTER INDEX clu_emp_name ON emp(ename);
新建聚集索引会重建这个表以及其所有索引,包括二级索引、函数索引,是一个代价非
常大的操作。因此,最好在建表时就确定聚集索引键,或在表中数据比较少时新建聚集索引,
而尽量不要对数据量非常大的表建立聚集索引。
创建聚集索引的约束条件:
1. 每张表中只允许有一个聚集索引,如果之前已经指定过 CLUSTER INDEX 或者指定
了 CLUSTER PK,则用户新建立 CLUSTER INDEX 时系统会自动删除原先的聚集
索引。但如果新建聚集索引时指定的创建方式(列,顺序)和之前的聚集索引一样,
则会报错;
2. 指定 CLUSTER INDEX 操作需要重建表上的所有索引,包括 PK 索引;
3. 删除聚集索引时,缺省以 ROWID 排序,自动重建所有索引;
4. 若聚集索引是默认的 ROWID 索引,不允许删除;
5. 聚集索引不能应用到函数索引中;
6. 不能在列存储表上新建/删除聚集索引;
7. 建聚集索引语句不能含有 partition_clause 子句;
8. 在临时表上增删索引会使当前会话上临时 b 树数据丢失。
明确地创建唯一索引
索引可以是唯一的或非唯一的。唯一索引可以保证表上不会有两行数据在键列上具有相
同的值,非唯一索引不会在键列上施加这个限制。
可用 CREATE UNIQUE INDEX 语句来创建唯一索引,如下例子创建一个唯一索引:
CREATE UNIQUE INDEX dept_unique_index ON dept (dname)
STORAGE (ON users);
用户可以在希望的列上定义 UNIQUE 完整性约束,DM8 通过自动地在唯一键上定义一个
唯一索引来保证 UNIQUE 完整性约束。
自动创建与约束相关的唯一索引
DM8 通过在唯一键或主键上创建一个唯一索引来在表上实施 UNIQUE KEY 或 PRIMARY
KEY 完整性约束。当启用约束时DM8自动创建该索引。如下面的语句会自动在表emp的name
列上创建一个唯一索引。
ALTER TABLE EMP ADD CONSTRAINT PK_EMP_NAME PRIMARY KEY (NAME);
创建基于函数的索引
基于函数的索引促进了限定函数或表达式的返回值的查询,该函数或表达式的值被预先
计算出来并存储在索引中。正确使用函数索引,可以带来以下好处:
1. 创建更强有力的分类,例如可以用 UPPER 和 LOWER 函数执行区分大小写的分类;
2. 预先计算出计算密集的函数的值,并在索引中将其分类。可以在索引中存储要经常
访问的计算密集的函数,当需要访问值时,该值已经计算出来了。因此,极大地改
善了查询的执行性能;
3. 增加了优化器执行范围扫描而不是全表扫描的情况的数量。
例如,考虑如下 WHERE 子句中的表达式
CREATE INDEX IDX ON EXAMPLE_TAB(COLUMN_A + COLUMN_B);
SELECT * FROM EXAMPLE_TAB WHERE COLUMN_A + COLUMN_B < 10;
因为该索引是建立在 column_a + column_b 之上的,所以优化器可以为该查询使用
范围扫描。优化器根据该索引计算查询代价,如果代价最少,优化器就会选择该函数索引,
column_a + column_b 就不会重复计算。
创建函数索引有以下约束条件:
1. 函数索引表达式可以由多列组成,不同的列不能超过 63 个;
2. 函数索引表达式里面不允许出现大字段和时间间隔类型列;
3. 不支持建立分区函数索引;
4. 函数索引表达式的长度理论值不能超过 816 个字符(包括生成后的指令和字符串);
5. 函数索引不能为 CLUSTER 或 PRIMARY KEY 类型;
6. 表达式不支持集函数和不确定函数,不确定函数为每次执行得到的结果不确定,系
统中不确定函数包括:RAND、SOUNDEX、CURDATE、CURTIME、CURRENT_DATE、
CURRENT_TIME 、 CURRENT_TIMESTAMP 、 GETDATE 、 NOW 、 SYSDATE 、
CUR_DATABASE、DBID、EXTENT、PAGE、SESSID、UID、USER、VSIZE、
SET_TABLE_OPTION、SET_INDEX_OPTION、UNLOCK_LOGIN、CHECK_LOGIN、
GET_AUDIT 、 CFALGORITHMSENCRYPT 、 SF_MAC_LABEL_TO_CHAR 、
CFALGORITHMSDECRYPT
、
BFALGORITHMSENCRYPT
、
SF_MAC_LABEL_FROM_CHAR、BFALGORITHMSDECRYPT、SF_MAC_LABEL_CMP;
7. 快速装载不支持含有函数索引的表;
8. 当表中含有行前触发器并且该触发器会修改函数索引涉及列的值时,不能建立函数
索引;
9. 若函数索引中要使用用户自定义的函数,则函数必须是指定了 DETERMINISTIC 属
性的确定性函数;
10. 若函数索引中使用的确定性函数发生了变更或删除,用户需手动重建函数索引;
11. 若函数索引中使用的确定性函数内有不确定因素,会导致前后计算结果不同的情
况。在查询使用函数索引时,使用数据插入函数索引时的计算结果为 KEY 值;修改
时可能会导致在使用函数索引过程中出现根据聚集索引无法在函数索引中找到相
应记录的情况,对此进行报错处理。
创建位图索引
位图索引主要针对含有大量相同值的列而创建。位图索引被广泛引用到数据仓库中,创
建方式和普通索引一致,对低基数(不同的值很少)的列创建位图索引,能够有效提高基于
该列的查询效率。且执行查询语句的 where 子句中带有 AND 和 OR 谓词时,效率更加明显。
如下例子创建一个位图索引:
CREATE BITMAP INDEX S1 ON PURCHASING.VENDOR (VENDORID);
位图索引具有以下约束:
1. 支持普通表、堆表和水平分区表创建位图索引;
2. 不支持对大字段创建位图索引;
3. 不支持对计算表达式列创建位图索引;
4. 不支持在 UNIQUE 列和 PRIMARY KEY 上创建位图索引;
5. 不支持对存在 CLUSTER KEY 的表创建位图索引;
6. 仅支持单列或者不超过 63 个组合列上创建位图索引;
7. MPP 环境下不支持位图索引的创建;
8. 不支持快速装载建含有位图索引的表;
9. 不支持全局位图索引;
10. 包含位图索引的表不支持并发的插入、删除和更新操作。
创建位图连接索引
位图连接索引是一种提高通过连接实现海量数据查询效率的有效方式,主要用于数据仓
库环境中。区别于上一节所说的建立在单表上的位图索引,位图连接索引是针对两个或者多
个表的连接而建立的位图索引,同时保存了连接的位图结果。对于索引列中的每一个值,位
图连接索引在索引表中保存了对应行的 ROWID。
如下例子创建一个位图连接索引:
create bitmap index SALES_CUSTOMER_NAME_IDX
on SALES.SALESORDER_HEADER(SALES.CUSTOMER.PERSONID)
from SALES.CUSTOMER, SALES.SALESORDER_HEADER
where SALES.CUSTOMER.CUSTOMERID = SALES.SALESORDER_HEADER.CUSTOMERID;
使用说明
1. 适用于常规索引的基本限制也适用于位图连接索引;
2. 用于连接的列必须是维度表中的主键或存在唯一约束;如果是复合主键,则必须使
用复合主键中的所有列;
3. 当多个事务同时使用位图连接索引时,同一时间只允许更新一个表;
4. 连接索引创建时,基表只允许出现一次;
5. 不允许对存在 cluster key 的表创建位图连接索引;
6. 位图连接索引表(内部辅助表,命名为 BMJ$_索引名)仅支持 select 操作,其他
操作都不支持:如 insert、delete、update、alter、drop 和建索引等;
7. 不支持对位图连接索引所在事实表和维度表的备份还原,不支持位图连接索引表的
表级备份还原;
8. 不支持位图连接索引表、位图连接索引以及虚索引的导出导入;
9. 位图连接索引及其相关表不支持快速装载;
10. 位图连接索引名称的长度限制为:事实表名的长度+索引名称长度+6<128;
11. 仅支持普通表、堆表和 HUGE 表;
12. WHERE 条件只能是列与列之间的等值连接,并且必须含有所有表;
13. 事实表上聚集索引和位图连接索引不能同时存在;
14. 不支持对含有位图连接索引的表中的数据执行 DML,如需要执行 DML,则先删除该
索引;
15. 含有位图连接索引的表不支持下列 DDL 操作:删除、修改表约束,删除、修改列,
更改表名。另外,含位图连接索引的堆表不支持添加列操作;
16. 不允许对含有位图连接索引的表并发操作;
17. 创建位图连接索引时,在存储参数中可指定存储位图的字节数,有效值为:1~ 128,
服务器自动校正为 4 的倍数,默认值为 48。如 STORAGE(SECTION(4)),表示使
用 4 个字节存储位图信息。
3 重建索引
当一个表经过大量的增删改操作后,表的数据在物理文件中可能存在大量碎片,从而影
响访问速度。另外,当删除表的大量数据后,若不再对表执行插入操作,索引所处的段可能
占用了大量并不使用的簇,从而浪费了存储空间。
可以使用重建索引来对索引的数据进行重组,使数据更加紧凑,并释放不需要的空间,
从而提高访问效率和空间效率。DM8 提供的重建索引的系统函数为:
SP_REBUILD_INDEX(SCHEMA_NAME varchar(256), INDEX_ID int);
SCHEAM_NAME 为索引所在的模式名,INDEX_ID 为索引 ID。
使用说明:
1. 水平分区子表,临时表和系统表上建的索引不支持重建
2. 虚索引和聚集索引不支持重建
例如,需要重建索引 emp_name,假设其索引 ID 为 1547892,那么使用以下语句重建
索引:
SP_REBUILD_INDEX('SYSDBA', 1547892);
删除索引
用户可能出于以下某项原因需要删除一个索引:
1. 不再需要该索引;
2. 该索引没有为针对其相关的表所发布的查询提供所期望的性能改善。例如,表可能
很小,或者尽管表中有许多行但只有很少的索引项;
3. 应用没有用该索引来查询数据。
要想删除索引,则该索引必须包含在用户的模式中或用户必须具有 DROP ANY INDEX
数据库权限。索引删除之后,该索引的段的所有簇都返回给包含它的表空间,并可用于表空
间中的其他对象。
如何删除索引,取决于是否是用 CREATE INDEX 语句明确地创建该索引的,是则可以
用 DROP INDEX 语句删除该索引。如下面的语句删除 emp_ename 索引。
DROP INDEX emp_ename;
然而,不能直接删除与已启用的 UNIQUE KEY 键或 PRIMARY KEY 键约束相关的索引。
要删除一个与约束相关的索引,必须停用或删除该约束本身。如下面的语句删除主键约束
pk_emp_name,同时删除其对应的索引。
ALTER TABLE emp DROP CONSTRAINT pk_emp_name;
除了删除普通索引,DM8 还提供删除聚集索引,只要其聚集索引是通过 CREATE
CLUSTER INDEX 明确建立的。例如,下面的语句删除 emp 表的聚集索引 clu_emp_name。
DROP INDEX clu_emp_name;
删除聚集索引其实是使用 ROWID 作为索引列重建聚集索引,即跟新建聚集索引一样会
重建这个表以及其所有索引。
删除表就自动删除了所有与其相关的索引。
查看索引信息
创建索引后,可以通过 INDEXDEF 系统函数查看索引的定义。
INDEXDEF(INDEX_ID int, PREFLAG int);
INDEX_ID 为索引 ID,PREFLAG 表示返回信息中是否增加模式名前缀。例如,需要查
看索引 emp_name 的定义,假设其索引 ID 为 1547892,那么使用以下语句查看索引定义。
SELECT INDEXDEF(1547892, 0);
或 SELECT INDEXDEF(1547892, 1);