提升ORACLE性能:深入理解dbms_stats及其关键指令

需积分: 10 5 下载量 178 浏览量 更新于2024-09-14 收藏 35KB DOCX 举报
Oracle数据库管理系统(DBMS)中的dbms_stats工具是一个强大的辅助工具,用于优化查询性能和提升SQL执行计划的质量。它通过收集和更新数据库表的统计信息,帮助Oracle的代价为基础的SQL优化器(Cost-Based Optimizer, CBO)做出更精确的选择,尤其是在处理大型分区表时。本文将详细介绍dbms_stats的基本操作和关键参数。 首先,我们来看`exec dbms_stats.gather_schema_stats`这一核心命令。这个函数用于对指定模式(Schema)下的表进行统计信息的收集,参数`ownname`指定了模式名,这里是`SCOTT`。`options`参数是关键,它控制了统计刷新的方式: - `GATHER`: 完全重新分析整个模式中的所有表。 - `GATHEREMPTY`: 只分析那些尚未被统计过的表。 - `GATHERSTALE`: 只重新分析最近有超过10%数据变动的表,如插入、更新和删除操作。 - `GATHERAUTO`: 同时处理未统计对象和统计信息已过期(即“脏”的)的对象,类似于`GATHERSTALE`和`GATHEREMPTY`的结合。 `degree`参数表示采样度,15在此处代表的是15次重复的列大小统计,这有助于提高统计的准确性。 `estimate_percent`参数是一个新特性,允许dbms_stats根据表的特性自动选择采样百分比,通过设置为`dbms_stats.auto_sample_size`来启用。Oracle会选择5%到20%之间的比例,以平衡采样效率与统计质量。检查`dba_tables.sample_size`列可以验证自动采样的准确性,因为高质量的统计信息能确保CBO做出更明智的决策。 当使用`gatherauto`或`gatherstale`选项时,Oracle会启用监视功能,通过`alter table`命令加上`monitoring`选项,然后使用`dba_tab_modifications`视图来追踪表的变化,以便确定何时需要重新收集统计信息。 理解并灵活运用dbms_stats的这些选项对于优化数据库性能至关重要。通过适当的参数配置,dbms_stats可以帮助管理员高效地维护表的统计信息,从而提升SQL查询的执行效率和整体数据库管理的效率。在实际操作中,应根据数据库的特定需求和表的更新频率,选择最合适的统计刷新策略。

