57-Oracle SQL Profile(23ai)实操

在上一期中说到了SQL Tuning Advisor其中一个影响对象就是SQL Profile,同样在管理和应用开发中,SQL性能优化是个任重道远的工作,低效的SQL语句让应用响应缓慢,用户整体体验下降,拖垮搞蹦整个系统都有可能。Oracle数据库提供了多种组合工具,有的免费有的是需要许可,系统而全面地解决这些性能问题。SQL自动调优(Automatic SQL Tuning)与SQL Profile是从10g就引入的重要特性,提供解决SQL性能问题强大的支持。

一、SQL是否需要自动调优,什么情况下可以接受自动?

数据库的查询优化器(Optimizer)在执行SQL语句前,会根据统计信息、系统参数等因素生成一个或多个执行计划(Execution Plan),并选择一个它认为当前成本已经是最优的计划来执行。
  • 但是在一些因素的影响下,CBO会受影响出次优或是更差的选择,例如:
  1. 统计信息过时或缺失:当表的数据量、数据分布发生显著变化,而统计信息未能及时更新时,优化器基于旧信息做出的判断可能不再准确。
  2. 复杂的查询结构:对于包含多表连接、子查询、复杂谓词的SQL,优化器估算成本的难度会大大增加。(23ai之后有了机器学习是不是有提升)
  • 原生优化器局限性:优化器模型本身可能无法完美处理所有情况。
  • 传统的解决方法通常是在SQL语句中手动添加提示(Hints),以指导优化器选择特定的场景,但这种方式又降存在这些缺陷:
  1. 侵入式修改:需要修改应用程序代码,对于已封装的商业软件或第三方系统,几乎是不可能的任务,且不可延续。
  2. 维护困难:随着数据和业务需求需求调整和运行环境的变化,也许当前有效的Hint,就在不远的下一次失效甚至产生负面影响。
基于这样的场景和选择,Oracle引入了自动SQL调优机制,提供更智能、非侵入的方式改善SQL执行效率的更优雅的方式。

二、SQL Profile 分类与原理

1. Auto SQL Profile(基于SQL Tuning Advisor)​
本质​:优化器辅助统计信息(如基数校正因子 SCALE_ROWS),动态修正执行计划成本计算。
工作原理​:
  • 分析阶段​:校验统计信息、识别异常访问路径(如缺失索引或全表扫描成本失真)。
  • 生成阶段​:自动创建校正因子(如将表基数从100修正为100万)。
  • 生效机制​:优先使用Profile中的统计信息覆盖默认值,优化器据此重新计算成本。
优点​:
  • 自动化高效​:一键生成,适合批量优化AWR中的高频低效SQL。
  • 动态适应​:随数据变化自动调整,避免计划固化(如新增索引时自动启用)。
  • 低风险​:内置成本对比验证,规避极端路径(如不会强制禁用所有索引)。
缺点​:
  • 优化局限​:无法突破优化器规则(如不能强制嵌套循环替代哈希连接)。
  • 环境依赖​:严重依赖当前统计信息,跨环境迁移(测试→生产)可能失效。
  • 黑盒操作​:修正逻辑存储在隐藏表 SQLPROF$,问题追溯困难。
2. 手工SQL Profile
本质​:Hint组合(从目标执行计划提取Outline Data),强制锁定执行路径。
核心原理​:
  1. 提取原始SQL的Outline Data。
  2. 通过Hint改写SQL生成目标Outline Data。
  3. 将脚改写的带有Hint的替换原始的版本,生成最终Profile。
优点​:
  • 精准控制​:绕过优化器决策,强制固定最优路径(如索引扫描、连接顺序)。
  • 优先级碾压​:覆盖SQL中的硬编码Hint(如 /*+ FULL(T) */ 无效)。
  • 灵活生效​:通过 CATEGORY 按会话/环境隔离(如测试环境用 DEV 类别、生产用PROD)。
缺点​:
  • 技术门槛高​:需深入理解成本模型,错误设置引发性能恶化(如基数误判导致笛卡尔积)。
  • 维护成本大​:表结构变更(如索引删除)需人工重新验证Profile有效性。
  • 过优化风险​:强制计划可能失效(如索引失效仍强制扫描,引发全表扫描被禁用)。

三. 实操演示:23 ai上HR.T4SQLPROFILE 表实验​

