2026/2/15 17:26:31
网站建设
项目流程
网站怎么建站点,做设计用图片的网站,下载百度浏览器,罗湖平台网站建设费用索引#xff1a;在数据库管理与应用开发过程中#xff0c;视图和索引是两个非常重要的数据库对象。视图能够简化复杂查询、保障数据安全#xff0c;索引则可以大幅提升数据查询效率。本文将针对达梦#xff08;DM#xff09;数据库#xff0c;详细介绍视图和索引的概念、…索引在数据库管理与应用开发过程中视图和索引是两个非常重要的数据库对象。视图能够简化复杂查询、保障数据安全索引则可以大幅提升数据查询效率。本文将针对达梦DM数据库详细介绍视图和索引的概念、创建方法、使用场景以及相关注意事项帮助数据库开发者和管理员更好地利用这两个工具优化数据库操作。一、达梦数据库视图详解1.1 视图的概念与作用视图是一个虚拟的表它基于一个或多个表或其他视图的查询结果集。视图本身不存储实际的数据只存储对应的查询语句当用户访问视图时数据库会动态执行该查询语句并返回结果。在达梦数据库中视图主要有以下几个作用简化复杂查询对于涉及多表关联、条件复杂的查询可以将其定义为视图用户后续只需查询视图即可无需重复编写复杂的 SQL 语句。数据安全控制通过视图可以隐藏表中的部分敏感字段或记录只向用户展示其有权访问的数据保障数据安全。例如对于员工表可创建一个不包含工资字段的视图给普通查询用户。数据独立性当底层表的结构发生轻微变化如增加字段时只要视图的查询逻辑不受影响基于该视图的应用程序无需修改提高了应用的可维护性。1.2 视图的创建在达梦数据库中创建视图使用CREATE VIEW语句语法格式如下CREATE [OR REPLACE] VIEW 视图名 [(列名1, 列名2, ...)]ASSELECT 查询语句[WITH CHECK OPTION [CONSTRAINT 约束名]][WITH READ ONLY];各参数说明OR REPLACE如果已存在同名视图将其替换为新视图避免因视图已存在而报错。视图名自定义的视图名称需符合达梦数据库的命名规范如以字母开头不包含特殊字符等。(列名1, 列名2, ...)可选参数用于指定视图的列名。若不指定视图的列名将默认使用SELECT语句中查询的列名若指定列名数量需与SELECT语句返回的列数一致。SELECT 查询语句定义视图数据来源的核心查询可涉及单表、多表关联、子查询等支持大部分SELECT语句的语法如WHERE、GROUP BY、HAVING等。WITH CHECK OPTION可选参数用于限制通过视图修改数据时修改后的数据必须仍能被视图查询到。例如若视图查询条件为dept_id 1则通过该视图修改数据时dept_id不能改为其他值否则会报错。CONSTRAINT 约束名用于为该检查选项指定约束名。WITH READ ONLY可选参数指定视图为只读视图不允许通过该视图对底层表的数据进行插入、更新或删除操作。示例 1创建单表视图假设有一个员工表EMP包含EMP_ID员工 ID、EMP_NAME员工姓名、DEPT_ID部门 ID、SALARY工资字段现在创建一个只包含部门 ID 为 1 的员工姓名和工资的视图EMP_VIEW_DEPT1CREATE VIEW EMP_VIEW_DEPT1 (EMP_NAME, SALARY)ASSELECT EMP_NAME, SALARYFROM EMPWHERE DEPT_ID 1WITH CHECK OPTION CONSTRAINT CHK_EMP_VIEW_DEPT1;该视图只展示部门 1 的员工姓名和工资且通过视图修改工资时DEPT_ID仍需保持为 1否则修改会失败。示例 2创建多表关联视图假设有部门表DEPT包含DEPT_ID、DEPT_NAME字段和员工表EMP现在创建一个关联两个表展示员工姓名、部门名称的视图EMP_DEPT_VIEWCREATE OR REPLACE VIEW EMP_DEPT_VIEWASSELECT E.EMP_NAME, D.DEPT_NAMEFROM EMP EINNER JOIN DEPT D ON E.DEPT_ID D.DEPT_ID;通过该视图用户可以直接查询到员工对应的部门名称无需手动编写关联查询语句。1.3 视图的使用1.3.1 查询视图查询视图的方式与查询普通表完全一致使用SELECT语句即可。例如查询上述EMP_VIEW_DEPT1视图中的数据SELECT * FROM EMP_VIEW_DEPT1;查询EMP_DEPT_VIEW视图中部门名称为 “技术部” 的员工SELECT EMP_NAMEFROM EMP_DEPT_VIEWWHERE DEPT_NAME 技术部;1.3.2 修改视图数据非只读视图对于非只读且满足条件的视图可以通过INSERT、UPDATE、DELETE语句修改底层表的数据但需注意以下限制视图若基于多表关联创建通常只能修改其中一个表的数据且修改的列需是该表的非关联列。若视图包含GROUP BY、DISTINCT、聚合函数如SUM、COUNT等无法通过视图修改数据。若视图指定了WITH CHECK OPTION修改后的数据需符合视图的查询条件。示例通过EMP_VIEW_DEPT1视图更新员工 “张三” 的工资UPDATE EMP_VIEW_DEPT1SET SALARY 8000WHERE EMP_NAME 张三;该操作会实际更新EMP表中 “张三” 的工资字段。1.3.3 修改视图结构若需要修改视图的查询逻辑或列定义可以使用CREATE OR REPLACE VIEW语句本质是替换原视图或ALTER VIEW语句达梦数据库支持ALTER VIEW修改视图的部分属性如添加WITH READ ONLY等。示例将EMP_VIEW_DEPT1视图修改为只读视图ALTER VIEW EMP_VIEW_DEPT1SET WITH READ ONLY;1.3.4 删除视图当视图不再需要时使用DROP VIEW语句删除视图语法如下DROP VIEW [IF EXISTS] 视图名;IF EXISTS用于避免删除不存在的视图时报错。示例删除EMP_VIEW_DEPT1视图DROP VIEW IF EXISTS EMP_VIEW_DEPT1;1.4 视图使用注意事项视图不存储数据每次查询视图都会重新执行底层的SELECT语句若底层查询复杂或数据量大可能会影响查询性能此时需结合索引或其他优化手段。避免创建嵌套过深的视图如视图基于另一个视图创建而该视图又基于第三个视图嵌套过深会增加查询解析难度降低性能且不利于维护。对于频繁查询的视图可考虑使用达梦数据库的 “物化视图”Materialized View物化视图会存储实际的数据定期刷新能大幅提升查询性能但会占用额外的存储空间且数据存在一定的延迟性。二、达梦数据库索引详解2.1 索引的概念与作用索引是数据库中用于快速查找数据的数据结构达梦数据库默认使用 B 树索引它通过将表中的一列或多列数据与对应的行地址关联起来使得数据库在查询数据时无需扫描整个表只需通过索引快速定位到目标数据从而显著提升查询效率。索引的主要作用的是提升查询速度但同时也有一些副作用增加数据写入INSERT、UPDATE、DELETE的开销当表中的数据发生变化时对应的索引也需要同步更新会消耗额外的时间和资源。占用存储空间索引本身需要存储在磁盘上一张表的索引越多占用的存储空间越大。因此索引的设计需要权衡查询性能和写入性能并非索引越多越好。2.2 达梦数据库索引的类型达梦数据库支持多种类型的索引常见的有B 树索引默认的索引类型适用于大多数查询场景尤其是范围查询如WHERE age BETWEEN 20 AND 30和等值查询如WHERE id 100。哈希索引基于哈希表实现适用于等值查询如WHERE name 张三查询速度极快但不支持范围查询和排序操作且哈希冲突可能影响性能。位图索引适用于列值重复率高的场景如性别、部门 ID 等通过位图的方式存储数据的位置信息占用存储空间小适合多条件组合查询但不适合频繁更新的列。函数索引基于列的函数计算结果创建的索引适用于查询条件中包含函数的场景如WHERE UPPER(name) ZHANGSAN若不创建函数索引这类查询无法使用普通索引只能全表扫描。本文主要介绍最常用的 B 树索引的创建与使用。2.3 索引的创建在达梦数据库中创建 B 树索引使用CREATE INDEX语句语法格式如下CREATE [UNIQUE] [CLUSTERED] INDEX 索引名ON 表名 (列名1 [ASC|DESC], 列名2 [ASC|DESC], ...)[STORAGE (存储参数)][COMPUTE STATISTICS];各参数说明UNIQUE可选参数指定索引为唯一索引即索引列的值不能重复允许 NULL 值且 NULL 值视为不重复。唯一索引可以保证数据的唯一性同时提升查询效率若表的某列需要作为唯一标识非主键可创建唯一索引。CLUSTERED可选参数指定索引为聚簇索引。聚簇索引的特点是索引的顺序与表中数据的物理存储顺序一致一张表只能有一个聚簇索引达梦数据库中若表有主键主键默认是聚簇索引若没有主键可手动指定一个聚簇索引。聚簇索引在范围查询和排序查询中性能优势明显但数据插入和更新时若索引列值变化可能导致数据物理位置移动开销较大。索引名自定义的索引名称需符合命名规范且在同一张表中不能重复。表名索引所属的表名。(列名1 [ASC|DESC], 列名2 [ASC|DESC], ...)指定索引对应的列即索引键可以是单列也可以是多列复合索引。ASC表示升序默认DESC表示降序索引的排序顺序会影响查询时的排序性能。STORAGE (存储参数)可选参数用于指定索引的存储属性如存储表空间、初始大小、增长方式等例如STORAGE (TABLESPACE IDX_TBS INITIAL 10M NEXT 5M)。COMPUTE STATISTICS可选参数创建索引的同时收集索引的统计信息这些统计信息有助于数据库优化器生成更优的查询执行计划。示例 1创建单列非唯一索引为员工表EMP的DEPT_ID列创建一个非唯一索引IDX_EMP_DEPT_ID用于提升按部门 ID 查询员工的效率CREATE INDEX IDX_EMP_DEPT_IDON EMP (DEPT_ID)STORAGE (TABLESPACE IDX_TBS)COMPUTE STATISTICS;示例 2创建唯一索引为员工表EMP的EMP_NAME列创建一个唯一索引UNIQ_IDX_EMP_NAME保证员工姓名不重复同时提升按姓名查询的效率CREATE UNIQUE INDEX UNIQ_IDX_EMP_NAMEON EMP (EMP_NAME)COMPUTE STATISTICS;若EMP表中已存在重复的员工姓名该语句会执行失败需先删除重复数据。示例 3创建复合索引为员工表EMP的DEPT_ID和SALARY列创建一个复合索引IDX_EMP_DEPT_SAL用于优化 “查询某部门中工资大于指定值的员工” 这类多条件查询CREATE INDEX IDX_EMP_DEPT_SALON EMP (DEPT_ID ASC, SALARY DESC)COMPUTE STATISTICS;复合索引的查询效率与列的顺序有关通常将过滤性强重复率低的列放在前面且查询条件中若能匹配索引的前几列即 “前缀匹配”才能有效使用该索引。例如上述索引可优化WHERE DEPT_ID 1或WHERE DEPT_ID 1 AND SALARY 5000的查询但无法优化WHERE SALARY 5000的查询未匹配索引前缀DEPT_ID。示例 4创建函数索引为员工表EMP的EMP_NAME列创建一个基于UPPER()函数的函数索引IDX_EMP_NAME_UPPER用于优化查询条件包含UPPER(EMP_NAME)的查询CREATE INDEX IDX_EMP_NAME_UPPERON EMP (UPPER(EMP_NAME))COMPUTE STATISTICS;创建该索引后执行SELECT * FROM EMP WHERE UPPER(EMP_NAME) ZHANGSAN时数据库会使用该函数索引避免全表扫描。2.4 索引的使用与管理2.4.1 索引的自动使用在达梦数据库中当执行SELECT查询语句时数据库的查询优化器会根据表的数据量、索引的统计信息、查询条件等因素自动判断是否使用索引。用户无需手动指定使用哪个索引特殊情况除外如强制索引。例如执行以下查询时若EMP表的DEPT_ID列有索引IDX_EMP_DEPT_ID优化器会自动使用该索引定位数据SELECT EMP_NAME, SALARYFROM EMPWHERE DEPT_ID 2;2.4.2 查看索引信息若需要查看表的索引信息可查询达梦数据库的系统视图DBA_INDEXES需 DBA 权限、ALL_INDEXES当前用户有权访问的索引或USER_INDEXES当前用户拥有的索引例如-- 查看当前用户拥有的EMP表的所有索引SELECT INDEX_NAME, INDEX_TYPE, UNIQUENESS, COLUMN_NAMEFROM USER_IND_COLUMNSWHERE TABLE_NAME EMP;USER_IND_COLUMNS视图包含了索引名称、索引类型、是否唯一、索引列等信息便于用户了解索引的配置情况。2.4.3 修改索引达梦数据库支持通过ALTER INDEX语句修改索引的部分属性如重命名、重建、修改存储参数等。重命名索引ALTER INDEX IDX_EMP_DEPT_ID RENAME TO IDX_EMP_DEPT_ID_NEW;重建索引当索引因数据频繁更新而产生大量碎片导致查询性能下降时可重建索引重建索引会重新组织索引结构消除碎片ALTER INDEX IDX_EMP_DEPT_ID_NEW REBUILD COMPUTE STATISTICS;2.4.4 删除索引当索引不再被使用或因增加写入开销而影响性能时可使用DROP INDEX语句删除索引语法如下DROP INDEX [IF EXISTS] 索引名;示例删除IDX_EMP_DEPT_ID_NEW索引DROP INDEX IF EXISTS IDX_EMP_DEPT_ID_NEW;需注意删除索引前需确认该索引不再被查询使用避免删除后导致查询性能大幅下降。2.5 索引使用注意事项合理选择索引列优先为查询频率高、过滤性强重复率低的列创建索引避免为查询频率低、重复率高如性别列只有 “男”“女” 两个值或频繁更新的列创建索引。控制索引数量一张表的索引数量不宜过多通常建议不超过 5-8 个。过多的索引会显著增加INSERT、UPDATE、DELETE操作的开销尤其是在数据写入频繁的表中。复合索引的列顺序很重要复合索引需遵循 “前缀匹配” 原则查询条件中若能匹配索引的前几列才能有效使用索引。因此应将过滤性强、查询中频繁出现的列放在复合索引的前面。避免索引失效场景以下情况可能导致索引失效查询无法使用索引而进行全表扫描