grant execute on dbms_crypto to system; declare input_string VARCHAR2 (200) := 'Secret Message'; output_string VARCHAR2(2000); encrypted_raw RAW(2000); decrypted_raw RAW(2000); num_key_bytes NUMBER := 256/8; key_bytes_raw RAW(32); encryption_type PLS_INTEGER := DBMS_CRYPTO.ENCRYPT_AES256 + DBMS_CRYPTO.CHAIN_CBC + DBMS_CRYPTO.PAD_PKCS5; begin DBMS_OUTPUT.PUT_LINE(input_string); key_bytes_raw := DBMS_CRYPTO.RANDOMBYTES(num_key_bytes); encrypted_raw := DBMS_CRYPTO.ENCRYPT ( src => UTL_I18N.STRING_TO_RAW(input_string, 'AL32UTF8'), typ => encryption_type, key => key_bytes_raw ); decrypted_raw := DBMS_CRYPTO.DECRYPT ( src => encrypted_raw, typ => encryption_type, key => key_bytes_raw ); output_string := UTL_I18N.RAW_TO_CHAR(decrypted_raw, 'AL32UTF8'); DBMS_OUTPUT.PUT_LINE(output_string); end; declare l_src_data varchar2(20); l_type pls_integer :=DBMS_CRYPTO.ENCRYPT_AES128 + DBMS_CRYPTO.CHAIN_CBC + DBMS_CRYPTO.PAD_PKCS5; l_key varchar2(20) :='0123456789123456'; l_encval raw(2000); CURSOR secret_cursor IS select phonenumber from customer; begin OPEN secret_cursor; LOOP FETCH secret_cursor INTO l_src_data; l_encval :=dbms_crypto.encrypt( src=>utl_i18n.string_to_raw(l_src_data,'AL32UTF8'), typ=>l_type, key=>utl_i18n.string_to_raw(l_key,'AL32UTF8')); DBMS_OUTPUT.PUT_LINE (l_encval); EXIT WHEN secret_cursor%NOTFOUND; END LOOP; CLOSE secret_cursor; end; declare ;_src_data row(100) :=hextoraw("190248129038903853275ijdkvjkad'); l_type pls_integer :=dbms_crypto.encrypt_aes128+ + DBMS_CRYPTO.CHAIN_CBC + DBMS_CRYPTO.PAD_PKCS5; l_key varchar2(20) :='0123456789123456'; l_decval raw(200); begin l_decval :=dbms_crypto.decrypt( src=>l_src_data, typ=>l_type, key=>utl_i18n.string_to_raw(l_key,'AL32UTF8')); end; SELECT Price FROM PRODUCT WHERE ProductID = 5;修正这一段代码

2023-05-26 上传

grant execute on dbms_crypto to system; -- 第一个代码块 declare input_string VARCHAR2 (200) := 'Secret Message'; output_string VARCHAR2(2000); encrypted_raw RAW(2000); decrypted_raw RAW(2000); num_key_bytes NUMBER := 256/8; key_bytes_raw RAW(32); encryption_type PLS_INTEGER := DBMS_CRYPTO.ENCRYPT_AES256 + DBMS_CRYPTO.CHAIN_CBC + DBMS_CRYPTO.PAD_PKCS5; begin DBMS_OUTPUT.PUT_LINE(input_string); key_bytes_raw := DBMS_CRYPTO.RANDOMBYTES(num_key_bytes); encrypted_raw := DBMS_CRYPTO.ENCRYPT(src => UTL_I18N.STRING_TO_RAW(input_string, 'AL32UTF8'), typ => encryption_type, key => key_bytes_raw); decrypted_raw := DBMS_CRYPTO.DECRYPT(src => encrypted_raw, typ => encryption_type, key => key_bytes_raw); output_string := UTL_I18N.RAW_TO_CHAR(decrypted_raw, 'AL32UTF8'); DBMS_OUTPUT.PUT_LINE(output_string); end; -- 第二个代码块 declare l_src_data varchar2(20); l_type pls_integer := DBMS_CRYPTO.ENCRYPT_AES128 + DBMS_CRYPTO.CHAIN_CBC + DBMS_CRYPTO.PAD_PKCS5; l_key varchar2(20) := '0123456789123456'; l_encval raw(2000); cursor secret_cursor is select phonenumber from customer; begin open secret_cursor; loop fetch secret_cursor into l_src_data; exit when secret_cursor%notfound; l_encval := dbms_crypto.encrypt(src => utl_i18n.string_to_raw(l_src_data,'AL32UTF8'), typ => l_type, key => utl_i18n.string_to_raw(l_key,'AL32UTF8')); dbms_output.put_line(l_encval); end loop; close secret_cursor; end; -- 第三个代码块 declare l_src_data raw(100) := hextoraw('190248129038903853275ijdkvjkad'); l_type pls_integer := DBMS_CRYPTO.ENCRYPT_AES128 + DBMS_CRYPTO.CHAIN_CBC + DBMS_CRYPTO.PAD_PKCS5; l_key varchar2(20) := '0123456789123456'; l_decval raw(200); begin l_decval := dbms_crypto.decrypt(src => l_src_data, typ => l_type, key => utl_i18n.string_to_raw(l_key,'AL32UTF8')); end; -- SQL 查询语句 SELECT Price FROM PRODUCT WHERE ProductID = 5;declare * ERROR at line 18: ORA-06550: line 18, column 1: PLS-00103: Encountered the symbol "DECLARE"报错

2023-05-26 上传