​步骤1:创建测试环境 
SYS@CDB$ROOT> alter session set container=FREEPDB1;
-- 建表并模拟插入不均衡数据
CREATE TABLE HR.T4SQLPROFILE AS 
SELECT * FROM DBA_OBJECTS WHERE ROWNUM <= 10000;

INSERT INTO HR.T4SQLPROFILE 
SELECT * FROM DBA_OBJECTS 
WHERE object_id = 100 AND ROWNUM <= 9000;  -- 90% 数据集中

CREATE INDEX HR.IDX_T4SQLPROFILE ON HR.T4SQLPROFILE(object_id);

-- 收集统计信息
BEGIN
  DBMS_STATS.GATHER_TABLE_STATS('HR','T4SQLPROFILE');
END;
/
--PL/SQL procedure successfully completed.
步骤2:自动 Profile 实验

官方文档DBMS_SQLTUNE.ACCEPT_SQL_PROFILE 的 FORCE_MATCH 参数默认值为 FALSE,即必须在 SQL 文本完全匹配时应用 SQL Profile才会被使用,若目标 SQL 文本有改动即使是where 后面的字句查询不一致,原有 SQL Profile 就失效。。所以必须设置“DBMS_SQLTUNE.ACCEPT_SQL_PROFILE(task_name, force_match=>TRUE);”

-- 低效全表扫描(因 NO_INDEX Hint)
SELECT /*+ NO_INDEX(T) */ * FROM HR.T4SQLPROFILE T WHERE object_id=10;

-- 创建调优任务并接受 Profile
DECLARE
  task_name VARCHAR2(50);
BEGIN
  task_name := DBMS_SQLTUNE.CREATE_TUNING_TASK(
    sql_text    => 'SELECT /*+ NO_INDEX(T) */ * FROM HR.T4SQLPROFILE T WHERE object_id=10',
    scope       => 'COMPREHENSIVE',
    task_name   => 'AUTO_TUNE_TASK'
  );
  DBMS_SQLTUNE.EXECUTE_TUNING_TASK(task_name);
  DBMS_SQLTUNE.ACCEPT_SQL_PROFILE(task_name, force_match=>TRUE);
END;
/

-- 验证:计划转为索引扫描
--验证SQL Profile被接受,同时查询走index
SELECT * FROM HR.T4SQLPROFILE WHERE object_id=10; 
--
SYS@CDB$ROOT> SELECT * FROM HR.T4SQLPROFILE WHERE object_id=10;
SYS      C_USER#     10                10 CLUSTER        24-APR-25    
--
SYS@CDB$ROOT> SET AUTOTRACE ON
Autotrace TraceOnly
 Exhibits the performance statistics with silent query output
SELECT * FROM HR.T4SQLPROFILE WHERE object_id=20;
SYS@CDB$ROOT> SELECT * FROM HR.T4SQLPROFILE WHERE object_id=20;

1 row selected.

SQL_ID  cy30yj4480y2q, child number 0
-------------------------------------
SELECT * FROM HR.T4SQLPROFILE WHERE object_id=20

Plan hash value: 2117281514

-------------------------------------------------------------------------
| Id  | Operation                           | Name             | E-Rows |
-------------------------------------------------------------------------
|   0 | SELECT STATEMENT                    |                  |        |
|   1 |  TABLE ACCESS BY INDEX ROWID BATCHED| T4SQLPROFILE     |      1 |
|*  2 |   INDEX RANGE SCAN                  | IDX_T4SQLPROFILE |      1 |
-------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   2 - access("OBJECT_ID"=20)

Note
-----
   - Warning: basic plan statistics not available. These are only collected when:
       * hint 'gather_plan_statistics' is used for the statement or
       * parameter 'statistics_level' is set to 'ALL', at session or system level


Statistics
-----------------------------------------------------------
               1  CPU used by this session
               1  CPU used when call started
               5  Requests to/from client
               4  SQL*Net roundtrips to/from client
               4  buffer is not pinned count
             944  bytes received via SQL*Net from client
           67782  bytes sent via SQL*Net to client
               5  calls to get snapshot scn: kcmgss
               2  calls to kcmgcs
               4  consistent gets
               1  consistent gets examination
               1  consistent gets examination (fastpath)
               4  consistent gets from cache
               3  consistent gets pin
               3  consistent gets pin (fastpath)
               1  enqueue releases
               1  enqueue requests
               2  execute count
               1  index range scans
           32768  logical read bytes from cache
               3  no work - consistent read gets
              10  non-idle wait count
               2  opened cursors cumulative
               1  opened cursors current
               1  parse count (hard)
               2  parse count (total)
             169  process last non-idle time
               1  recursive calls
               4  session logical reads
               1  sorts (memory)
            1620  sorts (rows)
               1  table fetch by rowid
               5  user calls
