数据库对象与权限管理-视图与索引管理

一、视图(View)管理

1. 视图的定义与本质

视图(View)是Oracle数据库中的逻辑表,它不直接存储数据,而是通过预定义的SQL查询动态生成结果集。视图的本质可以理解为:

  • 虚拟表:用户可像操作普通表一样查询视图
  • 查询模板:保存复杂的SELECT语句逻辑
  • 安全屏障:隐藏底层表结构和敏感数据

2. 视图的核心作用

应用场景

说明

简化复杂查询

将多表关联、聚合计算等操作封装为简单查询

数据权限控制

仅暴露部分列或行数据(如屏蔽薪资字段)

逻辑抽象层

业务系统无需关心物理表结构变化

数据整合

合并多个异构数据源(需配合物化视图)

3. 视图的创建与维护

基础语法
CREATE [OR REPLACE] [FORCE|NOFORCE] VIEW schema.view_name 
[(column1, column2...)]
AS SELECT_statement
[WITH CHECK OPTION] 
[WITH READ ONLY];
参数解析
  • OR REPLACE:覆盖同名视图
  • FORCE:即使基表不存在也强制创建(默认NOFORCE
  • WITH CHECK OPTION:插入/更新数据时需满足视图条件
  • WITH READ ONLY:禁止通过视图修改数据
创建示例
-- 创建高薪员工视图(薪资>=10000)
CREATE OR REPLACE VIEW v_high_salary 
AS
SELECT employee_id, name, salary, department_id
FROM employees
WHERE salary >= 10000
WITH CHECK OPTION;
视图维护操作
-- 查看视图定义
SELECT text FROM user_views WHERE view_name = 'V_HIGH_SALARY';-- 修改视图(使用OR REPLACE)
CREATE OR REPLACE VIEW v_high_salary AS ...;-- 删除视图
DROP VIEW v_high_salary;

4. 视图更新限制

以下类型的视图不允许直接进行DML操作:

  1. 包含聚合函数(SUM/AVG等)
  2. 包含GROUP BYHAVING子句
  3. 包含DISTINCT关键字
  4. 包含ROWNUM伪列
  5. 多表连接查询(部分情况)
示例:只读视图创建
CREATE VIEW v_dept_stats AS
SELECT department_id, AVG(salary) avg_sal
FROM employees
GROUP BY department_id
WITH READ ONLY;

二、索引(Index)管理

1. 索引的核心价值

索引是提高查询性能的数据结构,其作用类似书籍目录。Oracle支持多种索引类型:

索引类型

特点

B-Tree索引

默认类型,适合高基数列(唯一值多)

位图索引

低基数列(如性别),适合OLAP系统

函数索引

基于列的函数表达式创建(如UPPER(name)

组合索引

多列联合索引,列顺序影响查询效率

2. 索引的创建与维护

基础语法
CREATE [UNIQUE] [BITMAP] INDEX schema.index_name
ON table_name (column1 [ASC|DESC], ...)
[TABLESPACE tablespace_name]
[STORAGE (...)]
[ONLINE];  -- 在线创建不影响业务
创建示例
-- 单列B-Tree索引
CREATE INDEX idx_emp_salary ON employees(salary);-- 组合索引
CREATE INDEX idx_emp_dept_sal ON employees(department_id, salary DESC);-- 函数索引
CREATE INDEX idx_emp_name_upper ON employees(UPPER(name));
索引维护操作
-- 重建索引(优化存储)
ALTER INDEX idx_emp_salary REBUILD;-- 监控索引使用
SELECT * FROM v$object_usage WHERE index_name = 'IDX_EMP_SALARY';-- 删除索引
DROP INDEX idx_emp_salary;

3. 索引优化策略

创建原则
  • 高频查询字段:WHEREJOINORDER BY常用列
  • 选择高选择性列:区分度高的列(如ID)
  • 避免过度索引:单表索引不超过5个
  • 组合索引列顺序:等值查询列在前,范围查询列在后
性能验证方法
-- 查看执行计划
EXPLAIN PLAN FOR 
SELECT * FROM employees WHERE salary >= 10000;
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);-- 统计信息收集
EXEC DBMS_STATS.GATHER_TABLE_STATS('HR', 'EMPLOYEES');

4. 索引的代价

  • 存储开销:索引占用表空间的20%-30%
  • DML性能下降:每次INSERT/UPDATE/DELETE需维护索引
  • 优化器误判:低效索引可能导致执行计划劣化

三、视图、索引实战

1. 环境准备

基础表结构(已提供)
-- 员工表(含薪资、部门等信息)
CREATE TABLE employees (employee_id NUMBER(6) PRIMARY KEY,name VARCHAR2(50) NOT NULL,email VARCHAR2(50),phone_number VARCHAR2(20),hire_date DATE NOT NULL,job_id VARCHAR2(10),salary NUMBER(8,2),commission_pct NUMBER(2,2),manager_id NUMBER(6),department_id NUMBER(4)
);-- 部门表
CREATE TABLE departments (department_id NUMBER(4) PRIMARY KEY,department_name VARCHAR2(30) NOT NULL,manager_id NUMBER(6),location_id NUMBER(4)
);
模拟数据(供验证)
-- 插入部门数据
INSERT INTO departments VALUES (10, 'IT', 100, 1700);
INSERT INTO departments VALUES (20, 'Sales', 101, 1800);-- 插入员工数据
INSERT INTO employees VALUES 
(100, 'Alice', 'alice@company.com', '515.123.4567', DATE '2020-01-01', 'IT_PROG', 15000, NULL, NULL, 10);
INSERT INTO employees VALUES 
(101, 'Bob', 'bob@company.com', '515.123.4568', DATE '2019-06-01', 'SA_MAN', 12000, 0.2, 100, 20);

2. 视图高级应用实战

1. 安全视图:隐藏敏感字段
CREATE VIEW v_hr_employee AS
SELECT employee_id,name,email,phone_number,hire_date,job_id,department_id
FROM employees
WITH CHECK OPTION;  -- 防止通过视图插入不符合条件的数据-- 测试查询
SELECT * FROM v_hr_employee WHERE department_id = 10;
2. 计算视图:薪资分析
CREATE OR REPLACE VIEW v_employee_annual_income AS
SELECT employee_id,name,salary,commission_pct,-- 计算年薪:月薪*13 + 佣金(salary * 13 + NVL(salary * commission_pct, 0)) AS annual_income,department_id
FROM employees
WHERE salary IS NOT NULL;-- 查询年薪超过15万的员工
SELECT * FROM v_employee_annual_income 
WHERE annual_income > 150000
ORDER BY annual_income DESC;
3. 多表关联视图:员工详情
CREATE VIEW v_emp_details AS
SELECT e.employee_id,e.name,d.department_name,e.hire_date,TRUNC(MONTHS_BETWEEN(SYSDATE, e.hire_date)/12) AS years_of_service
FROM employees e
JOIN departments d ON e.department_id = d.department_id;-- 查询IT部门工龄超过3年的员工
SELECT * FROM v_emp_details 
WHERE department_name = 'IT' AND years_of_service > 3;
4. 带权限的物化视图
CREATE MATERIALIZED VIEW mv_dept_salary_stats
REFRESH COMPLETE START WITH SYSDATE NEXT SYSDATE + 1
AS
SELECT d.department_name,COUNT(e.employee_id) AS emp_count,AVG(e.salary) AS avg_salary,MAX(e.salary) AS max_salary
FROM employees e
JOIN departments d ON e.department_id = d.department_id
GROUP BY d.department_name;-- 查询物化视图
SELECT * FROM mv_dept_salary_stats WHERE avg_salary > 10000;

3. 索引深度优化实战

1. 高频查询优化
-- 创建函数索引
CREATE INDEX idx_emp_email_upper ON employees(UPPER(email));-- 使用索引的查询
SELECT * FROM employees 
WHERE UPPER(email) = UPPER('alice@company.com');  -- 命中索引
2. 组合索引设计
-- 创建组合索引(部门ID + 薪资降序)
CREATE INDEX idx_emp_dept_salary ON employees(department_id, salary DESC);-- 高效查询:IT部门薪资前10名
SELECT * FROM (SELECT * FROM employees WHERE department_id = 10 ORDER BY salary DESC
) WHERE ROWNUM <= 10;  -- 利用索引避免全表排序
3. 覆盖索引加速统计
-- 创建覆盖索引
CREATE INDEX idx_emp_dept_covering ON employees(department_id, employee_id);-- 查询可直接从索引获取数据
SELECT department_id, COUNT(employee_id) 
FROM employees 
GROUP BY department_id;  -- 使用INDEX FAST FULL SCAN
4. 索引监控与维护
-- 步骤1:监控索引使用情况
ALTER INDEX idx_emp_dept_salary MONITORING USAGE;-- 步骤2:分析无效索引
SELECT * FROM v$object_usage 
WHERE index_name = 'IDX_EMP_DEPT_SALARY'
AND used = 'NO';  -- 若长期未使用,考虑删除-- 步骤3:重建索引优化空间
ALTER INDEX idx_emp_dept_salary REBUILD ONLINE;

4. 执行计划分析案例

1. 未使用索引的慢查询
EXPLAIN PLAN FOR
SELECT * FROM employees 
WHERE UPPER(name) = 'ALICE';  -- 未使用索引SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);
/* 输出关键信息:TABLE ACCESS FULL | EMPLOYEES
*/
2. 优化后使用函数索引
-- 创建函数索引
CREATE INDEX idx_emp_name_upper ON employees(UPPER(name));-- 再次分析
EXPLAIN PLAN FOR
SELECT * FROM employees 
WHERE UPPER(name) = 'ALICE';SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);
/* 输出关键信息:INDEX RANGE SCAN | IDX_EMP_NAME_UPPER
*/

