Simulink里调用Adams整车模型?一个视频讲清信号接口与联合仿真原理
2026/6/2 7:58:56
索引是Oracle数据库性能优化的核心组件,如同书籍的目录,能快速定位数据位置,减少磁盘I/O开销。合理设计和维护索引可显著提升查询效率,而误用则可能导致性能下降。
Oracle提供多种索引类型,需根据数据特征和业务场景选择:
索引并非越多越好:
适用于主键、唯一键、外键及高基数查询列:
-- 普通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:创建时不生成重做日志,加速大索引创建(数据仓库场景适用)。仅适用于数据仓库、低基数列、少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_id=d_customers.d_customer_idLOCAL;适用于主键查询频繁、列数较少的表:
CREATETABLEprod_sku(prod_sku_id NUMBER,sku VARCHAR2(256),CONSTRAINTprod_sku_pkPRIMARYKEY(prod_sku_id,sku))ORGANIZATIONINDEXOVERFLOWTABLESPACEoverflow_s;-- 非键列存储到溢出段,优化性能优化器依赖统计信息判断索引使用效率,需定期更新:
-- 收集表及索引统计信息EXECDBMS_STATS.GATHER_TABLE_STATS(ownname=>'USER',tabname=>'CUST',cascade=>TRUE,-- 级联收集索引统计method_opt=>'FOR ALL COLUMNS SIZE AUTO');-- 单独收集索引统计信息EXECDBMS_STATS.GATHER_INDEX_STATS(ownname=>'USER',indexname=>'CUST_IDX_LASTNAME');索引经频繁删除/更新后会产生碎片,需通过重建、合并优化:
-- 重建索引(碎片严重、索引不可用时)ALTERINDEXcust_idx_lastname REBUILD ONLINE;-- ONLINE允许重建期间查询ALTERINDEXcust_idx_lastname REBUILDPARTITIONp2023TABLESPACEnew_index_ts;-- 分区索引重建-- 合并索引(碎片较轻,无需额外空间)ALTERINDEXcust_idx_lastnameCOALESCE;-- 收缩索引(释放未使用空间)ALTERINDEXcust_idx_lastname SHRINK SPACE COMPACT;注意:重建索引需占用与原索引相当的临时空间,建议在维护窗口执行;分区索引优先重建受影响分区,而非全索引。
-- 标记索引不可用(批量加载数据前,避免维护开销)ALTERINDEXcust_idx_lastname UNUSABLE;-- 恢复不可用索引ALTERINDEXcust_idx_lastname REBUILD;-- 隐藏索引(测试索引有效性,不影响业务)ALTERINDEXcust_idx_lastname INVISIBLE;-- 会话级启用隐藏索引ALTERSESSIONSEToptimizer_use_invisible_indexes=TRUE;-- 强制使用索引(优化器误判时)SELECT/*+ INDEX(cust cust_idx_lastname) */*FROMcustWHERElast_name='STARK';-- 避免使用索引(全表扫描更高效时)SELECT/*+ FULL(cust) */*FROMcustWHEREsalary>5000;-- 调整索引成本系数(倾向使用索引)ALTERSESSIONSEToptimizer_index_cost_adj=50;-- 默认100,值越小越倾向索引Oracle内置工具,可分析高负载SQL并生成索引建议:
-- 查看自动SQL调优作业建议(默认每日运行)SETLONG1000000;SELECTDBMS_AUTO_SQLTUNE.REPORT_AUTO_TUNING_TASKFROMDUAL;-- 手动运行SQL调优顾问(针对特定SQL)DECLAREtask_id VARCHAR2(100);BEGINtask_id :=DBMS_SQLTUNE.CREATE_TUNING_TASK(sql_text=>'SELECT * FROM cust WHERE last_name = ''STARK'' AND salary > 5000',user_name=>'USER',task_name=>'cust_query_tune');DBMS_SQLTUNE.EXECUTE_TUNING_TASK(task_id=>task_id);DBMS_OUTPUT.PUT_LINE(DBMS_SQLTUNE.REPORT_TUNING_TASK(task_id=>task_id));END;/-- 原查询(索引失效)SELECT*FROMcustWHEREUPPER(last_name)='STARK';-- 创建基于函数的索引CREATEINDEXcust_idx_upper_lastnameONcust(UPPER(last_name));(a,b),查询仅用b列,需调整索引顺序或创建单独索引。DBMS_STATS.GATHER_TABLE_STATS更新统计信息。-- 监控索引是否被使用ALTERINDEXcust_idx_lastname MONITORINGUSAGE;-- 查看监控结果(V$OBJECT_USAGE)SELECTindex_name,usedFROMv$object_usageWHEREindex_name='CUST_IDX_LASTNAME';-- 删除无用索引(确认无依赖后)DROPINDEXcust_idx_lastname;-- 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.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_id=d_customers.d_customer_idLOCAL;-- 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(ownname=>'USER',tabname=>'CUST',cascade=>TRUE,-- 级联收集索引统计method_opt=>'FOR ALL COLUMNS SIZE AUTO');-- 2. 单独收集索引统计信息EXECDBMS_STATS.GATHER_INDEX_STATS(ownname=>'USER',indexname=>'IDX_CUST_LASTNAME');-- 3. 收集基于函数的索引统计(含隐藏虚拟列)EXECDBMS_STATS.GATHER_TABLE_STATS(ownname=>'USER',tabname=>'CUST',method_opt=>'FOR 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_indexes=TRUE;-- 1. 监控索引是否被使用ALTERINDEXidx_cust_lastname MONITORINGUSAGE;-- 2. 查看索引监控结果(V$OBJECT_USAGE)SELECTindex_name,used,monitoringFROMv$object_usageWHEREindex_name='IDX_CUST_LASTNAME';-- 3. 查询索引基本信息(类型、表空间、状态)SELECTindex_name,index_type,tablespace_name,statusFROMuser_indexesWHEREtable_name='CUST';-- 4. 查询分区索引状态SELECTindex_name,partition_name,statusFROMuser_ind_partitionsWHEREindex_name='IDX_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;