SYS@CDB$ROOT>

四、 SQL Profile 管理指南​

​常用操作

​操作​

命令/视图

​查看 Profile​

SELECT name, category, status FROM dba_sql_profiles;

​禁用/启用

DBMS_SQLTUNE.ALTER_SQL_PROFILE(name=>'PROF1', attribute_name=>'STATUS', value=>'DISABLED');

​删除 Profile

DBMS_SQLTUNE.DROP_SQL_PROFILE('PROF1');

​迁移 Profile​

使用DBMS_SQLTUNE.PACK_STGTAB_SQLPROF导出导入

关键管理场景
  • 环境隔离​:通过 CATEGORY 控制 Profile 生效范围(如测试环境用 DEV ,生产用PROD)。
  • 版本升级​:使用数据泵导出 SQLPROF$ 表实现跨版本迁移。
  • 性能监控​:结合 AWR 报告检查 SQL Profile 的使用效果。
 管理SQL Profile
-- 查看所有 Profile
SELECT name, category, status, sql_text 
FROM dba_sql_profiles;
--
SYS@CDB$ROOT> SELECT name, category, status, sql_text FROM dba_sql_profiles;
SYS_SQLPROF_0197914a1f230000    DEFAULT     ENABLED    SELECT /*+ NO_INDEX(T) */ * FROM HR.T4SQLPROFILE T WHERE object_id=10


-- 禁用/启用 Profile
BEGIN
  DBMS_SQLTUNE.ALTER_SQL_PROFILE(
    name           => 'SYS_SQLPROF_0197914a1f230000',
    attribute_name => 'STATUS',
    value          => 'DISABLED'  -- 或 'ENABLED'
  );
END;
/

-- 删除 Profile
EXEC DBMS_SQLTUNE.DROP_SQL_PROFILE('SYS_SQLPROF_0197914a1f230000');

五、使用体验​

  1. 自动 Profile​ 适合解决统计信息不准导致的偶发性性能问题,动态适应数据变化。
  2. 手动 Profile​ 用于锁定最优计划,尤其适合关键业务 SQL 或第三方系统不可改源码的场景。
  3. 最佳实践​:
  • 优先尝试自动 Profile
  • 对核心事务 SQL 使用手动 Profile 强控计划
  • 通过 force_match 和 category 提升灵活性和安全性