四、开发注意事项

1. 视图更新陷阱

-- 错误示例:尝试更新计算视图
UPDATE v_employee_annual_income 
SET annual_income = 200000 
WHERE employee_id = 100;  -- 将抛出ORA-01733错误

2. 索引设计禁忌

  • 过度索引:在频繁更新的列上创建多个索引
  • 冗余索引:已有组合索引 (a,b) 再单独创建 (a)
  • 无效索引:在性别等低基数列上使用B-Tree索引

3. 高级技巧

  • 不可见索引测试
CREATE INDEX idx_test ON employees(phone_number) INVISIBLE;
-- 按需切换可见性
ALTER INDEX idx_test VISIBLE;
  • 位图索引适用场景
CREATE BITMAP INDEX idx_emp_job ON employees(job_id);  -- 适合重复值多的列

附录:常用系统视图查询

-- 查看所有索引
SELECT * FROM user_indexes WHERE table_name = 'EMPLOYEES';-- 查看视图定义
SELECT text FROM user_views WHERE view_name = 'V_HR_EMPLOYEE';-- 分析索引碎片率
SELECT name, del_lf_rows/lf_rows AS frag_ratio 
FROM index_stats WHERE lf_rows > 0; 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/902461.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

IPoIB驱动接收路径深度解析:从数据包到协议栈

