网站手机站怎么做的,公司免费招聘网站,网站建设的针对对象,大学生做简历的网站索引是Oracle数据库性能优化的核心组件#xff0c;如同书籍的目录#xff0c;能快速定位数据位置#xff0c;减少磁盘I/O开销。合理设计和维护索引可显著提升查询效率#xff0c;而误用则可能导致性能下降。
一、核心理论#xff1a;索引的本质与分类
1. 索引的核心作用
加…索引是Oracle数据库性能优化的核心组件如同书籍的目录能快速定位数据位置减少磁盘I/O开销。合理设计和维护索引可显著提升查询效率而误用则可能导致性能下降。一、核心理论索引的本质与分类1. 索引的核心作用加速查询通过索引结构快速定位数据避免全表扫描。强制执行约束主键、唯一键约束依赖索引确保数据唯一性。优化表连接外键列上的索引可减少表连接时的锁定问题提升关联查询性能。2. 主流索引类型及适用场景Oracle提供多种索引类型需根据数据特征和业务场景选择B树索引默认索引类型适用于高基数列值唯一性高列支持等值查询、范围查询是OLTP系统的首选。位图索引适用于低基数列如性别、状态数据仓库环境中优势明显可高效处理多列组合查询但不支持高并发DML操作。索引组织表IOT数据存储与索引结构融合适用于主键查询频繁的场景节省存储空间但插入性能略低。专门索引包括不可见索引用于测试验证、基于函数的索引适配WHERE子句中的函数操作、反向键索引解决RAC环境索引块争用等。分区索引分为本地分区索引与表分区一一对应维护成本低和全局分区索引跨分区全局生效适用于特定查询场景。3. 索引与性能的平衡索引并非越多越好索引会占用磁盘空间增加DML操作INSERT/UPDATE/DELETE的开销需同步更新索引。低基数列创建B树索引、高并发更新列创建位图索引都会导致性能反噬。优化器会自动判断是否使用索引当查询需扫描表中大部分数据时可能选择全表扫描而非索引。二、实操指南索引的创建、维护与调优1. 索引创建精准落地最佳实践1基础B树索引创建适用于主键、唯一键、外键及高基数查询列-- 普通B树索引单列CREATEINDEXcust_idx_lastnameONcust(last_name)TABLESPACEreporting_index;-- 复合B树索引多列前导列需高频查询CREATEINDEXcust_idx_name_salONcust(last_name,salary)COMPRESS2;-- 唯一索引强制执行唯一性CREATEUNIQUEINDEXcust_idx_ssnONcust(ssn)NOLOGGING;关键参数说明TABLESPACE指定索引表空间建议与表数据分离便于维护。COMPRESS N压缩前导列重复值节省存储空间复合索引优先使用。NOLOGGING创建时不生成重做日志加速大索引创建数据仓库场景适用。2位图索引创建仅适用于数据仓库、低基数列、少DML操作场景-- 单位列位图索引CREATEBITMAPINDEXf_sales_date_idxONf_sales(d_date_id)LOCALNOLOGGING;-- 位图连接索引星型模式事实表与维度表关联CREATEBITMAPINDEXf_sales_cust_bmjONf_sales(d_customers.cust_name)FROMf_sales,d_customersWHEREf_sales.d_customer_idd_customers.d_customer_idLOCAL;3索引组织表创建适用于主键查询频繁、列数较少的表CREATETABLEprod_sku(prod_sku_id NUMBER,sku VARCHAR2(256),CONSTRAINTprod_sku_pkPRIMARYKEY(prod_sku_id,sku))ORGANIZATIONINDEXOVERFLOWTABLESPACEoverflow_s;-- 非键列存储到溢出段优化性能2. 索引维护保障长期高效运行1统计信息收集优化器依赖统计信息判断索引使用效率需定期更新-- 收集表及索引统计信息EXECDBMS_STATS.GATHER_TABLE_STATS(ownnameUSER,tabnameCUST,cascadeTRUE,-- 级联收集索引统计method_optFOR ALL COLUMNS SIZE AUTO);-- 单独收集索引统计信息EXECDBMS_STATS.GATHER_INDEX_STATS(ownnameUSER,indexnameCUST_IDX_LASTNAME);2索引碎片处理索引经频繁删除/更新后会产生碎片需通过重建、合并优化-- 重建索引碎片严重、索引不可用时ALTERINDEXcust_idx_lastname REBUILD ONLINE;-- ONLINE允许重建期间查询ALTERINDEXcust_idx_lastname REBUILDPARTITIONp2023TABLESPACEnew_index_ts;-- 分区索引重建-- 合并索引碎片较轻无需额外空间ALTERINDEXcust_idx_lastnameCOALESCE;-- 收缩索引释放未使用空间ALTERINDEXcust_idx_lastname SHRINK SPACE COMPACT;注意重建索引需占用与原索引相当的临时空间建议在维护窗口执行分区索引优先重建受影响分区而非全索引。3索引状态管理-- 标记索引不可用批量加载数据前避免维护开销ALTERINDEXcust_idx_lastname UNUSABLE;-- 恢复不可用索引ALTERINDEXcust_idx_lastname REBUILD;-- 隐藏索引测试索引有效性不影响业务ALTERINDEXcust_idx_lastname INVISIBLE;-- 会话级启用隐藏索引ALTERSESSIONSEToptimizer_use_invisible_indexesTRUE;3. 索引调优解决性能瓶颈1优化器索引使用控制-- 强制使用索引优化器误判时SELECT/* INDEX(cust cust_idx_lastname) */*FROMcustWHERElast_nameSTARK;-- 避免使用索引全表扫描更高效时SELECT/* FULL(cust) */*FROMcustWHEREsalary5000;-- 调整索引成本系数倾向使用索引ALTERSESSIONSEToptimizer_index_cost_adj50;-- 默认100值越小越倾向索引2SQL调优顾问自动获取索引建议Oracle内置工具可分析高负载SQL并生成索引建议-- 查看自动SQL调优作业建议默认每日运行SETLONG1000000;SELECTDBMS_AUTO_SQLTUNE.REPORT_AUTO_TUNING_TASKFROMDUAL;-- 手动运行SQL调优顾问针对特定SQLDECLAREtask_id VARCHAR2(100);BEGINtask_id :DBMS_SQLTUNE.CREATE_TUNING_TASK(sql_textSELECT * FROM cust WHERE last_name STARK AND salary 5000,user_nameUSER,task_namecust_query_tune);DBMS_SQLTUNE.EXECUTE_TUNING_TASK(task_idtask_id);DBMS_OUTPUT.PUT_LINE(DBMS_SQLTUNE.REPORT_TUNING_TASK(task_idtask_id));END;/3常见索引失效场景及解决函数操作导致失效WHERE子句中列使用函数需创建基于函数的索引-- 原查询索引失效SELECT*FROMcustWHEREUPPER(last_name)STARK;-- 创建基于函数的索引CREATEINDEXcust_idx_upper_lastnameONcust(UPPER(last_name));复合索引前导列未使用复合索引(a,b)查询仅用b列需调整索引顺序或创建单独索引。统计信息陈旧执行DBMS_STATS.GATHER_TABLE_STATS更新统计信息。4. 索引监控与清理-- 监控索引是否被使用ALTERINDEXcust_idx_lastname MONITORINGUSAGE;-- 查看监控结果V$OBJECT_USAGESELECTindex_name,usedFROMv$object_usageWHEREindex_nameCUST_IDX_LASTNAME;-- 删除无用索引确认无依赖后DROPINDEXcust_idx_lastname;三、Oracle 索引创建与维护常用 SQL 脚本集索引创建脚本1. B树索引默认类型-- 1.1 单列B树索引高基数列首选CREATEINDEXidx_cust_lastnameONcust(last_name)TABLESPACEidx_ts NOLOGGING;-- 数据仓库场景加速创建不生成重做日志-- 1.2 复合B树索引前导列需高频查询CREATEINDEXidx_cust_name_salONcust(last_name,salary)COMPRESS2;-- 压缩前导列重复值节省空间-- 1.3 唯一B树索引强制执行唯一性CREATEUNIQUEINDEXidx_cust_ssnONcust(ssn)TABLESPACEidx_ts;2. 位图索引低基数列、数据仓库-- 2.1 单列位图索引CREATEBITMAPINDEXidx_f_sales_dateONf_sales(d_date_id)LOCALNOLOGGING;-- 分区表需指定LOCAL-- 2.2 位图连接索引星型模式事实表与维度表关联CREATEBITMAPINDEXidx_f_sales_cust_bmjONf_sales(d_customers.cust_name)FROMf_sales,d_customersWHEREf_sales.d_customer_idd_customers.d_customer_idLOCAL;3. 特殊功能索引-- 3.1 基于函数的索引适配WHERE子句函数操作CREATEINDEXidx_cust_upper_lastnameONcust(UPPER(last_name));-- 3.2 不可见索引测试验证不影响业务CREATEINDEXidx_cust_invisibleONcust(email)INVISIBLE;-- 3.3 反向键索引RAC环境避免索引块争用CREATEINDEXidx_cust_id_reverseONcust(cust_id)REVERSE;-- 3.4 分区索引本地分区与表分区一一对应CREATEINDEXidx_emp_dept_partONemp(department_id)LOCAL(PARTITIONp2023_q1TABLESPACEidx_ts_q1,PARTITIONp2023_q2TABLESPACEidx_ts_q2);统计信息收集脚本优化器依赖统计信息判断索引有效性需定期更新-- 1. 收集表及关联索引统计信息推荐EXECDBMS_STATS.GATHER_TABLE_STATS(ownnameUSER,tabnameCUST,cascadeTRUE,-- 级联收集索引统计method_optFOR ALL COLUMNS SIZE AUTO);-- 2. 单独收集索引统计信息EXECDBMS_STATS.GATHER_INDEX_STATS(ownnameUSER,indexnameIDX_CUST_LASTNAME);-- 3. 收集基于函数的索引统计含隐藏虚拟列EXECDBMS_STATS.GATHER_TABLE_STATS(ownnameUSER,tabnameCUST,method_optFOR ALL HIDDEN COLUMNS SIZE AUTO);索引碎片处理脚本-- 1. 重建索引碎片严重、索引不可用时-- 1.1 普通索引在线重建不影响查询ALTERINDEXidx_cust_lastname REBUILD ONLINE;-- 1.2 分区索引重建仅重建受影响分区ALTERINDEXidx_emp_dept_part REBUILDPARTITIONp2023_q1TABLESPACEnew_idx_ts;-- 2. 合并索引碎片较轻无需额外空间ALTERINDEXidx_cust_name_salCOALESCE;-- 3. 收缩索引释放未使用空间ALTERINDEXidx_cust_lastname SHRINK SPACE COMPACT;索引状态管理脚本-- 1. 标记索引不可用批量加载数据前避免维护开销ALTERINDEXidx_cust_lastname UNUSABLE;-- 2. 恢复不可用索引ALTERINDEXidx_cust_lastname REBUILD;-- 3. 隐藏/显示索引测试索引有效性ALTERINDEXidx_cust_invisible VISIBLE;-- 显示索引ALTERINDEXidx_cust_invisible INVISIBLE;-- 隐藏索引-- 4. 会话级启用隐藏索引ALTERSESSIONSEToptimizer_use_invisible_indexesTRUE;索引监控与查询脚本-- 1. 监控索引是否被使用ALTERINDEXidx_cust_lastname MONITORINGUSAGE;-- 2. 查看索引监控结果V$OBJECT_USAGESELECTindex_name,used,monitoringFROMv$object_usageWHEREindex_nameIDX_CUST_LASTNAME;-- 3. 查询索引基本信息类型、表空间、状态SELECTindex_name,index_type,tablespace_name,statusFROMuser_indexesWHEREtable_nameCUST;-- 4. 查询分区索引状态SELECTindex_name,partition_name,statusFROMuser_ind_partitionsWHEREindex_nameIDX_EMP_DEPT_PART;-- 5. 查询索引碎片情况通过INDEX_STATS视图ANALYZEINDEXidx_cust_lastname VALIDATE STRUCTURE;SELECTlf_rows,del_lf_rows,del_lf_rows/lf_rows*100del_pctFROMindex_stats;索引删除与清理脚本-- 1. 删除无用索引确认无依赖后DROPINDEXidx_cust_invisible;-- 2. 删除约束关联的索引需先删除约束ALTERTABLEcustDROPCONSTRAINTcust_pk KEEPINDEX;-- 保留索引ALTERTABLEcustDROPCONSTRAINTcust_pk;-- 自动删除关联索引-- 3. 释放索引未使用空间ALTERINDEXidx_cust_lastnameDEALLOCATEUNUSED;核心使用原则高基数列如主键、唯一键用B树索引低基数列如性别、状态用位图索引索引创建时指定独立表空间便于维护和备份定期监控索引使用情况删除无用索引减少DML开销数据批量加载前禁用索引加载后重建提升效率。