<think>好的,用户想要了解Oracle 23AI数据库的安装教程。首先,我需要确认Oracle 23AI是不是最新的版本,可能是指Oracle Database 23c,因为AI可能指的是其中集成的AI功能。目前Oracle的最新长期支持版本是19c,而23c可能还在预览或者测试阶段,所以需要用户确认是否有官方发布的正式版本。 接下来,我需要回忆一下Oracle数据库安装的一般步骤,包括系统要求、预安装配置、下载安装包、运行安装程序、进行后期配置等。由于不同版本的Oracle安装步骤可能会有差异,特别是新版本可能会有新的依赖或配置要求,所以需要查找官方文档来确认具体的步骤。 另外,用户提到的“AI数据库”可能是指Oracle Database 23c中新增的AI相关功能,比如机器学习、自动化管理等。在安装过程中,可能需要特别注意这些组件的安装选项。 还需要考虑用户的系统环境,比如是Linux还是Windows,不同的操作系统安装步骤不同。假设用户使用的是Linux,因为大多数Oracle数据库部署在Linux服务器上。常见的预安装步骤包括创建Oracle用户和组、配置内核参数、设置环境变量、创建必要的目录结构等。 然后,安装过程中可能需要使用Oracle Universal Installer (OUI),或者是新的安装工具。需要指导用户如何运行安装程序,选择正确的选项,比如企业版、标准版,以及是否安装可选组件。 安装完成后,还需要进行数据库的创建和配置,比如使用DBCA(Database Configuration Assistant)创建数据库实例,配置监听器等网络设置。此外,可能需要安装后的验证步骤,确保数据库服务正常运行,能够连接和操作。 同时,需要注意权限问题,比如使用root用户执行部分脚本,以及设置Oracle用户的环境变量是否正确。另外,防火墙和SELinux的设置可能会影响数据库的访问,需要指导用户进行相应的配置。 最后,可能还需要提供一些常见问题的解决方法,比如安装过程中出现的依赖缺失、权限错误、端口冲突等,帮助用户排查问题。 总结下来,需要分步骤详细说明安装前的准备工作、安装过程的具体操作、安装后的配置和验证,同时提醒用户注意版本兼容性和系统要求,并参考官方文档获取最新信息。</think>以下为Oracle Database 23c(集成AI功能版本)的安装教程,基于Linux系统环境(建议使用Oracle Linux 8/9或RHEL 8/9)。请注意:截至2024年7月,23c仍处于预览阶段,正式版请以官网发布为准。 --- ### **一、安装前准备** #### 1. 系统要求 - **内存**:最小8GB(推荐16GB+) - **磁盘空间**:安装目录至少25GB,`/tmp`需2GB - **内核参数**: ```bash # 编辑/etc/sysctl.conf fs.aio-max-nr = 1048576 fs.file-max = 6815744 kernel.shmall = 4294967296 kernel.shmmax = 68719476736 kernel.shmmni = 4096 kernel.sem = 250 32000 100 128 net.ipv4.ip_local_port_range = 9000 65500 net.core.rmem_default = 262144 net.core.wmem_default = 262144 net.core.rmem_max = 4194304 net.core.wmem_max = 1048576 ``` 执行 `sysctl -p` 生效 #### 2. 创建用户和组 ```bash groupadd oinstall groupadd dba useradd -g oinstall -G dba oracle passwd oracle ``` #### 3. 配置环境变量 ```bash # 编辑 ~oracle/.bash_profile export ORACLE_BASE=/u01/app/oracle export ORACLE_HOME=$ORACLE_BASE/product/23c/dbhome_1 export PATH=$PATH:$ORACLE_HOME/bin export LD_LIBRARY_PATH=$ORACLE_HOME/lib:/usr/lib ``` --- ### **二、安装步骤** #### 1. 下载安装包 从[Oracle官网](https://www.oracle.com/database/technologies/)下载: - `LINUX.X64_233000_db_home.zip` - Preinstall RPM包(可选) #### 2. 解压安装文件 ```bash mkdir -p $ORACLE_HOME unzip LINUX.X64_233000_db_home.zip -d $ORACLE_HOME ``` #### 3. 运行安装程序 ```bash cd $ORACLE_HOME ./runInstaller ``` #### 4. 图形界面配置 1. 选择 **仅安装数据库软件** 2. 设置安装路径为 `$ORACLE_HOME` 3. 选择 **单实例数据库安装** 4. 忽略先决条件检查(可选) 5. 完成安装后,以root身份执行: ```bash /u01/app/oraInventory/orainstRoot.sh /u01/app/oracle/product/23c/dbhome_1/root.sh ``` --- ### **三、创建数据库** #### 1. 使用DBCA ```bash dbca -silent \ -createDatabase \ -templateName General_Purpose.dbc \ -gdbname ORCL23AI \ -sid ORCL23AI \ -characterSet AL32UTF8 \ -automaticMemoryManagement false \ -totalMemory 4096 \ -emConfiguration NONE \ -datafileDestination /u01/app/oracle/oradata \ -enableArchive false ``` #### 2. 验证AI功能 ```sql -- 连接数据库 sqlplus / as sysdba -- 检查AI组件 SELECT comp_name, version FROM dba_registry WHERE comp_name LIKE '%Machine Learning%'; ``` --- ### **四、常见问题** 1. **缺少依赖包**: 使用yum安装: ```bash yum install -y libnsl libaio sysstat elfutils-libelf-devel ``` 2. **监听器启动失败**: 检查端口1521是否被占用,执行: ```bash netstat -tuln | grep 1521 lsnrctl start ``` --- ### **五、注意事项** - AI功能可能需要额外授权 - 建议关闭SELinux和防火墙(生产环境需谨慎) - 详细文档参考:[Oracle 23c官方指南](https://docs.oracle.com/en/database/oracle/oracle-database/23/index.html) > 提示:测试环境可使用Oracle Container Registry中的Docker镜像快速部署: > ```bash > docker run -d --name orcl23ai \ > -p 1521:1521 -p 5500:5500 \ > container-registry.oracle.com/database/free:23.3.0.0 > ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值