引言 在InfiniBand网络中,IPoIB(IP-over-InfiniBand)协议通过封装和模拟以太网行为,使得传统IP应用能够无缝运行。其接收路径是性能优化的关键环节,涉及硬件中断处理、内存管理、协议解析等多个复杂步骤。本文以Linux内核中ipoib_ib_handle_rx_wc_rss函数为核心,结合IPo…

Oracle高级语法篇-分析函数详解

Oracle 分析函数详解 在Oracle数据库中&#xff0c;分析函数&#xff08;Analytical Functions&#xff09;是一类非常强大的工具&#xff0c;它们允许在查询结果集上进行复杂的计算和分析&#xff0c;而无需使用自连接或子查询等复杂操作。本文将详细介绍Oracle分析函数的使用…

使用 Nacos 的注意事项与最佳实践

&#x1f4f9; 背景 Nacos 凭借其强大&#x1f4aa;的服务发现、配置管理和服务管理能力&#xff0c;成为构建分布式系统的得力助手。然而&#xff0c;要充分发挥 Nacos 的优势&#xff0c;实现系统的高性能、高可用&#xff0c;掌握其使用过程中的注意事项和最佳实践至关…

解决Python与Java交互乱码问题:从编码角度优化数据流

在现代软件开发中&#xff0c;跨语言系统的集成已经成为日常工作的一部分。特别是当Python和Java之间进行交互时&#xff0c;编码问题往往会成为导致数据传输错误、乱码以及难以调试的主要原因之一。 你是否曾遇到过这种情境&#xff1a;Python脚本通过标准输出返回了正确的数…

