數據庫對象與權限管理-視圖與索引管理

一、視圖(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.pswp.cn/news/902461.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/902461.shtml
英文地址,請注明出處:http://en.pswp.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 是用于處理命令行參數…