AI大模型-window系统CPU版安装anaconda以及paddle详细步骤-亲测有效

window系统CPU版安装anaconda以及paddle详细步骤-亲测有效 一 安装anaconda 下载地址:anaconda下载 下载成功后,选择非C盘安装,按提示安装即可修改镜像文件 安装成功后,运行anaconda软件,若提示更新则点击更新,更新完后,修改镜像文件 找到用户目录下的.condarc文件,覆…

第48讲:空间大数据与智慧农业——时空大数据分析与农业物联网的融合实践

目录 🧠 一、什么是空间大数据? 📡 二、农业物联网:数据采集的神经末梢 🔁 三、融合应用:空间大数据 + 农业IoT = 决策大脑 1. 精准灌溉管理 2. 时空病虫害预警 3. 农业碳监测与生态评估 💡 四、技术实践案例:农田干旱预警系统 📌 场景设定: 🛠 数据…

JSP服务器端表单验证

JSP服务器端表单验证 一、引言 在Web开发中&#xff0c;表单验证是保障数据合法性的重要环节。《Web编程技术》第五次实验要求&#xff0c;详细讲解如何基于JSP内置对象实现服务器端表单验证&#xff0c;包括表单设计、验证逻辑、交互反馈等核心功能。最终实现&#xff1a;输…

[创业之路-381]:企业法务 - 企业经营者,有哪些生产安全风险,哪些人承担责任?承担哪些责任?如何防范?

企业生产安全风险、责任主体、责任类型及防范措施 一、企业生产安全风险类型 安全生产条件不达标 包括生产设施、设备不符合国家安全标准&#xff0c;作业环境存在重大安全隐患&#xff08;如易燃易爆物品存放不当、通风不良等&#xff09;。案例&#xff1a;某企业因未对特种…

BPC电波授时技术

BPC电波授时技术是一种基于低频时码信号的授时方式&#xff0c;广泛应用于中国的时间同步领域。其核心在于通过发射特定频率的低频信号&#xff0c;将高精度的时间信息传递给接收设备&#xff0c;从而实现时间同步。以下将从技术原理、系统组成、应用领域及发展历史等方面详细介…

polkit补丁升级手顺

确认当前Polkit版本 rpm -qa |grep polkit上传polkit安装包 上传安装包&#xff1a; polkit-0.115-11.el8_4.2.x86_64.rpm polkit-libs-0.115-11.el8_4.2.x86_64.rpm执行升级操作 yum update polkit-0.115-11.el8_4.2.x86_64.rpm polkit-libs-0.115-11.el8_4.2.x86_64.rpm检…

Pycharm(十五)面向对象程序设计基础

目录 一、定义类及使用类的成员 二、self关键字介绍 三、在类内部调用类中的函数 class 类名&#xff1a; 属性&#xff08;类似于定义变量&#xff09; 行为&#xff08;类似于定义函数&#xff0c;只不过第一个形参要写self&#xff09; 一、面向对象基本概述 属性&…

ZYNQ笔记(九):定时器中断

版本&#xff1a;Vivado2020.2&#xff08;Vitis&#xff09; 任务&#xff1a;使用定时器 (私有定时器) 中断 实现 LED&#xff08;PS端&#xff09; 定时1s亮灭翻转 目录 一、介绍 二、硬件设计 三、软件设计 四、效果 一、介绍 Zynq系列是Xilinx(现为AMD)推出的集成了AR…

逻辑思维与软件开发:从选定方向到风险管理的全流程

在软件开发的过程中&#xff0c;逻辑思维是至关重要的。它不仅帮助我们在复杂的技术问题中找到解决方案&#xff0c;还能指导我们在项目管理、团队协作和风险控制等方面做出明智的决策。本文将探讨如何结合逻辑思维&#xff0c;围绕“选定大方向、及时止损、制定适合自己的执行…

描述城市出行需求模式的复杂网络视角:大规模起点-目的地需求网络的图论分析

描述城市出行需求模式的复杂网络视角&#xff1a;大规模起点-目的地需求网络的图论分析 原文&#xff1a; A complex network perspective for characterizing urban travel demand patterns: graph theoretical analysis of large-scale origin–destination demand networks…

如何测试雷达与相机是否时间同步?

在多传感器融合系统中&#xff0c;相机与雷达的协同感知已成为环境理解的关键。相机通过捕捉纹理信息识别物体类别&#xff0c;而雷达利用激光或毫米波实现全天候精确测距。两者的数据融合既能避免单一传感器缺陷&#xff08;如相机受光照影响、雷达缺乏语义信息&#xff09;&a…

探寻Gson解析遇到不存在键值时引发的Kotlin的空指针异常的原因

文章目录 一、问题背景二、问题原因三、问题探析Kotlin空指针校验Gson.fromJson(String json, Class<T> classOfT)TypeTokenGson.fromJson(JsonReader reader, TypeToken<T> typeOfT)TypeAdapter 和 TypeAdapterFactoryReflectiveTypeAdapterFactoryRecordAdapter …

ESP-ADF外设子系统深度解析:esp_peripherals组件架构与核心设计(存储类外设之SPIFFS)

目录 ESP-ADF外设子系统深度解析&#xff1a;esp_peripherals组件架构与核心设计&#xff08;存储类外设之SPIFFS&#xff09;1. 简介2. 模块概述功能定义架构位置核心特性 SPIFFS外设SPIFFS外设概述SPIFFS外设层次架构图 SPIFFS外设API和数据结构外设层API公共API内部API内部数…

【Pandas】pandas DataFrame truediv

Pandas2.2 DataFrame Binary operator functions 方法描述DataFrame.add(other)用于执行 DataFrame 与另一个对象&#xff08;如 DataFrame、Series 或标量&#xff09;的逐元素加法操作DataFrame.add(other[, axis, level, fill_value])用于执行 DataFrame 与另一个对象&…

开发网页程序时预览时遇到跨域问题解决方法

CocosCreator 开发h5游戏要用接口、开发html程序网页程序在chrome中预览时都会遇到跨域问题,怎么办? 网上有很多方法,主要是通过服务器端去配置,但那个相对来说消弱安全问题,这个不建议,因为是开发,个人行业,我们知道问题所以,简单点就主要是通过chrome的参数来禁用: 关闭 Ch…

C语言main的参数;argc与argv

目录 前言 什么是命令行参数 argc与argv argc (Argument Count) argv (Argument Vector) 示例 前言 在C语言中&#xff0c;main函数的标准形式通常有两种&#xff1a; int main(void)int main(int argc, char *argv[]) 其中&#xff0c;argc 和 argv 是用于处理命令行参数…