“ORA-00955: 名称已由现有对象使用” 这个错误是怎么回事?

adventurous 2011-08-18 10:52:19
我在oracle数据库中用如下语句进行建表操作,然后弹出如题目的错误框信息“ORA-00955: 名称已由现有对象使用”,该怎么解决?
create table students (student_id number constraint pk_student primary key, student_name varchar2(10) not null,
subject varchar2(20), score number constraint chk_score check (score between 0 and 100) not null)

...全文
95694 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
shu35 2012-03-06
  • 打赏
  • 举报
回复 1
创建表时,如果报ORA-00955名称已由现有对象使用
但select时候,又查不到。
还有可能。同义词重名了。
在Synonyms(Oracle数据库,PL/SQL Developer 工具)条目下。 查看是否存在同义词。
有的话将同义词删除就可以了。
bijanen19861113 2011-08-19
  • 打赏
  • 举报
回复
提示有已使用的,肯定是重名啦,仔细检查出来就好,机器是不会骗人的,呵呵
chenxiaoVSyinqiuli 2011-08-19
  • 打赏
  • 举报
回复
不一定是表重名,也可能keys的name呀,checks的name呀,indexes的name呀。这些貌似都不能重名
adventurous 2011-08-18
  • 打赏
  • 举报
回复
真是奇怪!我把以前创建的表student(和现在相差一个字母s)删除,就可以插入了,不知道是为什么
adventurous 2011-08-18
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 cbxjj 的回复:]

你这个sql在我本机创建一个问题都没有
你先drop table students;
删掉再建试试
[/Quote]
执行后显示表或视图不存在
adventurous 2011-08-18
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 softroad 的回复:]

select table_name from user_tables where table_name = 'STUDENTS';
区分大小写不,要不直接先delete table students
[/Quote]
显示ORA-00903:表名无效
剑神一笑 2011-08-18
  • 打赏
  • 举报
回复
你这个sql在我本机创建一个问题都没有
你先drop table students;
删掉再建试试
softroad 2011-08-18
  • 打赏
  • 举报
回复
select table_name from user_tables where table_name = 'STUDENTS';
区分大小写不,要不直接先delete table students
adventurous 2011-08-18
  • 打赏
  • 举报
回复
我上网搜了下好像是说我有重名的列,但我用如下语句搜过后是没有的
select table_name from user_tables where table_name = 'STUDENTS';
Oracle9i初始化参数中文说明 Blank_trimming: 说明: 如果值为TRUE, 即使源长度比目标长度 (SQL92 兼容) 更长, 也允许分配数据。 值范围: TRUE | FALSE 默认值: FALSE serializable: 说明: 确定查询是否获取表级的读取锁, 以防止在包含该查询的事务处理被提交之前更新任何对象读取。这种操作模式提供可重复的读取, 并确保在同一事务处理种对相同数据的两次查询看到的是相同的值。 值范围: TRUE | FALSE 默认值: FALSE row_locking: 说明: 指定在表已更新或正在更新时是否获取行锁。如果设置为 ALWAYS, 只有在表被更新后才获取行锁。如果设置为 INTENT, 只有行锁将用于SELECT FOR UPDATE, 但在更新时将获取表锁。 值范围: ALWAYS | DEFAULT | INTENT 默认值: ALWAYS shared_servers 说明 : 指定在启动例程后, 要为共享服务器环境创建的服务器进程的数量。 值范围: 根据操作系统而定。 默认值 : 1 circuits: 说明 : 指定可用于入站和出站网络会话的虚拟电路总数。 该参数是构成某个例程的总 SGA 要求的若干参数之一。 默认值 : 派生: SESSIONS 参数的值 (如果正在使用共享服务器体系结构); 否则为 0。 Mts_multiple_listeners: 说明: 指定多个监听程序的地址是分别指定的, 还是用一个 ADDRESS_LIST 字符串指定。如果该值为 TRUE, MTS_LISTENER_ADDRESS 参数可被指定为: (ADDRESS_LIST=(ADDRESS=(PROTOCOL=tcp)(PORT=5000)(HOST=zeus)) (ADDRESS=(PROTOCOL=decnet)(OBJECT=outa)(NODE=zeus)) 此参数在 8.1.3 版中已废弃。 值范围: TRUE | FALSE 默认值: FALSE mts_servers: 说明 : 指定在启动例程后, 要为共享服务器环境创建的服务器进程的数量。 值范围: 根据操作系统而定。 默认值 : 1 mts_service: 说明 : 一个共享服务器参数, 用于指定已在调度程序上注册, 用来建立数据库连接的唯一服务名。如果要在没有调度程序的情况下仍能连接到数据库, 请将该值设置为与例程名相同。此参数自 8.1.3 版起已废弃。 值范围: 根据操作系统而定。 默认值 :0 mts_sessions: 说明 : 指定允许的共享服务器体系结构用户会话的总数。设置此参数可为专用服务器保留一些用户会话。 值范围: 0 到 SESSIONS - 5 默认值 : 派生: MTS_CIRCUITS 和 SESSIONS - 5 两者中的较小值 shared_server_sessions: 说明 : 指定允许的共享服务器体系结构用户会话的总数。设置此参数可为专用服务器保留一些用户会话。 值范围: 0 到 SESSIONS - 5 默认值 : 派生: MTS_CIRCUITS 和 SESSIONS - 5 两者中的较小值 mts_max_dispatchers 说明 : 指定在一个共享服务器环境中可同时运行的调度程序进程的最大数量。 值范围: 根据操作系统而定。 默认值 : 如果已配置了调度程序, 则默认值为大于 5 的任何数目或配置的调度程序的数目 mts_max_servers: 说明 : 指定在一个共享服务器环境中可同时运行的共享服务器进程的最大数量。 值范围: 根据操作系统而定。 默认值 : 20 dispatchers: 说明 : 为设置使用共享服务器的共享环境而设置调度程序的数量和类型。可以为该参数指定几个选项。有关详细信息, 请参阅“Oracle8i 管理员指南”和“Oracle Net Administrator's Guide”。这是字符串值的一个示例: '(PROTOCOL=TCP)(DISPATCHERS=3)'。 值范围: 参数的有效指定值。 默认值 : NULL max_shared_servers: 说明 : 指定在一个共享服务器环境中可同时运行的共享服务器进程的最大数量。 值范围: 根据操作系统而定。 默认值 : 20 mts_circuits: 说明 : 指定可用于入站和出站网络会话的虚拟电路总数。 该参数是构成某个例程的总 SGA 要求的若干参数之一。 默认值 : 派生: SESSIONS 参数的值 (如果正在使用共享服务器体系结构); 否则为 0。 Mts_listener_address: 说明 : 指定共享服务器的监听程序配置。监听程序进程需要一个监听地址, 以便处理系统所用的各个网络协议的连接请求。 除非 MTS_MULTIPLE_LISTENERS=TRUE, 否则每个条目都必须有一个独立的相邻值。此参数自 8.1.3 版起已废弃 语法 : (ADDRESS=(PROTOCOL=tcp)(HOST=myhost)(PORT=7002)) 默认值 : NULL mts_dispatchers: 说明 : 为设置使用共享服务器的共享环境而设置调度程序的数量和类型。可以为该参数指定几个选项。有关详细信息, 请参阅“Oracle8i 管理员指南”和“Oracle Net Administrator's Guide”。这是字符串值的一个示例: '(PROTOCOL=TCP)(DISPATCHERS=3)'。 值范围: 参数的有效指定值。 默认值 : NULL max_dispatchers: 说明 : 指定在一个共享服务器环境中可同时运行的调度程序进程的最大数量。 值范围: 根据操作系统而定。 默认值 : 如果已配置了调度程序, 则默认值为大于 5 的任何数目或配置的调度程序的数目 nls_nchar_conv_excp: 说明: (如果值为 TRUE) 当在隐式转换中丢失数据时返回错误的参数。 值范围: FALSE | TRUE 默认值: TRUE nls_numeric_characters: 说明: 指定将用作组分隔符和小数位的字符。组分隔符就是用来分隔整数位组 (如千, 百万等等) 的字符。小数分隔符用来将一个数字的整数部分与小数部分分隔开。其格式是 。 值范围: 任何单字节字符, '+', '-', '<', '>' 除外。 默认值: 从 NLS_TERRITORY 中获得 nls_sort: 说明: 指定 ORDER BY 查询的比较顺序。对于二进制排序, ORDER BY 查询的比较顺序是以数值为基础的。对于语言排序, 则需要进行全表扫描, 以便将数据按照所定义的语言排序进行整理。 值范围: BINARY 或有效的语言定义名。 默认值: 从 NLS_LANGUAGE 中获得 nls_territory: 说明: 为以下各项指定命名约定, 包括日期和星期的编号, 默认日期格式, 默认小数点字符和组分隔符, 以及默认的 ISO 和本地货币符号。可支持的区域包括美国, 法国和日本。有关所有区域的信息, 请参阅 Oracle8i National Language Support Guide。 值范围: 任何有效的地区名。 默认值: 根据操作系统而定 nls_timestamp_format: 说明: 与 NLS_TIME_FORMAT 相似, 只不过它设置的是 TIMESTAMP 数据类型的默认值, 该数据类型既存储YEAR, MONTH 和 DAY 这几个日期值, 也存储 HOUR, MINUTE 和 SECOND 这几个时间值。 语法: TIMESTAMP '1997-01-31 09:26:50.10' (将值存储为 11 个字节)。 默认值: 从 NLS_TERRITORY 中获得 nls_time_format: 说明: 指定一个字符串值, 设置 TIME 数据类型的默认值, 该数据类型包含 HOUR, MINUTE 和 SECOND 这几个日期时间字段。 语法: TIME '09:26:50' (将值存储为 7 个字节)。 默认值: 从 NLS_TERRITORY 中获得 nls_time_tz_format: 说明: 指定一对值 (UTC,TZD), 设置 TIME WITH TIME ZONE 数据类型的默认值, 该数据类型包含 HOUR, MINUTE, SECOND, TIMEZONE_HOUR 和 TIMEZONE_MINUTE 这几个日期时间字段。UTC 是世界时而 TZD 是当地时区。 语法: TIME '09:26:50.20+ 02:00' (将值存储为 9 个字节)。 默认值: 从 NLS_TERRITORY 中获得 nls_length_semantics: 说明: 使用字节或码点语义来指定新列的创建, 如 char, varchar2, clob, nchar, nvarchar2, nclob 列。各种字符集对字符都有各自的定义。在客户机和服务器上使用同一字符集时, 应以该字符集所定义的字符来衡量字符串。现有的列将不受影响。 值范围: BYTE 或 CHAR。 默认值: nls_length_semantics 的数据库字符集的字符所使用的度量单位。BYTE。 nls_date_format: 说明: 指定与 TO_CHAR 和 TO_DATE 函数一同使用的默认日期格式。该参数的默认值由 NLS_TERRITORY 确定。该参数的值可以是包含在双引号内的任何有效的日期格式掩码。例如: ''MMM/DD/YYYY''。 值范围: 任何有效的日期格式掩码, 但不得超过一个固定长度。 默认值: 派生 nls_timestamp_tz_format: 说明: 与 NLS_TIME_TZ_FORMAT 相似, 其中的一对值指定 TIMESTAMP 数据类型的默认值, 该类型除存储 YEAR, MONTH 和 DAY 日期值, HOUR, MINUTE 和 SECOND 时间值, 还存储 TIMEZONE_HOUR 和 TIMEZONE_MINUTE。 语法: TIMESTAMP '1997- 01- 31 09:26:50+ 02:00' (将值存储为 13 个字节)。 默认值: 从 NLS_TERRITORY 中获得 nls_language: 说明: 指定数据库的默认语言, 该语言将用于消息, 日期和月份名, AD, BC, AM 和 PM 的符号, 以及默认的排序机制。可支持的语言包括英语, 法语和日语等等。 值范围: 任何有效的语言名。 默认值: 根据操作系统而定 nls_comp: 说明: 在 SQL 语句中, 应避免使用繁琐的 NLS_SORT 进程。正常情况下, WHERE 子句中进行的比较是二进制的, 但语言比较则需要 NLSSORT 函数。可以使用 NLS_COMP 指定必须根据NLS_SORT 会话参数进行语言比较。 值范围: Oracle8i National Language Support Guide 中指定的任何有效的10 字节字符串。 默认值: BINARY nls_currency: 说明: 为 L 数字格式元素指定用作本地货币符号的字符串。该参数的默认值由 NLS_TERRITORY 确定。 值范围: Oracle8i National Language Support Guide 中指定的任何有效的10 字节字符串。 默认值: 从 NLS_TERRITORY 中获得 nls_date_language: 说明: 指定拼写日期名, 月名和日期缩写词 (AM, PM, AD, BC) 的语言。该参数的默认值是由 NLS_LANGUAGE指定的语言。 值范围: 任何有效的 NLS_LANGUAGE 值。 默认值: NLS_LANGUAGE 的值 nls_dual_currency: 说明: 用于覆盖 NLS_TERRITORY 中定义的默认双重货币符号。如果不设置该参数, 就会使用默认的双重货币符号; 否则就会启动一个值为双重货币符号的新会话。 值范围: 任何有效的格式名。。 默认值: 双重货币符号 nls_iso_currency: 说明: 为 C 数字格式元素指定用作国际货币符号的字符串。该参数的默认值由 NLS_TERRITORY 确定。 值范围: 任何有效的 NLS_TERRITORY 值。 默认值: 从 NLS_TERRITORY 中获得 nls_calendar: 说明: 指定 Oracle 使用哪种日历系统作为日期格式。例如, 如果 NLS_CALENDAR 设置为 'Japanese Imperial', 那么日期格式为 'E YY-MM-DD'。即: 如果日期是 1997 年 5 月 15 日, 那么 SYSDATE 显示为 'H 09-05-15'。 值范围: Arabic Hijrah, English Hijrah, Gregorian, Japanese Imperial, Persian, ROC Official (Republic of China) 和 Thai Buddha。 默认值: Gregorian plsql_native_c_compiler: 说明: 指定用于将生成的 C 文件编译为目标文件的 C 编译程序的完整路径名。此参数是可选的。随每个平台附带的特有的 make 文件中包含此参数的默认值。如果为此参数指定了一个值, 则该值将覆盖 make 文件中的默认值。 值范围: C 编译程序的完整路径。 默认值: 无 remote_dependencies_mode: 说明: 用于指定数据库为远程 PL/SQL 存储的过程处理被依赖对象的方式。如果设置为 TIMESTAMP, 只有在服务器与本地时间戳相匹配的情况下, 才能执行该过程。如果设置为 SIGNATURE, 在签名安全的情况下即可执行该过程。 值范围: TIMESTAMP | SIGNATURE 默认值: TIMESTAMP utl_file_dir: 说明: 允许数据库管理员指定 PL/SQL 文件 I/O 许可的目录。使用多个 UTL_FILE_DIR 参数即可指定多个目录。请注意所有用户均可读取或写入 UTL_FILE_DIR 参数中指定的所有文件。 值范围: 任何有效的目录路径。 默认值: 无 plsql_v2_compatibility: 说明: 设置 PL/SQL 兼容级。如果设置为 FALSE, 将执行 PL/SQL V3 行为, 而不允许 V2 行为; 否则在运行 PL/SQL V3 时将接受某些 PL/SQL V2 行为。 值范围: TRUE | FALSE 默认值: FALSE plsql_native_make_utility: 说明: 指定 make 实用程序 (如 UNIX 中的 make 或 gmake, 即 GNU make) 的完整路径名。要从生成的 C 源中生成共享对象或 DLL, 需要使用 make 实用程序。 值范围: make 实用程序的完整路径名。 默认值: 无 plsql_native_library_dir: 说明: 由 PL/SQL 编译程序使用。它指定目录名, 其中存储了本机编译程序生成的共享对象。 范围值: 目录名。 默认值: 无 plsql_compiler_flags: 说明: 由 PL/SQL 编译程序使用。它将编译程序标志列表指定为一个用逗号分隔的字符串列表。 值范围: native (PL/SQL 模块将按本机代码来编译。), interpreted (然后 PL/SQL 模块将被编译为 PL/SQL 字节代码格式), debug (PL/SQL 模块将用探测调试符号来编译), non_debug。 默认值: " interpreted, non_debug " plsql_native_linker: 说明: 此参数指定链接程序 (如: UNIX 中的 ld, 或用于将目标文件链接到共享对象或 DLL 的 GNU ld) 的完整路径名。此参数是可选的。随每个平台附带的特有的 make 文件中包含此参数的默认值。如果为此参数指定了一个值, 则该值将覆盖 make 文件中的默认值。 值范围: 链接程序的完整路径名。 默认值: 无 plsql_native_make_file_name: 说明: 指定 make 文件的完整路径名。make 实用程序 (由 PLSQL_NATIVE_MAKE_UTILITY 指定) 使用此 make 文件生成共享对象或 DLL。每个平台附带有端口专用的 make 文件, 该文件包含使用 make 实用程序在该平台上生成 DLL 时要遵循的规则。 值范围: make 文件的完整路径名。 默认值: 无 plsql_v2_compatibility: 说明: 设置 PL/SQL 兼容级。如果设置为 FALSE, 将执行 PL/SQL V3 行为, 而不允许 V2 行为; 否则在运行 PL/SQL V3 时将接受某些 PL/SQL V2 行为。 值范围: TRUE | FALSE 默认值: FALSE remote_dependencies_mode: 说明: 用于指定数据库为远程 PL/SQL 存储的过程处理被依赖对象的方式。如果设置为 TIMESTAMP, 只有在服务器与本地时间戳相匹配的情况下, 才能执行该过程。如果设置为 SIGNATURE, 在签名安全的情况下即可执行该过程。 值范围: TIMESTAMP | SIGNATURE 默认值: TIMESTAMP shared_memory_address: 说明: SHARED_MEMORY_ADDRESS 和 HI_SHARED_MEMORY_ADDRESS 指定运行时 SGA 的起始地址。许多平台在链接时间指定 SGA 起始地址, 在这类平台上这些参数将被忽略。如果两个参数都设置为 0 或 NULL, 那么地址将根据平台而定。 值范围: 任何整数值。 默认值: 0 lock_sga: 说明: 用于将整个 SGA 锁定在物理内存中。在不支持这种功能的平台上, 该值将被忽略。 值范围: TRUE | FALSE 默认值: FALSE hi_shared_memory_address: 说明: 指定系统全局区 (SGA) 的运行时起始地址。在指定 SGA 连接时起始地址的平台上, 该值被忽略。在 64 位平台上, 请使用该值来指定高 32 位和低 32 位。如果不指定该值, 默认值是平台指定的位置。 值范围: 任何整数值。 默认值: 0 pre_page_sga: 说明: 一个根据平台而定的参数, 如果该参数为 TRUE, 将把所有 SGA 页装载到内存中, 以便使该例程迅速达到最佳性能状态。这将增加例程启动和用户登录的时间, 但在内存充足的系统上能减少缺页故障的出现。 值范围: TRUE | FALSE 默认值: FALSE sga_max_size: 说明: 指定例程存活期间所占用的系统全局区的最大大小。 值范围: 0 到各操作系统所允许的最大值。请注意, 由于该参数值的最小值在启动时已经调整完毕, 因而它无关紧要。 默认值: 如果未指定值, sga_max_size 的默认值将与启动时 SGA 的最初大小 (比如说 X) 相同。该大小取决于 SGA 中各种池的大小, 如缓冲区高速缓存, 共享池, 大型池等。如果指定的值小于 X, 则所使用的 sga_max_size 的值将为 X。也就是说, 它是 X 与用户指定的 sga_max_size 值两者之间的较大值。 Fast_start_parallel_rollback: 说明: 执行并行回退时确定进程的最大数量。在多数事务处理的运行时间都较长的系统上, 该值很有用。 值范围: FALSE | LOW | HIGH 默认值: LOW (2 * CPU_COUNT) transaction_auditing: 说明: 确定事务处理层是否生成一个特殊的重做记录, 其中包含用户登录名, 用户名, 会话 ID, 部分操作系统信息以及客户机信息。在使用某一重做日志分析工具时, 这些记录可能很有用。 值范围: TRUE | FALSE 默认值: TRUE transactions: 说明: 指定并行事务处理的最大数量。如果将该值设置得较大, 将增加 SGA 的大小, 并可增加例程启动过程中分配的回退段的数量。默认值大于 SESSIONS, 以实现递归事务处理。 值范围: 一个数值。 默认值: 派生 (1.1 * SESSIONS) enqueue_resources: 说明: 入队可使并行进程能够共享资源。例如, Oracle 允许一个进程以共享模式锁定一个表, 以共享更新模式锁定另一个表。 值范围: 10 - 65535 (7.3) 或 10 - 无限制 (8.1)。 默认值: 派生 (该值大于 DML_LOCKS + 20 即已足够) dml_locks: 说明: 所有用户获取的表锁的最大数量。对每个表执行 DML 操作均需要一个 DML 锁。例如, 如果 3 个用户修改 2 个表, 就要求该值为 6。 值范围: 0 或 20 到无限制。 默认值: 4 * TRANSACTIONS (派生) hash_join_enabled: 说明: 如果设置为 TRUE, 优化程序将在计算最有效的联接方法时考虑散列联接。Oracle 建议数据仓库应用程序应使用 TRUE值。 值范围: TRUE | FALSE 默认值: TRUE optimizer_features_enable: 说明: 允许更改 init.ora 参数, 该参数控制着优化程序的行为。受此影响的参数包括 PUSH_JOIN_PREDICATE, FAST_FULL_SCAN_ENABLED, COMPLEX_VIEW_MERGING 和 B_TREE_BITMAP_PLANS。 值范围: 8.0.0; 8.0.3; 8.0.4; 8.1.3。 默认值: 8.0.0 query_rewrite_integrity: 说明: Oracle Server 执行的查询重写的程度。如果设置为 ENFORCED, Oracle 将保证其一致性和完整性。如果设置为 TRUSTED, 将使用明确声明的关系来允许重写。如果设置为 STALE_TOLERATED, 即使实体化视图与基础数据不一致, 也仍可以进行重写。 值范围: ENFORCED, TRUSTED, STALE_TOLERATED 默认值: ENFORCED query_rewrite_enabled 说明: 启用或禁用对实体化视图的查询重写。一个特定实体化视图只在如下条件下启用: 会话参数和单独实体化视图均已启用, 并且基于成本的优化已启用。 值范围: TRUE | FALSE 默认值: FALSE partition_view_enabled: 说明: 如果将 PARTITION_VIEW_ENABLED 设置为 TRUE, 该优化程序将剪除 (或跳过) 分区视图中不必要的表访问。该参数还能更改基于成本的优化程序从基础表统计信息计算分区视图统计信息的方式。 值范围: TRUE | FALSE 默认值: FALSE optimizer_max_permutations: 说明: 对带有大量联接的查询进行语法分析时, 优化程序将会考虑限制表的交换数。这有助于确保对查询进行语法分析的时间保持在可接受的限制范围内, 但代价是无法找到最佳计划。如果该值小于 1000, 就应该可以确保每次查询的时间仅为几秒钟或更短。 值范围: 4-2^32 (~4.3 G)。 默认值: 80,000 optimizer_index_cost_adj: 说明: 在考虑太多或太少索引访问路径的情况下, 可以用来优化优化程序的性能。该值越低, 优化程序越容易选择一个索引。也就是说, 如果将该值设置为 50%, 索引访问路径的成本就是正常情况下的一半。 值范围: 1 -10000 默认值: 100 (一个索引访问路径的常规成本) star_transformation_enabled: 说明: 确定基于成本的查询转换是否将被应用到星型查询中。如果设置为 TRUE, 优化程序将考虑将基于成本的转换应用于星型查询中; 如果设置为 FALSE, 将不使用任何转换; 如果设置为 TEMP_DISABLE, 将考虑查询转换, 但不使用临时表。 值范围: TRUE | FALSE | TEMP_DISABLE 默认值: FALSE optimizer_mode: 说明: 指定优化程序的行为。如果设置为 RULE, 就会使用基于规则的优化程序, 除非查询含有提示。如果设置为 CHOOSE, 就会使用基于成本的优化程序, 除非语句中的表不包含统计信息。ALL_ROWS 或 FIRST_ROWS 始终使用基于成本的优化程序。 值范围: RULE | CHOOSE | FIRST_ROWS | ALL_ROWS 默认值: CHOOSE optimizer_index_caching: 说明: 调整基于成本的优化程序的假定值, 即在缓冲区高速缓存中期望用于嵌套循环联接的索引块的百分比。它将影响使用索引的嵌套循环联接的成本。将该参数设置为一个较高的值, 可以使嵌套循环联接相对于优化程序来说成本更低。 值范围: 0 - 100 %。 默认值: 0 job_queue_processes: 说明: 只用于复制环境。它指定每个例程的 SNP 作业队列进程的数量 (SNP0, ... SNP9, SNPA, ... SNPZ)。要自动更新表快照或执行由 DBMS_JOB 创建的请求, 请将该参数设置为 1 或更大的值。 值范围: 0 到 36 默认值: 0 max_transaction_branches: 说明: 控制分布式事务处理中分支的数量。将 MAX_TRANSACTION_BRANCHES 设置为较低的值, 可以根据 MAX_TRANSACTION_BRANCHES * DISTRIBUTED_TRANSACTIONS * 72 字节, 略微减少共享池的空间量。此参数在 8.1.3 版中已废弃。 值范围: 1 - 32 默认值: 8 compatible: 说明: 允许您使用一个新的发行版, 同时保证与先前版本的向后兼容性。 值范围: 默认为当前发行版。 默认值: 由发行版确定 archive_lag_target: 说明: 此参数与基于时间的线程高级功能相关联。 值范围: 0 或 [60, 7200] 中的任意整数。 默认值: 0 为默认值, 此时将禁用基于时间的线程高级功能。否则, 值将代表秒数 aq_tm_processes: 说明: 如果大于零, 就会启用对队列消息的时间监视。该时间值可用于指定消息的延迟和失效属性 (用于应用程序的开发)。 值范围: 0 - 10 默认值: 0 tracefile_identifier: spfile: 说明: 指定当前使用的服务器参数文件的名称。 值范围: 静态参数 默认值: SPFILE 参数可在客户端 PFILE 中定义, 以指明要使用的服务器参数文件的名称。服务器使用默认服务器参数文件时, SPFILE 的值要由服务器在内部设置。 Logmnr_max_persistent_sessions: Standby_file_management: Trace_enabled: Ifile: 说明: 用于在当前参数文件中嵌入其他参数文件。您可以在一个参数文件的多个行上多次使用该参数, 但最多只能有三级嵌套。 值范围: 任何有效的参数文件名 (语法是 IFILE = parameter_file_name)。 默认值: NULL remote_listener: global_context_pool_size: 说明: 从 SGA 分配的用于存储和管理全局应用程序环境的内存量。 值范围: 任意整数值。 默认值: 1 M plsql_native_library_subdir_count: fixed_date: 说明: SYSDATE 返回的数据。对于必须始终返回固定日期而非系统日期的测试, 该值很有用。使用双引号或不使用引号。请勿使用单引号。 值范围: YYYY-MM-DD-HH24:MI:SS (或默认的 Oracle 日期格式)。 默认值: NULL db_name: 说明: 一个数据库标识符, 应与 CREATE DATABASE 语句中指定的名称相对应。 值范围: 任何有效名称最多可有 8 个字符。 默认值: 无 (但应指定) cluster_database: cluster_interconnects: cluster_database_instances: sql_version: replication_dependency_tracking: 说明: 跟踪相关性对复制服务器以并行方式传播所作的更改至关重要。如果设置为 FALSE, 数据库上的读/写操作将运行得更快, 但无法为复制服务器产生并行传播的相关性信息。 值范围: TRUE | FALSE 默认值: TRUE (即启用读/写相关性跟踪) remote_os_roles: 说明: 将 REMOTE_OS_ROLES 设置为 TRUE, 允许由远程客户机的操作系统来分配角色。如果设置为 FALSE, 则由远程客户机的数据库来识别和管理角色。 值范围: TRUE | FALSE 默认值: FALSE remote_os_authent: 说明: 将 REMOTE_OS_AUTHENT 设置为 TRUE, 允许使用 OS_AUTHENT_PREFIX 的值来验证远程客户机。 值范围: TRUE | FALSE 默认值: FALSE open_links: 说明: 指定在一次会话中同时打开的与远程数据库的连接的最大数量。该值应等于或超过一个引用多个数据库的单个 SQL 语句中引用的数据库的数量, 这样才能打开所有数据库以便执行该语句。 值范围: 0 - 255 (如果为 0, 不允许分布式事务处理)。 默认值: 4 open_links_per_instance: 说明: 指定 XA 应用程序中可移植的打开连接的最大数量。XA 事务处理使用可移植的打开的连接, 以便在提交一个事务处理后能将这些连接高速缓存。如果创建连接的用户就是拥有事务处理的用户, 各事务处理则可共享连接。 值范围: 0 - UB4MAXVAL 默认值: 4 remote_login_passwordfile: 说明: 指定操作系统或一个文件是否检查具有权限的用户的口令。如果设置为 NONE, Oracle 将忽略口令文件。如果设置为 EXCLUSIVE, 将使用数据库的口令文件对每个具有权限的用户进行验证。如果设置为 SHARED, 多个数据库将共享 SYS 和 INTERNAL 口令文件用户。 值范围:NONE | SHARED | EXCLUSIVE 默认值: NONE hs_autoregister: 说明: 启用或禁用“异构服务 (HS)”代理的自动自注册。如果启用, 信息将被上载到数据字典中, 以便在通过同一代理建立后续连接时降低开销。 值范围: TRUE | FALSE 默认值: TRUE global_names: 说明: 指定是否要求数据库链接与所连接的数据库同名。如果该值为 FALSE, 则不执行检查。要使分布式处理中的命名约定一致, 请将该参数设置为 TRUE。 值范围: TRUE | FALSE 默认值: TRUE distributed_transactions: 说明: 一个数据库一次可参与的分布式事务处理的最大数量。如果由于网络故障异常频繁而减少该值, 将造成大量未决事务处理。 值范围: 0 - TRANSACTIONS 参数值。 默认值: 根据操作系统而定 commit_point_strength: 说明: 一个用于确定分布式事务处理中提交点的位置的值。 值范围: 0 -255 默认值: 根据操作系统而定 db_domain: 说明: 指定数据库名的扩展名 (例如:US.ORACLE.COM) 为使一个域中创建的数据库名唯一, 建议指定该值。 值范围: 由句点分隔的任何字符串, 最长可以有 128 个字符。 默认值: WORLD dblink_encrypt_login: 说明: 在连接到其他 Oracle Server 时, 数据库链接是否使用加密口令。 值范围: TRUE | FALSE 默认值: FALSE backup_tape_io_slaves: 说明: 一个恢复管理器参数, 用于确定读取或写入磁带是否要使用服务器进程或一个附加的 I/O 从属。 值范围: TRUE | FALSE 默认值: FALSE tape_asynch_io: 说明: 用于控制对顺序设备的 I/O 操作 (例如, 将 Oracle 数据备份或复原到磁带上, 或从磁带上备份或复原 Oracle 数据) 是否异步。只有在您的平台支持对顺序设备的异步 I/O 操作的情况下, 将该值设置为 TRUE 才有效; 如果异步 I/O 的执行情况不稳定, 请将该值设置为 FALSE。 值范围: TRUE | FALSE 默认值: FALSE log_file_name_convert: 说明: 将主数据库上的一个日志文件的文件名转换为备用数据库上对等的路径和文件名。将一个日志文件添加到一个主数据库后, 必须将一个相应的文件添加到备用数据库中。该参数替代 Oracle7 中的 LOG_FILE_NAME_CONVERT 参数。 值范围: 任何格式为 ''主体日志文件的路径/文件名'' 和 ''备用日志文件的路径/文件名'' 的有效路径/文件名 默认值: NULL fal_server: 说明: 指定此备用数据库的 FAL 服务器。该值是一个 Oracle Net 服务名。此 Oracle Net 服务名被假定为已在备用数据库系统上正确配置, 可指向期望的 FAL 服务器。 值范围: Oracle Net 服务名的字符串值。 Fal_client: 说明: 指定供 FAL 服务 (通过 FAL_SERVER 参数配置) 来引用 FAL 客户机的 FAL 客户机名称。该参数的值是一个 Oracle Net 服务名。此 Oracle Net 服务名被假定为已在 FAL 服务器系统上正确配置, 可指向 FAL 客户机 (即: 此备用数据库)。 值范围: Oracle Net 服务名的字符串值。 Drs_start: 说明: 使 Oracle 可以确定是否应启动 DRMON 进程。DRMON 是一种不会导致致命错误Oracle 后台进程, 只要例程存在, 该进程就存在。 值范围: TRUE | FALSE。 默认值: FALSE remote_archive_enable: 说明: 控制是否可向远程目标执行重做日志文件归档操作。必须将该参数值设置为 "TRUE", 以便 Oracle 数据库例程对重做日志文件进行远程归档, 并且/或者接收远程归档的重做日志文件。 值范围: FALSE | TRUE 默认值: TRUE standby_preserves_names: 说明: 表明备用数据库上的文件名是否与主数据库上的文件名相同。 值范围: TRUE 或 FALSE。注: 如果将值设置为 True, 且备用数据库与主数据库位于同一系统上, 则主数据库文件可能被覆盖。 默认值: FALSE。 Standby_archive_dest: 说明: 指定来自一个主例程的归档日志的到达位置。STANDBY_ARCHIVE_DEST 和 LOG_ARCHIVE_FORMAT 用于在备用位置上虚拟完全合格的归档日志文件名。备用数据库上的 RFS 服务器将使用该值, 而不是 ARCHIVE_LOG_DEST。 值范围: NULL 字符串或非 RAW 类型的有效路径/设备名。 默认值: NULL db_file_name_convert: 说明: 将主数据库上的一个新数据文件的文件名转换为备用数据库上的文件名。 值范围: 一个有效的主/备用目录和文件名对。 默认值: 无 max_enable_roles: 说明: 指定一个用户可以启用的数据库角色 (包括子角色) 的最大数量。用户可启用的角色的实际数量是 2 加上 MAX_ENABLED_ROLES 的值, 因为每个用户都有两个附加的角色: PUBLIC 和用户自己的角色。 值范围: 0 -148 默认值: 20 O7_DICTIONARY_ACCESSIBILITY: 说明: 主要用于从 Oracle7 移植到 Oracle8i。如果该值为 TRUE, SYSTEM 权限 (如 SELECT ANY TABLE) 将不限制对 SYS 方案中各对象的访问 (Oracle7 行为)。如果该值为 FALSE, 只有被授予了 SELECT_CATALOG_ROLE, EXECUTE_CATALOG_ROLE 或 DELETE_CATALOG_ROLE 权限的用户才能访问 SYS 方案中的各对象。 值范围: TRUE | FALSE 默认值: TRUE sql92_security: 说明: 指定要执行一个更新或删除引用表列的值是否需要具有表级的 SELECT 权限。 值范围: TRUE | FALSE 默认值: FALSE audit_trail: 说明: 启用或禁用数据库审计。如果该参数为 TRUE 或 DB, 审计记录将被写入 SYS.AUD$ 表中; 如果参数为 OS, 则写入一个操作系统文件。 值范围: NONE | FALSE | DB | TRUE | OS 默认值: NONE rdbms_server_dn: 说明: RDBMS 服务器的唯一判别名。它用于在一个企业目录服务中检索企业角色。有关详细信息, 请参阅“Oracle Advanced Security Administrator's Guide”。 值范围: 所有 X.500 唯一判别名格式值。 默认值: 无 os_roles: 说明: 确定操作系统或数据库是否为每个用户标识角色。如果设置为 TRUE, 将由操作系统完全管理对所有数据库用户的角色授予。否则, 角色将由数据库标识和管理。 值范围: TRUE | FALSE 默认值: FALSE os_authent_prefix: 说明: 使用用户的操作系统帐户名和口令来验证连接到服务器的用户。该参数的值与各用户的操作系统帐户连接在一起。要去除 OS 帐户前缀, 请指定空值。 值范围: 任何标识符。 默认值: 根据操作系统而定 (通常是 'OPS$') object_cache_max_size_percent: 说明: 指定会话对象的高速缓存增长可超过最佳高速缓存大小的百分比, 最大大小等于最佳大小加上该百分比与最佳大小的乘积。如果高速缓存大小超过了这个最大大小, 系统就会尝试将高速缓存缩小到最佳大小。 值范围: 0% 到根据操作系统而定的最大值。 默认值: 10% object_cache_optimal_size: 说明: 指定在高速缓存超过最大大小的情况下, 会话对象高速缓存将被缩小到的大小。 值范围: 10K 到根据操作系统而定的最大值。 默认值: 100K session_max_open_files: 说明: 指定可在任一给定会话中打开的 BFILE 的最大数量。一旦达到这个数量, 此后将无法在该会话中打开更多文件。该参数还取决于操作系统参数 MAX_OPEN_FILES。 值范围: 1 - 至少为 (50, OS 级上的 MAX_OPEN_FILES)。 默认值: 10 parallel_execution_message_size: 说明: 指定并行执行 (并行查询, PDML, 并行恢复和复制) 消息的大小。如果值大于 2048 或 4096, 就需要更大的共享池。如果 PARALLEL_AUTOMATIC_TUNING = TRUE, 将在大存储池之外指定消息缓冲区。 值范围: 2148 - 无穷大。 默认值: 如果 PARALLEL_AUTOMATIC_TUNING 为 FALSE, 通常值为 2148; 如果 PARALLEL_AUTOMATIC_TUNING 为 TRUE , 则值为 4096 (根据操作系统而定)。 Paralle_min_percent: 说明: 指定并行执行要求的线程的最小百分比。设置该参数, 可以确保并行执行在没有可用的恰当查询从属进程时, 会显示一个错误消息, 并且该查询会因此而不予执行。 值范围: 0 -100 默认值: 0, 表示不使用该参数。 Parallel_automatic_tuning: 说明: 如果设置为 TRUE, Oracle 将为控制并行执行的参数确定默认值。除了设置该参数外, 你还必须为系统中的表设置并行性。 值范围: TRUE | FALSE 默认值: FALSE parallel_threads_per_cpu: 说明: 说明一个 CPU 在并行执行过程中可处理的进程或线程的数量, 并优化并行自适应算法和负载均衡算法。如果计算机在执行一个典型查询时有超负荷的迹象, 应减小该数值。 值范围: 任何非零值。 默认值: 根据操作系统而定 (通常为 2) parallel_broadcast_enabled: 说明 : 通过使用一个散列联接或合并联接, 可以在将多个大结果集联接到一个小结果集 (以字节而不是行为单位来衡量大小) 时改善性能。如果该值设置为 TRUE, 优化程序可以将小结果集内的每个行都传播到大型集内的每个集群数据库处理行中。 值范围: TRUE | FALSE 默认值 : FALSE parallel_adaptive_multi_user: 说明: 启用或禁用一个自适应算法, 旨在提高使用并行执行方式的多用户环境的性能。通过按系统负荷自动降低请求的并行度, 在启动查询时实现此功能。当 PARALLEL_AUTOMATIC_TUNING = TRUE 时, 其效果最佳。 值范围: TRUE | FALSE 默认值: 如果 PARALLEL_AUTOMATIC_TUNING = TRUE, 则该值为 TRUE; 否则为 FALSE parallel_max_servers: 说明: 指定一个例程的并行执行服务器或并行恢复进程的最大数量。如果需要, 例程启动时分配的查询服务器的数量将增加到该数量。 值范围: 0 -256 默认值: 由 CPU_COUNT, PARALLEL_AUTOMATIC_TUNING 和 PARALLEL_ADAPTIVE_MULTI_USER 确定 parallel_min_servers 说明: 指定为并行执行启动例程后, Oracle 创建的查询服务器进程的最小数量。 值范围: 0 - PARALLEL_MAX_SERVERS。 默认值: 0 log_archive_dest_state_3: 说明: 指定相应的归档日志目标参数 (仅 LOG_ARCHIVE_DEST_3) 的可用性状态。如果启用, 日志目标将被归档。如果延迟, 该目标将被排除在归档操作之外直至重新启用。 值范围: ENABLE | DEFER 默认值: ENABLE log_archive_dest_state_4: 说明: 指定相应的归档日志目标参数 (仅 LOG_ARCHIVE_DEST_4) 的可用性状态。如果启用, 日志目标将被归档。如果延迟, 该目标将被排除在归档操作之外直至重新启用。 值范围: ENABLE | DEFER 默认值: ENABLE log_archive_dest_state_5: 说明: 指定相应的归档日志目标参数 (仅 LOG_ARCHIVE_DEST_5) 的可用性状态。如果启用, 日志目标将被归档。如果延迟, 该目标将被排除在归档操作之外直至重新启用。 值范围: ENABLE | DEFER 默认值: ENABLE log_archive_dest_state_6: 说明: 标识特定日志归档目标的最近的用户定义状态。 值范围: ENABLE--如果目标属性有效, 则启用归档日志目标; DEFER--即使目标属性有效, 也要延迟处理归档日志目标; 或者是 ALTERNATE--延迟处理归档日志目标, 直到另一个目标的失败导致自动启用了此目标 (前提是备用目标的属性必须有效)。 log_archive_dest_state_7: 说明: 标识特定日志归档目标的最近的用户定义状态。 值范围: ENABLE--如果目标属性有效, 则启用归档日志目标; DEFER--即使目标属性有效, 也要延迟处理归档日志目标; 或者是 ALTERNATE--延迟处理归档日志目标, 直到另一个目标的失败导致自动启用了此目标 (前提是备用目标的属性必须有效)。 log_archive_dest_state_8: 说明: 标识特定日志归档目标的最近的用户定义状态。 值范围: ENABLE--如果目标属性有效, 则启用归档日志目标; DEFER--即使目标属性有效, 也要延迟处理归档日志目标; 或者是 ALTERNATE--延迟处理归档日志目标, 直到另一个目标的失败导致自动启用了此目标 (前提是备用目标的属性必须有效)。 log_archive_dest_state_9: 说明: 标识特定日志归档目标的最近的用户定义状态。 值范围: ENABLE--如果目标属性有效, 则启用归档日志目标; DEFER--即使目标属性有效, 也要延迟处理归档日志目标; 或者是 ALTERNATE--延迟处理归档日志目标, 直到另一个目标的失败导致自动启用了此目标 (前提是备用目标的属性必须有效)。 Log_archive_start: 说明: n只在数据库处于“归档日志”模式的情况下适用。它指定重做日志是自动还是手动复制。建议值是 TRUE, 即执行自动归档; 否则就需要手动干预, 使用 ALTER SYSTEM ARCHIVE LOG ... 命令来阻止例程挂起。 值范围: TRUE | FALSE 默认值: FALSE log_archive_duplex_dest: 说明: 指定 LOG_ARCHIVE_DEST 外的另一个归档目标。在 Oracle8i 企业版中, 该参数被 LOG_ARCHIVE_DEST_n 代替。 值范围: 一个 NULL 字符串, 或者任何有效的路径或设备名, 原始分区除外。 默认值: NULL log_archive_format: 说明: LOG_ARCHIVE_FORMAT 只在数据库处于“归档日志”模式的情况下有用。文本字符串与变量 %s (日志序列号) 和 %t (线程号) 结合使用, 用于指定各归档重做日志文件的唯一文件名。该字符串被附加到 LOG_ARCHIVE_DEST 参数。 值范围: 任何有效的文件名。 默认值: 根据操作系统而定 log_archive_max_processes: 说明: 指定要求的 ARCH 进程的数量。如果 LOG_ARCHIVE_START = TRUE, 该值可以在例程启动时被评估; 也可以在通过 SQL*Plus 或 SQL 语法调用 ARCH 进程时评估。 值范围: 1 - 10 (包括端点) 的任何整数。 默认值: 1 log_archive_dest_2: 说明: 五个本地 (指定 LOCATION) 或远程 (指定 SERVICE) 目标位置中的第二个, 归档重做日志文件可以在这些目标位置上被复制。该参数只在企业版 oracle8i 数据库或更高版本的数据库中有效。 值范围: 语法为 (null_string | SERVICE=tnsnames-service | LOCATION=directory-spec)[MANDATORY | OPTIONAL][REOPEN=integer] 默认值: NULL log_archive_min_succeed_dest: 说明: 定义在可以覆盖日志文件前必须将其复制到的目标的最小数量。该值应大于或等于 LOG_ARCHIVE_DEST_n 中 MANDATORY 目标的数量。 值范围: 1 - 5 (如果与 LOG_ARCHIVE_DEST 和 LOG_ARCHIVE_DUPLEX_DEST 共同使用, 则限制在 1-2)。 默认值: 1 log_archive_trace: 说明: 控制归档日志进程生成的输出。此进程可以通过下列方式启动 ARCn 后台进程 (在输出日志中指定为 ARCn) 明确的会话调用的前台进程 (在输出日志中指定为 ARCH) 或 “受管备用数据库”的远程文件服务器 (RFS) 进程。 值范围: 0: 禁用归档日志跟踪 (这是默认设置) 1: 重做日志文件的追踪归档 2: 每个归档日志目标的追踪归档状态 4: 追踪归档操作阶段 8: 追踪归档日志目标活动 16: 追踪详细的归档日志目标活动 32: 追踪归档日志目标参数修改 64: 追踪 ARCn 进程状态活动 默认值: 0 log_archive_dest_10: log_archive_dest_3: 说明: 五个本地 (指定 LOCATION) 或远程 (指定 SERVICE) 目标位置中的第三个, 归档重做日志文件可以在这些目标位置上被复制。该参数只在企业版 oracle8i 数据库或更高版本的数据库中有效。 值范围: 语法为 (null_string | SERVICE=tnsnames-service | LOCATION=directory-spec)[MANDATORY | OPTIONAL][REOPEN=integer] 默认值: NULL log_archive_dest: 说明: 五个本地 (指定 LOCATION) 或远程 (指定 SERVICE) 目标位置中的第三个, 归档重做日志文件可以在这些目标位置上被复制。该参数只在企业版 oracle8i 数据库或更高版本的数据库中有效。 值范围: 语法为 (null_string | SERVICE=tnsnames-service | LOCATION=directory-spec)[MANDATORY | OPTIONAL][REOPEN=integer] 默认值: NULL log_archive_dest_state_2: 说明: 指定相应的归档日志目标参数 (仅 LOG_ARCHIVE_DEST_2) 的可用性状态。如果启用, 日志目标将被归档。如果延迟, 该目标将被排除在归档操作之外直至重新启用。 值范围: ENABLE | DEFER 默认值: ENABLE log_archive_dest_5: 说明: 五个本地 (指定 LOCATION) 或远程 (指定 SERVICE) 目标位置中的第五个, 归档重做日志文件可以在这些目标位置上被复制。该参数只在企业版 oracle8i 数据库或更高版本的数据库中有效。 值范围: 语法为 (null_string | SERVICE=tnsnames-service | LOCATION=directory-spec)[MANDATORY | OPTIONAL][REOPEN=integer] 默认值: NULL log_archive_dest_6: log_archive_dest_1: log_archive_dest_8: log_archive_dest_9: log_archive_dest_state_1: 说明: 指定相应的归档日志目标参数 (仅 LOG_ARCHIVE_DEST_1) 的可用性状态。如果启用, 日志目标将被归档。如果延迟, 该目标将被排除在归档操作之外直至重新启用。 值范围: ENABLE | DEFER 默认值: ENABLE log_archive_dest_state_10 说明: 指定归档日志的目标。 值范围: 本地文件系统位置 (磁盘位置) 或通过 Oracle Net 服务名 (tns 服务) 指定的远程归档位置。: log_archive_dest_4: 说明: 五个本地 (指定 LOCATION) 或远程 (指定 SERVICE) 目标位置中的第四个, 归档重做日志文件可以在这些目标位置上被复制。该参数只在企业版 oracle8i 数据库或更高版本的数据库中有效。 值范围: 语法为 (null_string | SERVICE=tnsnames-service | LOCATION=directory-spec)[MANDATORY | OPTIONAL][REOPEN=integer] 默认值: NULL create_bitmap_area_size: 说明: CREATE_BITMAP_AREA_SIZE 指定为创建位图索引而分配的内存量。 值范围: 根据操作系统而定。 默认值: 8 MB pga_aggregate_target: 说明: 指定连接到例程的所有服务器进程的目标 PGA 总内存。请在启用自动设置工作区之前将此参数设置为一个正数。这部分内存不驻留在 SGA 中。数据库将此参数值用作它所使用的目标 PGA 内存量。设置此参数时, 要将 SGA 从可用于 Oracle 例程的系统内存总量中减去。然后可将剩余内存量分配给 pga_aggregate_target。 值范围: 整数加字母 K, M 或 G, 以将此限值指定为千字节, 兆字节或千兆字节。最小值为 10M, 最大值为 4000G 默认值: "未指定", 表示完全禁用对工作区的自动优化。 Sort_area_size: 说明: SORT_AREA_SIZE 以字节为单位, 指定排序所使用的最大内存量。排序完成后, 各行将返回, 并且内存将释放。增大该值可以提高大型排序的效率。如果超过了该内存量, 将使用临时磁盘段。 值范围: 相当于 6 个数据库块的值 (最小值) 到操作系统确定的值 (最大值)。 默认值: 根据操作系统而定 sort_area_retained_size 说明: 以字节为单位, 指定在一个排序运行完毕后保留的用户全局区 (UGA) 内存量的最大值。最后一行从排序空间中被提取后, 该内存将被释放回 UGA, 而不是释放给操作系统。 值范围: 从相当于两个数据库块的值到 SORT_AREA_SIZE 的值。 默认值: SORT_AREA_SIZE 的值 bitmap_merge_area_size: 说明: 指定合并从对索引的某一范围进行扫描而检索得到的位图要使用的内存量。 值范围: 根据系统而定。 默认值: 1MB workarea_size_policy: 说明: 指定调整工作区大小的策略。此参数控制优化工作区时所处的模式。 值范围: AUTO, MANUAL。 默认值: 如果设置了 PGA_AGGREGATE_TARGET, 则为 AUTO; 否则为 MANUAL。 Hash_area_size: 说明: 与并行执行操作和 DML 或 DDL 语句相关。它以字节为单位, 指定要用于散列联接的最大内存量。有关详细信息, 请参阅手册 Oracle8i Concepts。 值范围: 0 到根据操作系统而定的值。 默认值: 派生:2 * SORT_AREA_SIZE 参数值 db_create_online_log_dest_4: 说明: 设置所创建的联机日志和控制文件的默认位置。如果在创建联机日志或控制文件时未指定文件名, 则使用默认文件名。 值范围: 文件系统目录名。该目录必须已存在。该目录必须具有可让 Oracle 在其中创建文件的许可。 db_create_online_log_dest_3: 说明: 设置所创建的联机日志和控制文件的默认位置。如果在创建联机日志或控制文件时未指定文件名, 则使用默认文件名。 值范围: 文件系统目录名。该目录必须已存在。该目录必须具有可让 Oracle 在其中创建文件的许可。 Db_files: 说明: 可为该数据库打开的数据文件的最大数量。 值范围: MAXDATAFILES - 根据操作系统而定。 默认值: 根据操作系统而定 (在 Solaris 系统上为 200) db_create_online_log_dest_2: 说明: 设置所创建的联机日志和控制文件的默认位置。如果在创建联机日志或控制文件时未指定文件名, 则使用默认文件名。 值范围: 文件系统目录名。该目录必须已存在。该目录必须具有可让 Oracle 在其中创建文件的许可。 db_create_online_log_dest_1: 说明: 设置所创建的联机日志和控制文件的默认位置。如果在创建联机日志或控制文件时未指定文件名, 则使用默认文件名。 值范围: 文件系统目录名。该目录必须已存在。该目录必须具有可让 Oracle 在其中创建文件的许可。 Db_create_file_dest: 说明: 设置所创建的数据文件, 控制文件和联机日志的默认位置。 值范围: 文件系统目录名。该目录必须已存在。该目录必须具有可让 Oracle 在其中创建文件的许可。 Control_files: 说明: 指定一个或多个控制文件名。Oracle 建议对于不同设备或 OS 文件镜象使用多个文件。 值范围: 1 - 8 文件名 (带路径名)。 默认值: 根据操作系统而定 db_create_online_log_dest_5: 说明: 设置所创建的联机日志和控制文件的默认位置。如果在创建联机日志或控制文件时未指定文件名, 则使用默认文件名。 值范围: 文件系统目录名。该目录必须已存在。该目录必须具有可让 Oracle 在其中创建文件的许可。 Large_pool_size: 说明 : 指定大型池的分配堆的大小, 它可被共享服务器用作会话内存, 用作并行执行的消息缓冲区以及用作 RMAN 备份和恢复的磁盘 I/O 缓冲区。 值范围: 600K (最小值); >= 20000M (最大值是根据操作系统而定的)。 默认值 : 0, 除非配置了并行执行或 DBWR_IO_SLAVES shared_pool_size: 说明: 以字节为单位, 指定共享池的大小。共享池包含如: 共享游标, 存储的过程, 控制结构和并行执行消息缓冲区等对象。较大的值能改善多用户系统的性能。 值范围:300 KB - 根据操作系统而定。 默认值: 如果是 64 位操作系统, 值为 64MB; 其他情况下, 值为 16MB。 Java_pool_size: 说明: 以字节为单位, 指定 Java 存储池的大小, 它用于存储 Java 的方法和类定义在共享内存中的表示法, 以及在调用结束时移植到 Java 会话空间的 Java 对象。有关详细信息, 请参阅 Oracle8i Java Developer's Guide。 值范围: 根据操作系统而定。 默认值: 根据操作系统而定 shared_pool_reserved_size: 说明: 指定要为较大连续共享池内存请求而保留的空间, 以避免由碎片引起的性能下降。该池的大小应符合这样的条件:能存储为防止对象从共享池刷新而普遍要求的所有大型过程和程序包。 值范围: SHARED_POOL_RESERVED_MIN_ALLOC 到 SHARED_POOL_SIZE 的一半 (字节)。 默认值: SHARED_POOL_SIZE 值的 5% cursor_sharing: 说明: 控制可以终止共享相同的共享游标的 SQL 语句类型。 值范围: 强制: 强制表达方式不同但语句意思相同的语句共享一个游标。 EXACT: 只令完全相同的 SQL 语句共享一个游标。 默认值: EXACT open_cursors: 说明: 指定一个会话一次可以打开的游标 (环境区域) 的最大数量, 并且限制 PL/SQL 使用的 PL/SQL 游标高速缓存的大小, 以避免用户再次执行语句时重新进行语法分析。请将该值设置得足够高, 这样才能防止应用程序耗尽打开的游标。 值范围: 1 - 操作系统限制值。 默认值: 64 serial_reuse: 说明: 指定何种类型的 SQL 游标应利用串行可重用内存功能。如果 CURSOR_SPACE_FOR_TIME = TRUE, 那么 SERIAL_REUSE 值将被忽略, 当作被设置为 DISABLE 或 NULL 的情况处理。 值范围: DISABLE | SELECT | DML | PLSQL | ALL | NULL 默认值: NULL session_cached_cursors: 说明: 指定要高速缓存的会话游标的数量。对同一 SQL 语句进行多次语法分析后, 它的会话游标将被移到该会话的游标高速缓存中。这样可以缩短语法分析的时间, 因为游标被高速缓存, 无需被重新打开。 值范围: 0 到根据操作系统而定的值。 默认值: 0 cursor_space_for_time: 说明: 在一个游标引用共享 SQL 区时, 确定将 SQL 区保留在共享池中还是从中按过期作废处理。 值范围: TRUE | FALSE 默认值: FALSE (过期作废) rollback_segments: 说明: 指定要在例程启动过程中获取的一个或多个回退段, 即使其数量超过了 TRANSACTIONS / TRANSACTIONS_PER_ROLLBACK_SEGMENT 的值。公式为 ROLLBACK_SEGMENTS = (rbseg_name [, rbseg_name] ...) 值范围:除 SYSTEM 外, DBA_ROLLBACK_SEGS 中列出的任何回退段。 默认值: NULL (默认情况下使用公用回退段) undo_suppress_errors: 说明: 允许用户在 SMU 模式下尝试执行 RBU 操作 (如 ALTER ROLLBACK SEGMENT ONLINE) 时忽略错误。这样能让用户在将所有应用程序和脚本转换到 SMU 模式之前即可使用 SMU 功能。 值范围: True 或 False 默认值: False。 Max_rollback_segments: 说明: 指定 SGA 中高速缓存的回退段的最大大小。该数值指定一个例程中可同时保持联机状态 (即状态为 INUSE) 的回退段的最大数量。 值范围: 2 -65535 默认值: 最大值 (30, TRANSACTIONS/TRANSACTIONS_PER_ROLLBACK_SEGMENT) undo_retention: 说明: UNDO_RETENTION 参数用来指定要在数据库中保留的已提交的撤消信息总量。可在例程启动时设置该参数值。可以计算满足撤消保留要求所需的撤消空间量: UndoSpace = RD * UPS, 其中 UndoSpace 以撤消块数来表示, RD 用以秒为单位的 UNDO_RETENTION 来表示, UPS 以每秒撤消块数来表示。 值范围: 所允许的最大值为 (2 ** 32) 秒。 默认值: 30 秒。 Transactions_per_rollback_segment: 说明: 指定每个回退段允许的并行事务处理的数量。启动时获取的回退段的最小数量为 TRANSACTIONS 除以该参数值的结果。如果在参数 ROLLBACK_SEGMENTS 中命名了其他回退段, 就可以获取这些回退段。 值范围: 1 - 根据操作系统而定。 默认值: 5 undo_management: 说明: 指定系统应使用哪种撤消空间管理模式。如果设置为 AUTO, 例程将以 SMU 模式启动。否则将以 RBU 模式启动。在 RBU 模式下, 撤消空间会象回退段一样在外部分配。在 SMU 模式下, 撤消空间会象撤消表空间一样在外部分配。 值范围: AUTO 或 MANUAL 默认值: 如果启动第一个例程时忽略了 UNDO_MANAGEMENT 参数, 则将使用默认值 MANUAL, 并且例程将以 RBU 模式启动。如果这不是第一个例程, 则将按其他现有例程启动时使用的撤消模式来启动该例程。 Undo_tablespace: 说明: 撤消表空间仅用于存储撤消信息。UNDO_TABLESPACE 仅允许在系统管理撤消 (SMU) 模式下使用。例程将使用指定的撤消表空间, 。如果该表空间不存在, 或不是撤消表空间, 或正在由另一例程使用, 则例程 STARTUP 将失败。 默认值: 每个数据库都包含 0 个或更多的撤消表空间。在 SMU 模式下, 将为每个 ORACLE 例程分配一个 (且仅限一个) 撤消表空间。 Instance_name 说明: 在多个例程使用相同服务名的情况下, 用来唯一地标识一个数据库例程。INSTANCE_NAME 不应与 SID 混淆, 它实际上是对在一台主机上共享内存的各个例程的唯一标识。 值范围: 任何字母数字字符。 默认值: 数据库 SID service_names: 说明 : 为 Oracle Net 监听程序用来识别一个服务 (如: 复制环境中的一个特定数据库) 的例程指定服务名。如果该服务没有域, 将附加 DB_DOMAIN 参数。 语法 : SERVICE_NAMES = name1.domain, name2.domain 默认值 : DB_NAME.DB_DOMAIN (如果已定义) local_listener: 说明 : 一个 Oracle Net 地址列表, 用于标识 Oracle Net 监听程序所在的同一台计算机上的数据库例程。所有例程和调度程序都在该监听程序上注册, 以便启用客户机连接。该参数覆盖在 8.1 版本中废弃的 MTS_LISTENER_ADDRESS 和 MTS_MULTIPLE_LISTENERS 参数。 值范围: 一个有效的 Oracle Net 地址列表。 默认值: (ADDRESS_LIST=(Address=(Protocol=TCP)(Host=localhost)(Port=1521)) (Address=(Protocol=IPC)(Key=DBname))) license_sessions_warning: 说明: 指定对并行用户会话数量的警告限制。达到该限制后, 其他用户仍然可以连接, 但一条消息将被写入 ALERT 文件。具有 RESTRICTED SESSION 权限的用户将收到一条警告消息, 表明系统已接近最大容量。 值范围: 0 - LICENSE_MAX_SESSIONS 默认值: 0 license_max_sessions: 说明: 指定允许同时进行的并行用户会话的最大数量。达到该限制后, 只有具有 RESTRICTED SESSION 权限的用户才能连接到服务器。所有其他用户都会收到一条警告消息, 表明已达到系统最大容量的限制。 值范围: 0 - 会话许可的数量。 默认值: 0 license_max_users: 说明: 指定您可在该数据库中创建的用户的最大数量。并行会话使用许可和用户使用许可不应被同时启用。LICENSE_MAX_SESSIONS 或 LICENSE_MAX_USERS 或这两者的值应为零。 值范围: 0 - 用户许可的数量。 默认值: 0 db_block_checksum: 说明: DBWn, ARCH 和 SQL*loader 是否为每一个数据块读或写计算或校验块的校验和。 值范围: TRUE | FALSE 默认值: FALSE shadow_core_dump: 说明: 一个针对 UNIX 的参数, 用于指定是否将 SGA 信息转储到一个生成的核心文件中。如果设置为 FULL, SGA 将被包括在核心转储中。如果设置为 PARTIAL, SGA 将不被转储。 值范围: FULL | PARTIAL 默认值: FULL db_block_checking: 说明: 用于控制是否检查事务处理管理的块有无损坏。 值范围: TRUE | FALSE 默认值: FALSE background_core_dump: 说明: 是否将 SGA 信息转储到一个生成的核心文件中 (用于 UNIX)。 值范围: FULL | PARTIAL 默认值: FULL event: 说明: 由 Oracle 技术支持人员使用, 以调试系统。一般情况下, 不应变更该值。 值范围:不可用。 默认值: 无 user_dump_dest: 说明: 为服务器将以一个用户进程身份在其中写入调试跟踪文件的目录指定路径名。例如, 该目录可这样设置: NT 操作系统上的 C:/ ORACLE/UTRC; UNIX 操作系统上的 /oracle/utrc; 或 VMS 操作系统上的 DISK$UR3:[ORACLE.UTRC]。 值范围: 一个有效的本地路径名, 目录或磁盘。 默认值: 根据操作系统而定 timed_statistics: 说明: 收集操作系统的计时信息, 这些信息可被用来优化数据库和 SQL 语句。要防止因从操作系统请求时间而引起的开销, 请将该值设置为零。将该值设置为 TRUE 对于查看长时间操作的进度也很有用。 值范围: TRUE | FALSE 默认值: FALSE timed_os_statistics: 说明 : 由系统管理员使用, 以收集操作系统统计信息。为了有效地使用资源, 请只在需要时才设置该值。对于专用服务器, 会在用户连接, 断开连接以及弹出调用 (如果超出了指定的时间限制) 的情况下收集操作系统统计信息。对于共享服务器, 将为推入或弹出的调用收集统计信息。 值范围: 以秒为单位的时间。 默认值 : 0 (操作系统统计信息不被刷新) core_dump_dest: 说明: 指定核心转储位置的目录名 (用于 UNIX)。 值范围: 任何有效的目录名。 默认值: ORACLE_HOME/dbs oracle_trace_collection_name: 说明: 指定 Oracle Trace 收集名, 并在输出文件名中使用 (收集定义文件 .cdf 和数据收集文件 .dat)。如果该参数不为空, 且 ORACLE_TRACE_ENABLE = TRUE, 就会启动一个默认的 Oracle Trace 收集, 直到该值再次设置为 NULL。 值范围: 一个有效的收集名, 最长可为 16 个字符 (使用 8 个字符文件名的平台除外)。 默认值: NULL oracle_trace_collection_path: 说明: 指定 Oracle Trace 收集定义文件 (.cdf) 和数据收集文件 (.dat) 所在的目录路径名。 值范围: 完整的目录路径名。 默认值: 根据操作系统而定 (通常是 ORACLE_HOME/otrace/admin/cdf) background_dump_dest: 说明: 指定在 Oracle 操作过程中为后台进程 (LGWR, DBW n 等等) 写入跟踪文件的路径名 (目录或磁盘)。它还定义记录着重要事件和消息的数据库预警文件的位置。 值范围: 任何有效的目录名。 默认值: ORACLE_HOME/rdbms/log (根据操作系统而定) oracle_trace_enable: 说明: 要为服务器启用 Oracle Trace 收集, 请将该值设置为 TRUE。如果设置为 TRUE, 该服务器就可以使用 Oracle Trace。要启动一个收集过程, 请为 ORACLE_TRACE_COLLECTION_NAME 指定一个非空值; 或者使用 Oracle Trace Manager 来启动一个收集。 值范围: TRUE | FALSE 默认值: FALSE oracle_trace_collection_size: 说明: 以字节为单位, 指定 Oracle Trace 收集文件的最大大小。一旦该收集文件的大小达到这个最大值, 收集就会被禁用。如果值范围指定为零, 就表示没有大小限制。 值范围: 0 -4294967295 默认值: 5242880 oracle_trace_facility_path: 说明: 指定 Oracle TRACE 工具的定义文件 (.fdf) 所在的目录路径名。 值范围: 完整的目录路径名。 默认值: ORACLE_HOME/otrace/admin/fdf/ (根据操作系统而定) sql_trace: 说明: 禁用或启用 SQL 跟踪设备。如果设置为 TRUE, 将收集优化信息, 这些信息对改善性能很有用。由于使用 SQL 跟踪设备将引发系统开销, 只应在需要优化信息的情况下使用 TRUE。 值范围: TRUE | FALSE 默认值: FALSE oracle_trace_facility_name: 说明: 指定 Oracle Trace 产品定义文件名 (.fdf 文件名)。该文件包含可为使用 Oracle Trace 数据收集 API 的产品收集的所有事件和数据项的定义信息。Oracle 建议使用默认的文件 ORCLED.FDF。 值范围: 一个有效的设备名, 最长可有 16 个字符。 默认值: oracled max_dump_file_size: 说明: 指定每个跟踪文件的最大大小。如果您担心跟踪文件会占用太多空间, 可更改该限制。如果转储文件可以达到操作系统允许的最大大小, 请将该值指定为“无限制”。 值范围: 0 - 无限制 (可以用 'K' 或 'M' 为单位) 默认值: 10000 块 resource_limit: 说明: 确定是否在数据库概要文件中实行资源限制。如果设置为 FALSE, 将禁用资源限制。如果值为 TRUE, 即启用资源限制。 值范围: TRUE | FALSE 默认值: FALSE resource_manager_plan: 说明: 如果指定该值, 资源管理器将激活计划和例程的所有子项 (子计划, 指令和使用者组)。如果不指定, 资源管理器将被禁用, 但使用 ALTER SYSTEM 命令还可以启用。 值范围: 任何有效的字符串。 默认值: NULL sessions: 说明: 指定用户会话和系统会话的总量。默认数量大于 PROCESSES, 以允许递归会话。 值范围: 任何整数值。 默认值: 派生 (1.1 * PROCESSES + 5) java_soft_sessionspace_limit: 说明: 以字节为单位, 指定在 Java 会话中使用的 Java 内存 的 '软限制'。如果用户的会话持续时间 Java 状态使用过多的内存, Oracle 将生成一个警告并向跟踪文件写入一则消息。 值范围: 0 - 4GB 默认值: 0 cpu_count: 说明: Oracle 可用的 CPU 的数目 (用于计算其他参数值)。请勿更改该值。 值范围: 0 - 无限制。 默认值: 由 Oracle 自动设置 java_max_sessionspace_size: 说明: 以字节为单位, 指定可供在服务器中运行的 Java 程序所使用的最大内存量。它用于存储每次数据库调用的 Java 状态。如果用户的会话持续时间 Java 状态超过了该值, 则该会话会由于内存不足而终止。 值范围: 根据操作系统而定。 默认值: 0 processes: 说明: 指定可同时连接到一个 Oracle Server 上的操作系统用户进程的最大数量。该值应允许执行所有后台进程, 如: 作业队列 (SNP) 进程和并行执行 (Pnnn) 进程。 值范围: 6 到根据操作系统而定的一个值。 默认值: 由 PARALLEL_MAX_SERVERS 确定 control_file_record_keep_time: 说明: 控制文件中可重新使用部分中的记录必须保留的最短时间 (天数)。 值范围: 0 -365 默认值: 7 log_checkpoint_timeout: 说明: 指定距下一个检查点出现的最大时间间隔 (秒数)。将该时间值指定为 0, 将禁用以时间为基础的检查点。较低的值可以缩短例程恢复的时间, 但可能导致磁盘操作过量。 值范围: 0 - 无限制。 默认值: Oracle8i:900 秒。企业版: 1800 秒 recovery_parallelism: 说明: 指定参与例程或介质恢复的进程的数量。如果值为 0 或 1, 就表明恢复将由一个进程以串行方式执行。 值范围: 根据操作系统而定 (不能超过 PARALLEL_MAX_SERVERS)。 默认值: 根据操作系统而定 fast_start_mttr_target: 说明: 指定从单个数据库例程崩溃中恢复所需的时间 (估计秒数)。FAST_START_MTTR_TARGET 将在内部被转换为一组参数, 用于修改数据库的操作, 从而将它的恢复时间控制在总 "恢复平均时间 (MTTR)" 中的一定范围之内。只有具有 "快速启动故障恢复" 功能的版本才支持此参数。 值范围: [0, 3600]。它将计算数据缓冲区高速缓存条目数之上, 且大于最大日志中的块数的限值。 默认值: 0 log_checkpoints_to_alert: 说明: 指定将检查点信息记录到预警文件中。该参数对于确定检查点是否按所需频率出现很有用。 值范围: TRUE | FALSE 默认值: FALSE fast_start_io_target: 说明: 指定在系统崩溃或例程恢复期间需要的 I/O 数量。该值比 DB_BLOCK_MAX_DIRTY_TARGET 对恢复过程的控制更加精确。 值范围: 0 (禁用 I/O 恢复限制) 或 1000, 到高速缓存中的所有缓冲区数。 默认值: 高速缓存中的所有缓冲区数 log_checkpoint_interval: 说明: 指定在出现检查点之前, 必须写入重做日志文件中的 OS 块 (而不是数据库块) 的数量。无论该值如何, 在切换日志时都会出现检查点。较低的值可以缩短例程恢复所需的时间, 但可能导致磁盘操作过量。 值范围: 无限制 (指定 0 即可禁用该参数)。 默认值: 根据操作系统而定 log_buffer: 说明: 以字节为单位, 指定在 LGWR 将重做日志条目写入重做日志文件之前, 用于缓存这些条目的内存量。重做条目保留对数据
Toad 使用快速入门 目录 一.Toad功能综述 二.系统需求 三.安装指南 四.快速入门 1. Schema browser的用法简介 2. SQL Editor的使用介绍 3. Procedure Editor的用法介绍 4. 如何进行PLSQL的debug 5. 如何使用SQLab Xpert优化SQL 6. 如何使用SQL Modeler来编写查询 7. 如何使用Toad的DBA方面的功能 一、 Toad功能综述 在Oracle应用程序的开发过程中,访问数据库对象和编写SQL程序是一件乏味且耗费时间的工作,对数据库进行日常管理也是需要很多SQL脚本才能完成的。Quest Software为此提供了高效的Oracle应用开发工具-Toad(Tools of Oracle Application Developers)。在Toad的新版本中,还加入了DBA模块,可以帮助DBA完成许多日常管理工作。它最大的特点就是简单易用,访问速度快。使用Toad,我们可以通过一个图形化的用户界面快速访问数据库,完成复杂的SQL和PL/SQL代码编辑和测试工作。Toad由Oracle开发专家专门为开发人员而设计,是一个功能强大、结构紧凑的专业化PL/SQL开发环境。 Toad 主要具有如下特点: 模式浏览: 模式浏览功能可以让我们快速访问数据字典,浏览数据库中的表、索引、存储过程。Toad 提供对数据库的快速访问,使用极为方便,用户界面简洁,结构安排合理。当我们点击一个单独的数据库对象,Toad立即显示此对象的详细信息。例如,当我们点一个数据库的表,所有和此表相关的索引、约束、存储过程、SQL语句以及和其他表的相互引用关系都在同一界面显示出来。为了简化操作,用户可以在浏览窗口操作数据库对象。 SQL 编辑器: SQL 编辑器的主要功能是编辑、运行和调整SQL语句。TOAD 的高级编辑窗口包括众多的特性来提高开发人员编写SQL语句的产品化程度。例如,简单地生成代码模板,在编写SQL前自动发现包的内容和列的名字等等。 SQL编辑器包括一个编辑窗口和运行结果窗口,允许开发人员在编辑的过程中测试运行结果。SQL编辑器中不仅包括标准的编辑命令,也包括一些增强的功能,如快速查询表中的字段、将SQL语句的内容格式化等等。这个窗口可以处理大到4GB 的内容,对大的开发项目来说非常有用。便捷的书签可以让开发人员非常容易地找到相关位置。在运行结果窗口可提供用户定义的配置功能,支持LONG 和LONG RAW列,可以将数据卸出到磁盘、打印数据、编辑数据等等。 存储过程编辑器: 存储过程编辑器的主要功能是编辑、编译、测试、调试存储过程和触发器。TOAD提供语法标识、错误标识和其他很多易于使用的功能,如在弹出窗口显示表名、列名和Oracle函数。和其他的 PL/SQL 编辑工具不同,TOAD 允许在一个文件中操作多个数据库对象,可以编译一个对象、编译多个对象、编译到当前光标、从光标开始编译。在运行出现错误时,存储过程停止到有问题的语句。用户可以使用快捷方式或模板来快速编写PL/SQL,也可以根据需要生成自己的模板。使用Toad可以非常方便地进行编辑工作,可如设置书签、取消注释、格式化SQL语句等等。 PL/SQL Debugger选项: Toad 提供简单易用的PL/SQL 调试功能,可以节省开发人员在大型项目中用于开发和测试的宝贵时间,提高应用开发的质量。在存储过程开发的过程中,Toad可以逐行编辑、调试和运行代码。运行时可以根据需要输入参数,观察相关参数的变化来检查存储过程的正确性。在调式过程中,Toad 可以通过窗口显示所有的断点、参数, 调用堆栈和输出参数。使用Toad,非常容易检测到存储过程的错误,开发人员可以一步一步运行PL/SQL语句来识别问题。调试会话可以和其他程序会话同时进行。 SQLab Xpert Option: 帮助开发人员优化SQL,为他们提供各种优化模式下SQL执行计划,并且能够给出优化的建议,能够比较各种模式下实际的SQL运行结果,帮助开发人员真正高速地开发高效地代码。 Toad还可以外挂一些别的产品,比如PL/Formatter, RevealNet Knowledge Base , SQL Impact等,这些都能够和Toad紧密集成,共同提供了一个完美的集成开发环境。新版本还新增加了DBA模块,更加拓广了Toad这个产品的适用范围。 二、系统要求: 客户端:  Windows 95 / 98 / NT/2000中英文均可 完整安装的SQL*Net 2.0或者Net8  磁盘:一般安装需要20M左右的空间,根据所选择模块的不同和安装方式的不同,最少也要5M的磁盘空间(从网络服务器读取)  内存:Windows 9x/Me:16M 内存;Windows NT/2000: Min 32M]  Tuning模块需要额外的25M空间 服务器端: Oracle 7.3 或者更高,在任何硬件平台上。  需要一个DBA用户帐号 三.安装: 1. 三种安装方式的选择: a) TOAD and Personal Configuration Files to PC 默认安装选择,完成一个完整的Client端的安装,把所有需要的文件拷贝到本地Toad目录。 绝大多数用户应该选择使用这个安装方式。 b) Personal Config Files to PC, read TOAD from Network Server 从网络服务器读取Toad程序,在本地计算机安装一些自定义的文件,并且创建到服务器文件的快捷方式,一般不推荐使用这个方式,而且要求网络服务器已经配置。 c) TOAD to Network Server 把Toad安装到网络服务器上,以便这样别的用户能够进行Personal Config Files to PC, read TOAD from Network Server这种方式的安装。 2. 根据需要使用到的特性,需要运行一些脚本(都在Toad\temps目录下)  如果需要用Toad来查看执行计划,必须运行脚本PrepToad.sql或者notoad.sql 如果希望专门建立一个Toad 用户来存放Toad需要使用对象的话,就运行preptoad.sql。  如果希望在当前连接用户模式下建立toad需要使用对象的话,就运行notoad.sql。  注意,如果是选择了专门建立toad这个用户的话,需要先修改一下脚本,指定用户的默认表空间和临时表空间。 需要使用Oracle8i 的Profile analyzer,必须运行ToadProfiler.sql  需要加强Toad的安全性,必须运行ToadSecurity.sql 四、Toad使用快速入门 1. Schema Browser: Schema browser是Toad的极为有特色的模块。在schema browser的帮助下,可以方便的浏览数据库内部的各类数据库对象,比如表,索引,序列,存储过程等,而且可以方便的倒出DDL语句和进行各种修改,重建工作。定位到某一类对象上,这列对象允许的操作都会自动列出来。 特色: 支持Oracle数据库里面所有对象的新建、查看、修改,集成了几乎对所有数据库对象的管理所需要的功能。  按照 模式->对象类别 ->对象->对象可操作属性 -> 对象本身的详细信息和对象相关的信息 来组织,非常有条理,容易定位对象,也能够看到所有你需要的对象的相关信息。 对于表: i. 完备的建表向导,不用输入冗长的语法,更加全面地替你考虑。 ii. 可以修改表的各种逻辑和物理属性,修改列的属性,增加列,删除列(在Oracle8i里面),修改表的物理存储属性,Truncate,Drop等。 iii. 可以生成建表的完整的DDl语句,包括存储信息,权限信息,约束,索引和触发器等,而这些手工很难做到。 iv. 可以方便的对表进行分析,查看表地所有信息,可以有条件的倒出表里面的数据,并且保存为sql语句。 v. 可以方便的对表进行重组,可以完成exp/imp作不到的事情,而且更少地人工参与,更加安全。 对于视图,存储过程: i. 可以保存建立视图、存储过程的语句为文本, ii. 重新编译失效的视图,存储过程,修改视图的定义语句等。方便的查看存储过程的代码,相互依赖关系,权限信息等保存为文本等。  回滚段, i. 简洁明了的online,offline状态,方便地online/offline操作 ii. 详细的回滚段物理信息和当前状态。 iii. 可以方便的修改物理存储属性 表空间: i. Tablespace Map;直观的显示数据物理的在表空间上的分布 ii. 直观的查看各个表空间的利用率、剩余空间、破碎情况等信息 iii. 可以进行各种alter操作:online, offline, 增加数据文件,改变数据文件大小,改变物理存储属性等 对其他数据库对象也有完备的操作支持。 2. SQL Editor: a) 激活SQL Editor的三种方式: i. 连接到数据库之后,Toad自动打开SQL Editor这个窗口。 ii. 点击总工具栏上最左边的那个按钮 iii. 从菜单栏:Database -> SQL Editor b) 特点:  允许同时打开多个编辑窗口,同时编辑多个SQL语句 支持同时连接到多个数据库,同时对多个数据库进行操作  允许编辑SQL,PLSQL,JAVA,HTML和文本 使用书签功能,可以在大量SQL语句里,快速定位某个语句所在位置  SQL Editor本身具有强大的编辑功能,非常方便编辑SQL语句。  强大的快捷键支持和工具栏快速按钮的支持,更加高效编写(很多快捷键可以自己定义,在View ->options ->SQL Editor里面) 能够根据前面的条件,智能推测需要输入的代码,可以做到某种程度的代码智能填充  把鼠标定位到表/视图/存储过程名称之上,按F4,可以打开对象描述窗口,方便的查看表和视图的定义,存储过程的源代码,  非常容易对SQL语句的分析其执行计划:单击工具栏上的 按钮就可以看到Explain Plan的结果  支持部分SQL*Plus命令,可以方便的执行大量的为SQL*Plus编写的数据库脚本 可以通过SQLab xpert来对当前SQL语句进行全面的分析,给出各种合理的调优意见,只需要单击工具栏上的Tuning按钮:  可以方便的保存,打开和运行SQL脚本 支持对查询结果进行修改,  可以把查询结果以多种格式保存起来,可以保存为HTML,纯文本,XLS等多种格式 很容易的得到SQL函数的列表和用法描述(Show SQL help Window 按钮) 可以查看SQL语句的执行情况:通过下方的AutoTrace窗口 ,看到SQL语句的实际执行结果和执行效率。 支持历史SQL(F8) :可以方便的查询以前执行过的SQL,不用反复重新输入。  可以执行匿名块,存储过程,从下方的窗口看到DBMS_OUTPUT的结果,如: 3. Stored Procedure Editor a) 打开存储过程编写器的几个途径: 单击总菜单栏上的第三个按钮:   点击Database - > Procedure Editor , 可以通过Schema browser来调用 b) 一些特点和优点: 1. 强大的自定义设置:从保留字的显示方式,到自动替换,到各种快捷键的定义等等,用得越熟越顺手。 2. 3. 自动用不同颜色显示SQL和PL/SQL关键字,语法清晰明了,可根据自己的习惯来具体定制各类关键字的具体显示方式。可以自定义存储过程得模板,在新建存储过程的时候,自动生成程序的框架可以方便的调用Schema Browser,把鼠标定位于某个对象上,F4,Schema Browser打开该对象的详细描述,帮助顺利快速开发程序。支持代码自动更正,如输入ndf,自动替换成NO_DATA_FOUND,输入the自动替换成the,类似的自动替换还可以自己修改和添加。 7. 方便的左边行号显示,单击左边行号就可以实现调试断点的增加/删除 8. 对各种快捷键的支持,不但包括常见的编辑操作,还可以有自己定义的PLSQL块的支持(自己定义快捷方式)。如可以定义CTRL+SHIFT+D:弹出所有PLSQL Block的类型,可以自己选择。 9. 可以在一个集成开发环境里面,一边编码,一边调试,不用多处切换 10. 方便的同时打开多个存储过程,通过页面快速切换 11. 快速编译存储过程,快速定位错误所在,自己选择是否同时编译依赖的存储过程 12. 内置对PL/Formatter,可以用PL/Formatter对存储过程进行格式化,并且可以提供存储过程的概要分析和修改建议 PL/Formatter可以对现有的存储过程进行高速的格式化,使所有的存储过程都符合同样的编写标准,这样既有利于提高程序的可读性,避免不同人写的模块的风格上的很差异。 PL/Formatter 还有助于提高程序的模块化,增强程序的结构清晰度,增强SQL的共用性。 PL/Formatter 还可以帮助完成PL/SQL和Oracle版本之间的管理。 13. 内置RevealNet Knowledge Base,单击鼠标右键就可以打开,快速得到技术上的支持,解决技术难题 PL/SQL: 包含整个开发过程中可能遇到问题的答案 Code Library:大量的严谨的PL/SQL代码例子和现成过程,完全源代码提供 各种错误处理模块可供参考,各类字符日期函数 包含1400多个主题 Admin: 解答DBA日常工作中80%的常见问题,覆盖2400多个主题 从网络到性能优化,从备份恢复到Error message,一应俱全 例子:遇到失效的存储过程怎么办? 4. 如何对存储过程进行Debug?  需要Toad单独的Debug Option(Standard Version 没有这个选项)  要用Toad对存储过程进行debug,必须安装Oracle的系统包:dbms_debug,而且必须安装Oracle Probe API v2.0 或者更高的版本。 集成在Stored Precedure Editor里面,可以一边编写一边调试,大大提高开发效率  打开Procedure Editor后,Debug菜单激活,可以开始进行Debug工作。  允许对存储过程进行逐行调试、断点调试,也支持对触发器进行调试。 可以有断点支持,支持Watch变量,允许运行时改变变量的值  允许对多层调用的Debug支持 调试步骤具体举例: 1. 点击菜单栏的第三个按钮: ,打开Procedure Editor 2. 点击Procedure Editor的菜单栏的 按钮,调出需要调试的存储过程 3. 单击工具栏上的按钮 ,输入需要传入的参数,如果不需要传入参数,可以直接单击工具栏上的按钮: ,直接开始调试,如下图输入传入参数: 4. 单击菜单栏的按钮: ,可以单步跟踪,也可以定义一个断点,直接运行到断点在单步执行,在存储过程运行的过程中,当前语句会高亮度显示,并且把鼠标指针定位到变量上,Toad自动显示该变量的当前值。 5. 可以随时中止程序的执行,只要点Debug ->Halt Execution,或者菜单栏上的按钮 ,就可以中止程序的执行 6. 当碰到一个存储过程调用另外一个存储过程的时候,可以选择跳过(Step Over) ,这样就直接运行那个被调用的存储过程,返回调用结果,继续这个存储过程的调试,也可以选择Trace Into ,这样就打开被调用的存储过程,进一步深入调试那个被调用的子存储过程。如果需要保持Debug信息,在编译的时候应该选择Compile Dependencies with Debug Information,就是Procedure Editor工具栏最右边的那个按钮 。 7. 支持对变量实时追踪:使用Watch: 可以在运行前,或者运行过程中对某个变量进行实时跟踪:Add Watch,把鼠标定位到该变量上,然后点击Debug ->Add Watch At Cursor,该变量就会出现在Debug状态窗口上,而且实时反应该变量的当前值。如上图中的变量v_empname。可以运行时刻修改 8. 断点支持: 单击存储过程需要加断点的地方的行号,该行颜色变红,输入参数,单击执行按钮 ,可以直接运行到断点处,可以不必逐行追踪,更加高效率的进行调试。 Debug Option还支持条件断点,只有当满足条件的时候才会在那个地方停止,否则就好像不存在这个断点一样继续运行。  注意DBMS_OUTPUT.PUT_LINE的结果只有当程序执行完成以后才会出现,在程序执行过程中是没有结果的。 4. 如何用SQLab Xpert对存储过程进行调优? 我们知道,Oralce数据库的优化,最主要的步骤就在于SQL的优化。而在没有专门的工具(如Toad)的帮助下,进行SQL优化是一件非常困难和乏味的事情,并且需要对Oracle的深入理解和高超的Oracle调优技巧。使用Toad的SQLab Xpert Tuning模块,可以使我们普通开发人员也能够非常快速,精确的对SQL进行专家级的分析 在SQL Editor和Procedure Editor里面,选中需要调试的SQL语句(SQLab Xpert只能调试Select,Insert, Update,Delete语句),复制到SQL Editor里面,然后点击工具栏上的调优按钮 ,Toad会自动打开SQLab xpert 窗口,捕获当前的SQL语句,并且把它转化为符合explain plan格式的语句。 第一次打开Xpert的时候,Toad会提示你,需要安装一些Server端的表、视图和包等对象,可以把表存储到某个指定的表空间(如Tools)里面。可以简单的按照提示一步一步做就可以了。如果系统设定不允许Job的话(Job_queue_process=0),Toad提示有些部件不会现在安装,可以忽略。安装完成以后,可以选择让某些非DBA用户也可以使用Toad的SQLab Xpert调优功能。 安装完成以后,Toad会提示你一些关于优化目标方面的问题,你可以选择每次优化都可以重新设定,或者一次设定,以后一直使用这个设定。当然如果需要,还是可以更改的,在SQLab Option xpert的窗口的Administration和Preference下面重新设定。 例子: 下面这个SQL语句涉及到多表之间的关联,有一定的复杂性,我们可以借助Toad的SQLab Xpert Option来帮助分析: select a.name. b.name, c.emp_name from dep a, manager b,emp c where a.dep_no=c.DEP_NO and b.manag_id=c.manag_id and c.emp_no=3 我们把这个SQL复制到SQL Editor里面,单击上面的调优按钮,Toad打开SQLab Xpert Option窗口。 如下图: 从上面的图中我们可以方面的看到:在各种优化模式下,该SQL语句的执行计划分别是什么样的,Toad给出了每一种执行计划的具体每一个步骤,每个步骤的成本,该表涉及的相关的数据等,如果SQL存取的表还没有经过分析,Toad会以红色警告显示,并且很方便的帮助你对该表进行分析,收集统计数据,重建索引等,以有助于优化器作出最好的选择。可以把当前的分析结果保存到它的资料库里边,以备以后再次调用之需。 我们还可以求助与SQLab 的自动优化功能:点击Original SQL下面的auto tune按钮,Toad会对执行结果按照tkprof进行分析(当然,这需要你在initsid.ora里面设置好utl_file_dir,如果服务器是在Unix机器上的话,还需要通过FTP方式得到Trace文件,有一些小小的设置)。 自动优化非常高效的对所有执行计划进行实际运行比较,并且给出实际执行的时间的对比,如下图: 我们还可以让Toad给出实际的优化建议:点击Original SQL,单击下面的Advice按钮,Toad根据对SQL的分析和执行结果给出合理的建议: 如: 1. 把表和索引分别放到两个不同的表空间,因为我们在创建表,加上约束的时候没有指定USING INDEX子句,所以表和索引都建立在了用户的默认表空间上了。 2. 对表EMP,DEP和MANAGER进行分析,收集最新的统计数据,有利于CBO得到最优的执行计划 3. 在合适的列上创建索引:EMP的manag_id和dep_no。当表中存在大量的数据的时候,这样可以大大减少由于全表扫描带来的成本。 5. SQL Modeler: SQL Modeler可以帮助开发人员很容易的写出各种复杂的SQL语句,只需通过简单的拖动鼠标,就能够写出复杂的SQL语句来。 打开SQL Modeler的几个途径: i. 菜单栏 Database -> SQL Modeler ,打开窗口 ii. 单击工具栏第四个按钮 ,打开SQL Modeler窗口 窗口由三个主要部分组成:  表选择区域:最右边的那个部分,用来选择From子句中用到的表。拖动到左边的区域或者双击就选择了该表。  表模型区域:用来图形化的显示选择的表和表之间的关联关系。  生成SQL区域:这里显示用图形化方式创建的查询对应的SQL语句, 在SQL Modeler里面,还支持对生成的SQL进行Explain Plan,调试SQL的性能,运行SQL,看是否得到了希望的结果,保存生成的语句,或者把语句粘贴到SQL Editor里面。 有了SQL Modeler的帮助,即使是初级的程序员也能编写出复杂而又高效的SQL查询来。 比如下面的例子; 生成步骤: 1. 选出表emp, dep, manager 2. 用鼠标拖住emp的emp_name和emp_no, dep的name,manager的name 3. 双击criteria窗口的emp_no condition列,弹出窗口,输入查询条件,比如emp_no=3 4. 由于结果里面不希望emp_no出现,双击emp_no列的visible,设置为false 5. 这样就出来了需要的查询,现在可以运行查询得到结果,对查询SQL进行分析,或者在SQL Editor里面打开这个SQL,或者保存为SQL Model文件,或者再进一步处理,比如加排序, 汇总等。 DBA方面的功能: Toad在DBA日常管理方面的能力是非常强大的,可以帮助DBA安全快速地完成许多日常工作,还有Toad特有的一些小工具能完成一些普通方法很难做到的功能。下面大概讲述了各个常用模块的主要功能: a) Database Monitor 提供直观的Oracle数据库运行状况,包括下面这些详细信息: 可以看到逻辑IO,物理IO,各个状态的session数目,SGA的利用率,共享池的使用状况,各类事件的等待状况,以及各类事件随着时间的变化情况 b) Instance Monitor i. 可以用来检查本地tnsnames.ora文件里面定义的所有节点、Listener和数据库的运行状态和版本等相关信息。 ii. 可以远程启动、关闭数据库(如果设置了password验证方式) c) Unix Monitor: i. 可以监控Unix机器的运行状况比如详细的机器启动时间,CPU利用率,主要的进程以及这些进程占用的资源,主要的磁盘IO等。 d) Trace/Kill session i. 方便的查看所有的连接用户相关信息:比如终端,程序,连接时间等 ii. 对某个用户进行跟踪,查看用户执行的SQL语句,查看语句的执行计划, iii. 方便的查阅系统的Lock对象,有没有什么等待别的事务释放锁的情况,并能够轻易查出等待什么用户的什么事件结束,那个用户执行的是什么SQL。 iv. 查看回滚段的使用状态,什么用户,什么语句,使用的什么回滚段,多少读写量等 e) Oracle Parameter i. 可以方便的查看Oracle系统的参数:是否默认值,参数作用的简要描述,是否可以用alter session/alter system来动态改变,对于那些可以动态改变的参数,可以双击鼠标来进行修改 f) NLS_PARAMETER: i. 方便的查看session,instance,database一级的NLS参数值, ii. 可以动态修改session的NLS参数值 g) Extents i. 可以查看某个用户下的表和索引的详细的存储情况, ii. 发现那些占用大量空间的表和索引,可以考虑使用相应的对策,比如分区 iii. 发现那些即将达到max_extents的表和索引并可以及时纠正 iv. 发现那些索引和表处于同一个表空间的情况,并可以及时纠正。 h) Tablespace i. 直观的查看每个表空间的利用率,总空间,已使用空间,剩余可是用空间以及默认存储参数,和表空间是否需要整理等信息 ii. 查看每个表空间的状态,组成的数据文件, 以及每个数据文件的详细信息 iii. 查看每个表空间里面存在的对象和这些对象的详细存储特性 i) Tablespace Map: i. 图形化的显示表空间里面各个表/索引所占用的空间,各个segment的大小,segment是否连续等信息,非常直观 ii. j) Server Statistics: i. 可以非常直观的看到系统总体运行情况,迅速定位系统瓶颈所在 ii. 可以查看系统范围内各类等待事件的状况,查看每个连接会话的状况, k) Pinned Code: i. 我们知道,频繁执行的大的存储过程最好Pin起来,这样可以避免被Oracle在内存不足的情况下换出内存,避免动态加载,也避免flush shared pool的时候被清出内存。 ii. 根据每个模块的大小,执行次数,决定是否要把某个存储过程PIN起来。一个按钮就搞定了。 l) Control Files: 可以查看当前系统有哪几个控制文件,以及控制文件内部记录的详细信息。 (实际上就是V$CONTROLFILE, V$CONTROLFILE_RECORD_SECTION) m) Redo Log Manager: i. 可以方便的查看LOG的组,当前日志,每个组里面的成员名字,大小,方便的增加、删除log组,切换当前日志,对日志归档进行具体的控制。 ii. 可以在这个界面里完成几乎所有的对redo log的操作。 n) Repair chained rows: i. Chained rows影响系统性能,处于系统性能的考虑,需要把chained rows修复成普通的表的行。使用repaie chained rows,就可以比较容易的做到这一点。选择需要分析的表,然后分析一下,看有没有chained rows,如果有,点击repair,Toad就帮你把那些chained rows给修复了。 o) Identify Space Deficits 如果系统出现1659,1653错误,就是一个不合格的DBA。但是要即时预见这些错误,还是有一定的难度的。有了Toad的这个小工具之后,一点某个表空间,就知道这个表空间里面的剩余自由空间是否允许任何表能够扩展到下一个extent。并能够在发现问题之后,直接改正问题。 p) Estimate Table/Index Size i. 数据库的物理规划中,表/索引的存储子句的定义是非常重要的,影响系统。但是没有什么工具的话,要为表定义合理的存储子句也不容易。 ii. 在Toad里面,专门有工具帮助你合理定义表/索引的存储情况: 1. 自己可以定义将来表中需要存储的数据的数目 2. 多种估计方式: a) 根据对已有的数据的分析来定义表的大小(最精确,但是比较慢) b) 根据表定义数据类型来定义表的大小 c) 根据数据字典中以前分析过的数据来估计大小(需要近期分析过该表) q) Analyze All Tables i. 基于CBO的SQL需要CBO提供最优化的执行路径来提高程序的执行效率,但是假如对表进行大量的DML操作之后,不及时更新表的统计数据,这时候CBO就不能选择最为有效的执行路径,导致程序执行效率低。 ii. 手工分析表比较麻烦,一个一个做。 iii. 用Toad的Analyze Alltables这个工具,可以一次分析整个模式下面的所有表,有丰富的控制选项,包括是采用估计还是完全,是否同时分析索引,估计的话,采用多大的百分比等。 r) Rebuild Table i. 当表中的数据被反复大量的DML之后,而且PCTFREE和PCTUSED定义的不合理的情况下,表可能会变得非常破碎,占用大量的extent,索引也会相当破碎,导致效率相当低下。 ii. 传统的方式是通过exp/imp来解决这个问题,但是步骤实在比较麻烦,手工操作也有一定的危险性。 iii. 使用Rebuild Table工具,轻松搞定,而且可以手工修改一些通过EXP/IMP无法修改的参数,比如freelists ,freelists group, tablespace,initial等,还能够更改列的名字。 s) Relocate Index i. 我们知道,表和索引一般都需要分开存放到不同的表空间,这样比较便于管理,性能上也会有一定的提高,因为可以对表和索引同时存取。 ii. 但是实际上很多时候,由于这样那样的原因,常常忽略了索引单独存放这个基本概念,比如建立主键约束的时候没有加USING INDEX子句,后来disable/enable了主键约束/唯一性约束等,都会导致把索引直接存放到和表同一个表空间里面。 iii. 手工发现这些索引,再逐个移动非常麻烦,容易出错,在Toad里面,就很容易根据用户/表空间来发现那些不恰当存放的索引,可以批量移动这些索引,并且允许重新定义索引的存储子句。 t) Generate Schema Scripts: i. 可以用来生成整个用户下所有/部分对象的DDL语句。可以把结果保存为sql语句或者保存为TOAD的自定义格式。 ii. 可以用来复制表结构,(EXP/IMP有非常严重的缺陷,就是从一个大的数据库倒出的表结构,无法导入到一个小的数据库里面,因为里面包含了原来表的存储信息,即使选择rows=N,也要在导入数据库里面占用相当大的空间) u) Compare Schema: i. 在开发的时候,有时候同时在几个开发库上开发,但是最后两个库的结构不完全一样,很难比较 ii. 用TOAD的这个功能,可以对两个数据库的模式(用户)下面的所有对象(包括存储过程)进行比较,可以选择具体的比较内容。 iii. 可以通过直接打开两个到各自数据库的连接,或者根据Toad generate schame scripts生成的文件进行对比。 iv. 可以直接生成同步两个数据库的sql脚本,给出汇总的区别简要和详细报告等。
CruiseYoung提供的带有详细书签的电子书籍目录 http://blog.csdn.net/fksec/article/details/7888251 该资料是《Oracle SQL高级编程》的源代码 对应的书籍资料见: Oracle SQL高级编程(资深Oracle专家力作,OakTable团队推荐) 基本信息 原书名: Pro Oracle SQL 原出版社: Apress 作者: (美)Karen Morton    Kerry Osborne    Robyn Sands    Riyaj Shamsudeen    Jared Still    译者: 朱浩波 丛书名: 图灵程序设计丛书 出版社:人民邮电出版社 ISBN:9787115266149 上架时间:2011-11-9 出版日期:2011 年11月 开本:16开 页码:502 版次:1-1 主编推荐     资深Oracle专家力作,OakTable团队推荐     全面、独到、翔实,题材丰富     Oracle开发人员和DBA必备 内容简介     Oracle 数据库中的SQL是当今市场上功能最强大的SQL实现之一,而本书全面展示了这一工具的威力。如何才能让更多人有效地学习和掌握SQL呢?Karen Morton及其团队在本书中提供了专业的方案:先掌握语言特性,再学习Oracle为提升语言效率而加入的支持特性,进而将两者综合考虑并在工作中加以应用。作者通过总结各自多年的软件开发和教学培训经验,与大家分享了掌握Oracle SQL所独有的丰富功能的技巧所在,内容涵盖SQL执行、联结、集合、分析函数、子句、事务处理等多个方面。读者可以学习到以下几个方面的技巧:     掌握Oracle数据库中独有的SQL强大特征;     读取并理解SQL执行计划;     快速分析并改进表现欠佳的SQL;     通过提示及配置文件等来控制执行计划;     在程序中优化查询而无需改动代码。     作为Oracle SQL经典著作之一,本书为SQL开发人员指明了前行的方向,赋予了他们不断开拓的动力。 作者简介     KAREN MORTON 研究人员、教育家及顾问,Fidelity信息服务公司的资深数据库管理员和性能调优专家。她从20世纪90年代初就开始使用Oracle,从事 Oracle的教学工作也已经超过10年的时间。她是Oracle ACE,也是OakTable(Oracle社区中著名的“Oracle科学家”的非正式组织)的成员,经常在技术会议上演讲。她的著作还包括 Expert Oracle Practices和Beginning Oracle SQL,博客主页是karenmorton.blogspot.com。     KERRY OSBORNE  专注于Oracle咨询的Enkitec公司的创始人之一。从1982年开始使用Oracle(第2版)。他当过开发人员,也做过DBA,目前是 Oracle ACE总监和OakTable成员。最近几年,他专注于研究Oracle内部原理以及解决性能问题。他的博客主页是 kerryosborne.oracle-guy.com。     ROBYN SANDS 思科公司的软件工程师,为思科的客户设计开发嵌入式Oracle数据库产品。从1996年开始使用Oracle,在应用开发、大型系统实现以及性能评估方面具有丰富的经验。她是OakTable的成员,同时是Expert Oracle Practices (2010年 Apress出版)一书的合著者。     RIYAJ SHAMSUDEEN 专注于性能/数据恢复/电子商务的咨询公司OraInternals的首席数据库管理员和董事长。有近20年使用Oracle技术产品以及Oracle数据库管理员/Oracle数据库应用管理员的经验,是真正应用集群、性能调优以及数据库内部属性方面的专家。同时是一位演讲家及Oracle ACE。     JARED STILL 从1994年就开始使用Oracle。他认为对于SQL的学习是永无止境的,相信每一个查询Oracle数据库的人都需要精通SQL语言,才能写出高效的查询。他参与本书的编写就是为了帮助别人实现这一目标。 目录 封面 -11 封底 -10 扉页 -9 版权 -8 版权声明 -7 致谢 -6 目录 -5 第1章 SQL核心 1 1.1 SQL语言 1 1.2 数据库的接口 2 1.3 SQL*Plus 回顾 3 1.3.1 连接到数据库 3 1.3.2 配置SQL*Plus环境 4 1.3.3 执行命令 6 1.4 5 个核心的SQL语句 8 1.5 SELECT语句 8 1.5.1 FROM子句 9 1.5.2 WHERE子句 11 1.5.3 GROUP BY子句 11 1.5.4 HAVING子句 12 1.5.5 SELECT列表 12 1.5.6 ORDERBY子句 13 1.6 INSERT语句 14 1.6.1 单表插入 14 1.6.2 多表插入 15 1.7 UPDATE语句 17 1.8 DELETE语句 20 1.9 MERGE语句 22 1.10 小结 24 第2章 SQL执行 25 2.1 Oracle架构基础 25 2.2 SGA-共享池 27 2.3 库高速缓存 28 2.4 完全相同的语句 29 2.5 SGA-缓冲区缓存 32 2.6 查询转换 35 2.7 视图合并 36 2.8 子查询解嵌套 39 2.9 谓语前推 42 2.10 使用物化视图进行查询重写 44 2.11 确定执行计划 46 2.12 执行计划并取得数据行 50 2.13 SQL执行——总览 52 2.14 小结 53 第3章 访问和联结方法 55 3.1 全扫描访问方法 55 3.1.1 如何选择全扫描操作 56 3.1.2 全扫描与舍弃 59 3.1.3 全扫描与多块读取 60 3.1.4 全扫描与高水位线 60 3.2 索引扫描访问方法 65 3.2.1 索引结构 66 3.2.2 索引扫描类型 68 3.2.3 索引唯一扫描 71 3.2.4 索引范围扫描 72 3.2.5 索引全扫描 74 3.2.6 索引跳跃扫描 77 3.2.7 索引快速全扫描 79 3.3 联结方法 80 3.3.1 嵌套循环联结 81 3.3.2 排序-合并联结 83 3.3.3 散列联结 84 3.3.4 笛卡儿联结 87 3.3.5 外联结 88 3.4 小结 94 第4章 SQL是关于集合的 95 4.1 以面向集合的思维方式来思考 95 4.1.1 从面向过程转变为基于集合的思维方式 96 4.1.2 面向过程vs.基于集合的思维方式:一个例子 100 4.2 集合运算 102 4.2.1 UNION和UNION ALL 103 4.2.2 MINUS 106 4.2.3 INTERSECT 107 4.3 集合与空值 108 4.3.1 空值与非直观结果 108 4.3.2 集合运算中的空值行为 110 4.3.3 空值与GROUP BY和ORDER BY 112 4.3.4 空值与聚合函数 114 4.4 小结 114 第5章 关于问题 116 5.1 问出好的问题 116 5.2 提问的目的 117 5.3 问题的种类 117 5.4 关于问题的问题 119 5.5 关于数据的问题 121 5.6 建立逻辑表达式 126 5.7 小结 136 第6章 SQL执行计划 137 6.1 解释计划 137 6.1.1 使用解释计划 137 6.1.2 理解解释计划可能达不到目的的方式 143 6.1.3 阅读计划 146 6.2 执行计划 148 6.2.1 查看最近生成的SQL语句 149 6.2.2 查看相关执行计划 149 6.2.3 收集执行计划统计信息 151 6.2.4 标识SQL语句以便以后取回计划 153 6.2.5 深入理解DBMS_XPLAN的细节 156 6.2.6 使用计划信息来解决问题 161 6.3 小结 169 第7章 高级分组 170 7.1 基本的GROUP BY用法 171 7.2 HAVING子句 174 7.3 GROUP BY的“新”功能 175 7.4 GROUP BY的CUBE扩展 175 7.5 CUBE的实际应用 179 7.6 通过GROUPING()函数排除空值 185 7.7 用GROUPING()来扩展报告 186 7.8 使用GROUPING_ID()来扩展报告 187 7.9 GROUPING SETS与ROLLUP() 191 7.10 GROUP BY局限性 193 7.11 小结 196 第8章 分析函数 197 8.1 示例数据 197 8.2 分析函数剖析 198 8.3 函数列表 199 8.4 聚合函数 200 8.4.1 跨越整个分区的聚合函数 201 8.4.2 细粒度窗口声明 201 8.4.3 默认窗口声明 202 8.5 Lead和Lag 202 8.5.1 语法和排序 202 8.5.2 例1:从前一行中返回一个值 203 8.5.3 理解数据行的位移 204 8.5.4 例2:从下一行中返回一个值 204 8.6 First_value和Last_value 205 8.6.1 例子:使用First_value来计算最大值 206 8.6.2 例子:使用Last_value来计算最小值 207 8.7 其他分析函数 207 8.7.1 Nth_value(11gR2) 207 8.7.2 Rank 209 8.7.3 Dense_rank 210 8.7.4 Row_number 211 8.7.5 Ratio_to_report 211 8.7.6 Percent_rank 212 8.7.7 Percentile_cont 213 8.7.8 Percentile_disc 215 8.7.9 NTILE 215 8.7.10 Stddev 216 8.7.11 Listagg 217 8.8 性能调优 218 8.8.1 执行计划 218 8.8.2 谓语 219 8.8.3 索引 220 8.9 高级话题 221 8.9.1 动态SQL 221 8.9.2 嵌套分析函数 222 8.9.3 并行 223 8.9.4 PGA大小 224 8.10 组织行为 224 8.11 小结 224 第9章 Model子句 225 9.1 电子表格 225 9.2 通过Model子句进行跨行引用 226 9.2.1 示例数据 226 9.2.2 剖析Model子句 227 9.2.3 规则 228 9.3 位置和符号引用 229 9.3.1 位置标记 229 9.3.2 符号标记 230 9.3.3 FOR循环 231 9.4 返回更新后的行 232 9.5 求解顺序 233 9.5.1 行求解顺序 233 9.5.2 规则求解顺序 235 9.6 聚合 237 9.7 迭代 237 9.7.1 一个例子 238 9.7.2 PRESENTV与空值 239 9.8 查找表 240 9.9 空值 242 9.10 使用Model子句进行性能调优 243 9.10.1 执行计划 243 9.10.2 谓语前推 246 9.10.3 物化视图 247 9.10.4 并行 249 9.10.5 Model子句执行中的分区 250 9.10.6 索引 251 9.11 子查询因子化 252 9.12 小结 253 第10章 子查询因子化 254 10.1 标准用法 254 10.2 SQL优化 257 10.2.1 测试执行计划 257 10.2.2 跨多个执行的测试 260 10.2.3 测试查询改变的影响 263 10.2.4 寻找其他优化机会 266 10.2.5 将子查询因子化应用到PL/SQL中 270 10.3 递归子查询 273 10.3.1 一个CONNECT BY的例子 274 10.3.2 使用RSF的例子 275 10.3.3 RSF的限制条件 276 10.3.4 与CONNECT BY的不同点 276 10.4 复制CONNECT BY的功能 277 10.4.1 LEVEL伪列 278 10.4.2 SYS_CONNECT_BY_PATH函数 279 10.4.3 CONNECT_BY_ROOT运算符 281 10.4.4 CONNECT_BY_ISCYCLE伪列和NOCYCLE参数 284 10.4.5 CONNECT_BY_ISLEAF伪列 287 10.5 小结 291 第11章 半联结和反联结 292 11.1 半联结 292 11.2 半联结执行计划 300 11.3 控制半联结执行计划 305 11.3.1 使用提示控制半联结执行计划 305 11.3.2 在实例级控制半联结执行计划 308 11.4 半联结限制条件 310 11.5 半联结必要条件 312 11.6 反联结 312 11.7 反联结执行计划 317 11.8 控制反联结执行计划 326 11.8.1 使用提示控制反联结执行计划 326 11.8.2 在实例级控制反联结执行计划 327 11.9 反联结限制条件 330 11.10 反联结必要条件 333 11.11 小结 333 第12章 索引 334 12.1 理解索引 335 12.1.1 什么时候使用索引 335 12.1.2 列的选择 337 12.1.3 空值问题 338 12.2 索引结构类型 339 12.2.1 B-树索引 339 12.2.2 位图索引 340 12.2.3 索引组织表 341 12.3 分区索引 343 12.3.1 局部索引 343 12.3.2 全局索引 345 12.3.3 散列分区与范围分区 346 12.4 与应用特点相匹配的解决方案 348 12.4.1 压缩索引 348 12.4.2 基于函数的索引 350 12.4.3 反转键索引 353 12.4.4 降序索引 354 12.5 管理问题的解决方案 355 12.5.1 不可见索引 355 12.5.2 虚拟索引 356 12.5.3 位图联结索引 357 12.6 小结 359 第13章 SELECT以外的内容 360 13.1 INSERT 360 13.1.1 直接路径插入 360 13.1.2 多表插入 363 13.1.3 条件插入 364 13.1.4 DML错误日志 364 13.2 UPDATE 371 13.3 DELETE 376 13.4 MERGE 380 13.4.1 语法和用法 380 13.4.2 性能比较 383 13.5 小结 385 第14章 事务处理 386 14.1 什么是事务 386 14.2 事务的ACID属性 387 14.3 事务隔离级别 388 14.4 多版本读一致性 390 14.5 事务控制语句 391 14.5.1 Commit(提交) 391 14.5.2 Savepoint(保存点) 391 14.5.3 Rollback(回滚) 391 14.5.4 Set Transaction(设置事务) 391 14.5.5 Set Constraints(设置约束) 392 14.6 将运算分组为事务 392 14.7 订单录入模式 393 14.8 活动事务 399 14.9 使用保存点 400 14.10 序列化事务 403 14.11 隔离事务 406 14.12 自治事务 409 14.13 小结 413 第15章 测试与质量保证 415 15.1 测试用例 416 15.2 测试方法 417 15.3 单元测试 418 15.4 回归测试 422 15.5 模式修改 422 15.6 重复单元测试 425 15.7 执行计划比较 426 15.8 性能测量 432 15.9 在代码中加入性能测量 432 15.10 性能测试 436 15.11 破坏性测试 437 15.12 通过性能测量进行系统检修 439 15.13 小结 442 第16章 计划稳定性与控制 443 16.1 计划不稳定性:理解这个问题 443 16.1.1 统计信息的变化 444 16.1.2 运行环境的改变 446 16.1.3 SQL语句的改变 447 16.1.4 绑定变量窥视 448 16.2 识别执行计划的不稳定性 450 16.2.1 抓取当前所运行查询的数据 451 16.2.2 查看一条语句的性能历史 452 16.2.3 按照执行计划聚合统计信息 454 16.2.4 寻找执行计划的统计方差 454 16.2.5 在一个时间点附近检查偏差 456 16.3 执行计划控制:解决问题 458 16.3.1 调整查询结构 459 16.3.2 适当使用常量 459 16.3.3 给优化器一些提示 459 16.4 执行计划控制:不能直接访问代码 466 16.4.1 选项1:改变统计信息 467 16.4.2 选项2:改变数据库参数 469 16.4.3 选项3:增加或移除访问路径 469 16.4.4 选项4:应用基于提示的执行计划控制机制 470 16.4.5 大纲 470 16.4.6 SQL概要文件 481 16.4.7 SQL执行计划基线 496 16.4.8 基于提示的执行计划控制机制总结 502 16.5 结论 502 媒体评论     本书作者全部是OakTable的成员,且具有15~29年丰富的Oracle开发经验。在研究一些被其他专门讨论Oracle SQL语言的参考书直接忽略的问题时,这种对Oracle数据库的长期钻研无疑是一个巨大的优势。     ——亚马逊读者评论 精彩内容     SQL核心     凯伦?莫顿(Karen Morton)     不管你是刚开始写SQL语句还是已经写过很多年了,学会写出“好的”SQL这个过程都需要具有很扎实的SQL核心语法和概念基础知识。本章对SQL语言的核心概念及其性能做了回顾,同时还描述了一些你应该已经很熟悉的常用SQL命令。对于那些以前曾经使用过SQL并且基础知识相当牢靠的读者来说,本章就是一个简要的复习,让你为后面更详细的SQL论述做好准备。如果你是一位SQL新人,你可能想要先阅读Beginning Oracle SQL这本书以确保掌握SQL的基础。不管是哪种情况,第1章的目的就是通过对5个核心SQL语句的快速浏览来衡量一下你的SQL水平,同时还概述了我们用来执行SQL语句的工具:SQL*Plus。     1.1  SQL语言     SQL语言最早是IBM公司于20世纪70年代开发出来的,称为结构化英文查询语言,简称为SEQUEL。该语言是基于E.F.Codd在1969年提出的关系型数据库管理系统(RDBMS)的。后来因为商标的纠纷,其简称又进一步缩写为SQL。1986年和1987年,ANSI(美国国家标准化组织)和ISO(国际标准化组织)先后将SQL语言采纳为标准语言。而人们并不熟悉的是,ANSI官方曾将SQL语言的读音确定为“S-Q-L”。绝大多数人,包括我本人,都还在使用“sequel”的读音,只是因为这样读起来更顺口一些。     SQL的目的就是简单地提供一个到数据库的接口,在本书指的是Oracle数据库。每一条SQL语句对于数据库来说就是一条命令或指令。SQL与其他编程语言(如C或Java)的区别就在于它是要处理数据集合而不是一行一行的数据。语言本身也不需要你提供如何导航到数据的指令——这是在后台透明地进行的。但你将在后面的章节中看到,如果想在Oracle中写出高效的SQL语句,了解数据及其在数据库中的存储方式与存储位置是很重要的。     由于不同的供应商(例如甲骨文、IBM和微软)实现SQL核心功能的机制相差无几,所以基于某一种数据库所学的技巧同样可以应用到其他类型的数据库上。你基本上可以利用同样的SQL语句来进行数据的查询、插入、更新和删除,以及创建、修改和删除对象,而不必管数据库的供应商是哪家。     尽管SQL是各种关系型数据库管理系统的标准语言,但实际上它并不一定是关系型的。在本书后面我将就这一点稍作扩展。如果想要了解更多的细节,我推荐大家阅读C.J.Date的SQL and Relational Theory一书。需要铭记于心的一点是SQL语言并不总是严格遵守关系模型的——它根本就没有实现关系模型的某些要素,同时还不恰当地实现了一些要素。事实上,既然SQL是基于关系模型的,那么要想写出尽可能正确高效的SQL语句,你不仅必须要理解SQL语言,还要理解关系模型。     1.2  数据库的接口     多年以来人们开发出多种途径来传递SQL语句到数据库并获得结果。Oracle数据库的本地接口界面是Oracle调用界面(OCI)。OCI将由Oracle内核传送而来的查询语句发送到数据库。当使用某种Oracle工具如SQL*Plus或者SQL Developer时,你都在使用OCI。其他的Oracle工具如SQL*Loader、数据泵(Data Pump)以及Real Application Testing (RAT)既使用OCI,也可以使用语言特定的接口,如Oracle JDBC-OCI、ODP.Net、Oracle预编译器、Oracle ODBC以及Oracle C++调用接口(OCCI)驱动器。     当使用编程语言(如COBOL或C语言)时,你所写的语句被称为嵌入式的SQL语句并且在应用程序编译之前会由SQL预处理器进行预处理。代码清单1-1是一段可以在C/C++程序块中使用的SQL语句的例子。     代码清单1-1  C/C++程序块中所嵌入的SQL语句     其他工具,例如SQL*Plus和SQL Developer,都是交互式的工具。你输入并执行命令,然后获得相应的输出。交互式工具并不需要在运行代码前先精确编译,你只需要输入想要执行的命令即可。代码清单1-2是一段使用SQL*Plus执行语句的例子。     代码清单1-2  使用SQL*Plus执行SQL语句     在本书中,为了保持一致性我们所用的示例代码清单都使用SQL*Plus工具,但需要记住的是,不管你是用什么方法或工具来输入和执行SQL语句,所有的事情最后都要通过OCI来传递到数据库。这里的主旨就是不管你所使用的是什么工具,其本地接口都是一样的。     1.3  SQL*Plus回顾     SQL*Plus是一个不管采用哪个安装平台(Windows或Unix)都会提供的命令行工具。它是一个用来输入和执行SQL语句并显示输出结果的纯文本环境。用该工具可以直接输入、编辑命令,可以一条条地保存和执行命令或者通过脚本文件来进行,然后将输出结果以很精美格式的报表输出。要启动SQL*Plus你只需要在主机的命令提示符后敲入sqlplus即可。     1.3.1  连接到数据库     有多种方法可以通过SQL*Plus连接数据库。然而在连接之前,你还需要在$ORACLE_HOME/ network/admin/tnsnames.ora这个文件中登记想要连接的数据库。有两种通常使用的方法,或者如代码清单1-3所示那样在启动SQL*Plus时提供连接信息,或者如代码清单1-4所示那样在启动SQL*Plus以后使用connect命令。     代码清单1-3  通过窗口命令提示符连接到SQL*Plus     如果想要启动SQL*Plus而又不显示登录到数据库后的提示,可以在启动SQL*Plus时使用/nolog选项。     代码清单1-4  通过SQL>提示符连接SQL*Plus并登录到数据库     1.3.2  配置SQL*Plus环境     SQL*Plus有很多的命令可以让你来定制工作环境和显示选项。代码清单1-5所示是在SQL>提示符下输入help index命令后显示出来的可用的命令。     代码清单1-5  SQL*Plus命令列表     set命令是用来定制工作环境的最基本的命令。代码清单1-6为set命令的帮助文本。     代码清单1-6  SQL*Plus的SET命令     有了上面这些可用命令,你就能够很轻松地定制最适合你的运行环境了。但有一点要铭记于心的就是当你退出或关闭SQL*Plus的时候,这些设置命令就不再被保留了。为了避免每次使用SQL*Plus时都重新敲入一遍这些设置命令,你可以创建一个login.sql文件。事实上每次启动SQL*Plus的时候它都会默认去读两个文件。第一个是$ORACLE_HOME/sqlplus/admin目录下的glogin.sql文件。如果找到了这个文件,它就会被读进来,文件中的命令语句也会被执行。这样就可以把那些定制你的会话体验的SQL*Plus命令和SQL语句保存起来。     在读取glogin.sql文件以后,SQL*Plus会进一步寻找login.sql文件。这个文件必须在SQL*Plus的启动文件夹中或者包含在环境变量SQLPATH所指向的文件夹路径中。在login.sql文件中的所有命令优先级都比glogin.sql文件中的命令高。从10g开始,Oracle在每次你启动SQL*Plus或者从SQL*Plus里执行connect命令的时候都会同时去读取glogin.sql和login.sql这两个文件。在Oracle 10g之前,login.sql脚本文件只有在SQL*Plus启动的时候才会被执行。代码清单1-7是一个常见的login.sql文件内容。     代码清单1-7  一个常见的login.sql文件     注意这里在SET SQLPROMPT中使用的变量_user和_connect_identifier。它们是预定义变量的两个示例。你可以在login.sql文件中或者任何你创建的脚本文件中使用下面这些预定义变量:     ·_connect_identifier     ·_date     ·_editor(这个变量指定了当你使用edit命令的时候启动哪个编辑器)     ·_o_version     ·_o_release     ·_privilege     ·_sqlplus_release     ·_user     1.3.3  执行命令     有两种命令可以在SQL*Plus中执行:SQL语句和SQL*Plus命令。代码清单1-5和代码清单1-6中所列出的SQL*Plus命令对于SQL*Plus来说是特有的命令,可以用来定制运行环境并且可以运行SQL*Plus特有的命令,例如DESCRIBE和CONNECT。要想执行一个SQL*Plus命令,你只需在命令提示符后输入该命令然后敲回车,命令会自动被执行。另一方面,如果要执行SQL语句,就必须使用一个特定字符来表明你想要执行输入的语句,分号(;)或者斜线(/)都可以。使用分号的话可以直接放在输入命令的后面或者放在接下来的空行中,而斜线则必须放在接下来的空行中才可以被识别。代码清单1-8展示了如何使用这两种符号。     代码清单1-8  执行字符的用法     注意第5个在语句最后面加了一个斜线(/)的例子。光标移动到了下一行而不是立即执行语句命令。接下来,如果你再按一下回车键,语句就会被放入SQL*Plus的缓冲器中,但是也不执行。如果想要查看SQL*Plus缓冲器中的内容,可以使用list命令(也可以简写为l)。接下来如果你想在缓冲器中通过使用斜线(/)来执行语句[尽管斜线(/)命令本来就是这样来用的]在这里也将会返回一个错误。这是因为你最初在SQL语句的结尾敲入了一个斜线(/),而斜线(/)并不是一个有效的SQL命令,从而在语句想要执行的时候报错。     另外一种执行命令的方法是把命令放到一个文件中。你可以在SQL*Plus之外直接用文本编辑器生成这些文件,也可以在SQL*Plus中使用EDIT命令来直接调用编辑器。如果已经有了一个文件,EDIT命令可以打开这个文件,如果没有的话就会创建新的文件。文件必须放在默认文件夹中,否则你必须指定文件的全路径。想要设定所选择的编辑器,你只需要利用命令define_ editor='//myeditor.exe'来设置预定义变量_editor。具有.sql扩展名的文件在执行的时候不必敲入扩展名,通过@或START命令都可以执行。代码清单1-9中列出了这两个命令的用法。     代码清单1-9  执行.sql脚本文件     SQL*Plus具有很多特性和选项,以致于多得在这里不能一一列举。就本书需要而言,这种概述就已经足够了。但是,Oracle文档对SQL*Plus的用法给出了指导,而且很多的书,比如Beginning Oracle SQL,都对SQL*Plus作了更为深入的阐述,如果感兴趣你可以参考。     1.4  5个核心的SQL语句     SQL语言有很多不同的语句,但在整个职业生涯中,你可能只会用到其中很少的一部分。不过你所使用的几乎其他任何产品不也是这样的吗?据说有一个统计结果是,绝大多数人都仅使用了他们常用的软件产品或编程语言所有功能的20%甚至更少。我不知道这个统计真实与否,但以我的经验来看,这似乎是很准确的。我发现同样的基本SQL语句格式在大多数应用中使用了将近20年了。极少数的人使用过SQL提供的所有功能——即使对于那些他们确实经常使用的功能也常常用得不是很恰当。显而易见,我们不可能覆盖SQL语言的所有语句以及它们的选项。本书的目的在于让你能够深入理解那些最常用的SQL语句并帮助你更高效地使用它们。     在本书中,我们将重点讨论5个最常用的SQL语句,它们分别为SELECT、INSERT、UPDATE、DELETE以及MERGE。尽管这些核心语句都将逐个讲解,但重中之重还是SELECT语句。将这5个语句用好了将会为你在日常工作中用好SQL语言打下坚实的基础。     1.5  SELECT语句     SELECT语句用来从一个或多个表中或者其他数据库对象中提取数据。你应该已经很熟悉SELECT语句的基础知识了,所以我将不再从一个初学者的角度来介绍SELECT语句,而是首先回顾一下SELECT语句的执行逻辑。对于如何来写一个基本的SELECT语句你应该已经学习过了,但为了培养基本的思维模式,你要一直写出符合语法规则的高效SQL语句,你需要理解SQL语句是如何执行的。     一个查询语句在逻辑上的处理方式可能会与实际物理处理过程大相径庭。Oracle基于查询成本的优化器(cost-based optimizer , CBO)用来产生实际的执行计划。我们在后面的章节中将会讲解优化器是干什么的,如何来实现其功能的以及为什么要进行优化。目前,我们需要关心的是优化器将会决定如何访问表、按照什么样的顺序来处理它们,以及如何将多个表联结起来及如何使用筛选器。查询的处理在逻辑上是按照特定的顺序进行的,但是,优化器所选择的物理执行计划可能会按照完全不同的顺序来实际执行这些步骤。代码清单1-10是一段包含SELECT语句的主要子句的查询片段,在其中标出了每一个子句的逻辑处理顺序。     代码清单1-10  查询语句的逻辑处理顺序     你应该立刻注意到SQL有别于其他编程语言的一点在于首先处理的并不是写在第一行的语句(SELECT语句),而是FROM子句。注意在这个代码清单中我给出了两个不同的FROM子句。标记为1.1的那个FROM子句表示的是当使用ANSI语法时的不同。我们可以把处理过程中的每一个步骤想象为生成一个临时的数据集。随着每个处理步骤的进行,这个数据集被不断地操作直到生成最终的处理结果。查询返回给调用者的就是这个最终结果数据集。     为了更详细地了解SELECT语句的每个部分,你可以参考代码清单1-11所示的查询语句,该语句返回的结果集为下订单超过4次的女顾客的列表。     代码清单1-11  下订单超过4次的女顾客查询语句     1.5.1  FROM子句     FROM子句列出了所查询数据的源对象。这个子句可以包含表、视图、物化视图、分区或子分区,或者你可以建立一个子查询来生成子对象。如果使用了多个源对象,其逻辑处理阶段也将会应用到每一个联结类型以及谓词ON(如步骤1.1所示)。在本书后面的章节中你将会进一步了解联结类型的更多细节,但注意在处理联结语句的时候是按照下面的顺序来进行的:     (1) 交叉联结,也称为笛卡儿乘积;     (2) 内联结;     (3) 外联结。     在代码清单1-11所示的查询例子中,FROM子句列出了两张表:customers和orders,通过customer_id列来联结。因此,当处理这一信息时,FROM子句所生成的初始数据集将会包含这两张表中customer_id相匹配的行。在本例中结果集将会包含105行。为了验证这一点,只要执行例子中的前4行,如代码清单1-12所示。     代码清单1-12  仅通过FROM子句的部分查询语句的执行     注意 为了使之很好地适应页面我手工调整了输出结果,实际输出结果在页面上超过105行。     1.5.2  WHERE子句     WHERE子句提供了一种方法,可以按照条件来限制查询最终返回结果集的行数。每个条件或者谓语都是以两个值或表达式相比较的形式出现的。比较的结果要么是匹配(值为TRUE)要么是不匹配(值为FALSE)。如果比较的结果是FALSE,那么相应的行不会被包含在最终结果集中。     这里我需要稍微偏离一下主题,来谈一谈与这一步相关的SQL中的一个重要方面。事实上,SQL中逻辑比较的可能结果是TRUE、FALSE以及未知。当其中包含空值(null)的时候比较的结果就会是未知。空值与任何值比较或者用在表达式中都会得到空值,或者是未知。一个空值代表一个相应值的缺失,并且可能因为SQL语言中的不同部分对空值的处理不同而令人费解。关于空值是如何影响SQL语句执行的话题将会贯穿本书,但在这里我不得不先提及一下这个话题。我之前所说的还是基本正确的,一个比较的返回值将会是TRUE或者FALSE。你会发现当进行筛选的比较条件中包含空值的时候,将作为FALSE来对待。     在我们的例子中,只有一个将结果限定为下了订单的女性消费者的谓语。如果你查看FROM子句执行之后的中间结果(见代码清单1-12),你会发现105行中仅有31行是由女性消费者所下的订单(gender = 'F')。因此,在应用了WHERE子句以后,中间结果集将从105行减少到31行。     应用WHERE子句以后得到了更精确的结果集。注意,在这里使用的是“精确的结果集”。我的意思是说现在已经得到了能够满足你查询需求的数据行。其他子句(GROUP BY, HAVING)也许可以用来聚合并且进一步限制调用程序会接收到的最终的结果集,但需要注意的很重要的一点是,目前已经得到了查询计算最终结果所需的所有数据。     WHERE子句的目的是限制或者减小结果集。你所使用的限制条件越少,最终返回的结果集中包含的数据就会越多。你需要返回的数据越多,执行查询的时间也就越长。     1.5.3  GROUP BY子句     GROUP BY子句将执行FROM和WHERE子句后得到的经过筛选后的结果集进行聚合。查询出来的结果按照GROUP BY子句中列出的表达式进行分组,来为每一个分组得出一行汇总结果。你可以按照FROM子句中所列出对象的任意字段进行分组,即使你并不想在输出结果列表中显示该列。相反,Select列表中的任何非聚合字段都必须包括在GROUP BY表达式中。     GROUP BY子句中还可以包含两个附加的运算:ROLLUP 和CUBE。ROLLUP运算用来产生部分求和值,CUBE运算用来求得交互分类值。当你使用这两种运算中任意一个的时候,你将会得到不止一行的汇总信息。在第7章中将会对这两个运算进行更详细的讨论。     在示例查询中,需要按照customer_id来进行分组。这就意味着对于每一个唯一的customer_id只会返回一行值。在WHERE子句执行后所得到的代表下订单的女性消费者的31行订单中,有11个独特的customer_id值,如代码清单1-13所示。     代码清单1-13  截至GROUP BY子句的部分查询执行     你会发现查询的结果是经过分组的,但并没有排序。表面上看结果好像是按照order_ct字段排序的,但这仅仅是个巧合而不是确定的行为。需要记住的很重要的一点是:GROUP BY子句并不确定结果数据的排序。如果你需要结果按照特定的顺序排列,则必须指定一个order by子句。     1.5.4  HAVING子句     HAVING子句将分组汇总后的查询结果限定为只有该子句中的条件为真的数据行。除非你使用HAVING子句,否则将返回所有的汇总行。事实上,GROUP BY子句和HAVING子句的位置是可以互换的,谁先谁后都无关紧要。但是,似乎在编码中将GROUP BY子句放在前面更有意义一些,因为GROUP BY子句在逻辑上是先执行的。从本质上来说,HAVING子句是在GROUP BY子句执行后用来筛选汇总值的第二个WHERE子句。     在我们的查询例子中,HAVING子句HAVING COUNT(o.order_id) > 4,将分组数据从11行减少到2行。这一点你可以通过查看GROUP BY子句应用后返回的结果行来确认,如代码清单1-13所示。注意仅有146和147号消费者所下的订单数超过4次。这样就产生了组成最终结果集的两行数据。     1.5.5  SELECT列表     SELECT列表列出查询的返回最终结果集中需要显示哪些列。这些列可以是数据表中一个实际的列、一个表达式,或者甚至是一个SELECT语句的结果,如代码清单1-14所示。     代码清单1-14  展现SELECT列表各种可能情况的查询实例     SQL> select.customer_id, c.cust_first_name||''||c.cust_last_name,     .     当使用另外一个SELECT语句来产生结果中的一列的值的时候,这个查询必须只能返回一行一列的值。这种类型的子查询被称为标量子查询。尽管这可能是一个非常有用的语法,但需要牢记于心的是标量查询在结果集中的每一行结果产生时都要执行一遍。在某些情况下可以进行优化以减少标量子查询的重复执行,但更糟糕的场景是每一行都需要标量子查询执行。你可以想象如果你的结果集中有几千行甚至上百万行数据的时候所需要付出的查询代价!在后面的章节中我们还将回顾标量子查询并讨论如何更好地来使用它们。     在SELECT列表中你还有可能用到的一个选项是DISTINCT子句。在例子中并没有使用它,但我想要简要地提及一下。DISTINCT子句用来在其他子句执行完毕以后从结果集中去除重复的行。     SELECT列表执行完以后,你就得到了最终的查询结果集。所剩的唯一需要做的事情,如果包含了的话,就是将查询结果集按照所需的顺序排序。     1.5.6  ORDER BY子句     ORDER BY子句用来对查询最终返回的结果集进行排序。在本例中,需要按照orders_ct和customer_id进行排序。orders_ct这一列是通过GROUP BY子句中的COUNT聚合函数计算得到的值。如代码清单1-13中所示,有两个消费者的订单超过4个。由于这两个消费者的订单数都是5份,orders_ct这一列的值是相同的,所以要由第二个排序列来确定最终结果的显示顺序。如代码清单1-15中所示,该查询的最终经过排序的输出结果是按照customer_id排序的两行数据集。     代码清单1-15  示例查询的最终输出     当输出结果需要排序的时候,Oracle必须在其他所有子句都执行完之后按照指定的顺序对最终结果集进行排序。需要排序的数据量大小是非常重要的。我这里所说的大小是指结果集中所包含的总字节数。你可以通过用行数乘以每一行的字节数来估计数据集的大小。每行所包含的字节数通过将选择列表中包含的每一列的平均长度相加来确定。     上面的查询实例在选择列表中仅需要列出customer_id 和orders_ct两列的值。我们可以估算每一行输出值的字节数为10。在第6章中我将阐述从哪里能找到优化器所估计的值。因此,如果我们在结果集中只有两行数据,排序的大小实际上是很小的,大约20字节。请记住这仅仅是估算,但这样的估算也是很重要的。     较小的排序会完全在内存中来实现,而较大的排序将不得不使用临时磁盘空间来完成。如你可能推断的那样,在内存中完成的排序比必须使用磁盘的排序要快。因此,当优化器估算排序数据的影响时,它必须要考虑排序数据集的大小,以此来调整如何能够以最有效的方法来获得查询的结果。一般来说,排序是查询过程中开销相当大的一个处理步骤,尤其是当返回结果集很大的时候。     1.6  INSERT语句     INSERT语句用来向表、分区或视图中添加行。可以向单表或者多个表方法中添加数据行。单表插入将会向一个表中插入一行数据,这行数据可以显式地列出插入值也可以通过一个子查询来获取。多表插入将会向一个或多个表中插入行,并且会通过子查询获取值来计算所插入行的值。     1.6.1  单表插入     代码清单1-16中的第一个例子阐明了使用values子句实现的单表插入。每一列的值都显式地输入。如果你要插入表中所定义的所有列的值,那么列的列表是可选的。但是,如果你只想提供部分列的值,则必须在列的列表中指明所需的列名。好的做法是不管是不是需要插入所有列的值,都把所有列的列表列出来。这样做就像该语句的自述文件一样,并且也可以减少将来别人要插入一个新列到表中的时候可能出现的错误。     代码清单1-16  单表插入     第二个例子阐述了通过子查询来实现插入。这是插入数据行的一个非常灵活的选项。所写的子查询可以返回一行或多行数据。返回的每一行都会用来生成需要插入的新行的列值。根据你的需要这个子查询可以很简单也可以很复杂。在本例中,我们使用子查询实现了在现有薪水的基础上为每一位员工发放10%奖金的计算。事实上奖金表包含4列,但在这个插入中我们只列出了3个字段。comm这一列在子查询中并没有占据一列并且我们也没有将它包括在列表中。因为我们没有包含这一列,它的值将会是null。注意如果comm列具有非空约束,那么可能已返回一个约束错误,语句的执行也已失败。     1.6.2  多表插入     代码清单1-17所示的多表插入的例子阐明了一个子查询返回的数据行是如何被用来插入多个表中的。我们从3个表开始:small_customers、medium_customers以及large_customers。我们想要按照每位消费者所下订单的总金额来将数据分别插入这些表。子查询将每一位消费者的order_total列求和来确定该消费者的消费金额是小(所有订单的累加金额小于10 000美元)、中等(介于10 000美元与99 999.99美元之间)还是大(大于等于100 000美元),然后按照条件将这些行插入对应的表中。     代码清单1-17  多表插入     注意INSERT关键字后面ALL子句的使用。当指定了ALL子句的时候,这个语句就会执行无条件的多表插入。也就意味着每一个WHEN子句按照子查询所返回的每一行来确定值而不管前一个条件的输出结果是什么。因此,你需要注意如何来指定每个条件。例如,如果我使用WHEN sum_orders < 100 000这个条件而不是像上面一样列出范围,插入medium_customers表中的行有可能也会插入small_customers表中。     你需要指明FIRST选项来实现每一个WHEN子句按照其出现在语句中的顺序进行评估,并且对于一个给定的子查询行跳过接下来的WHEN子句评估。关键在于要记住哪一个选项能够更好地满足你的需要,ALL还是FIRST,然后使用最适合的选项。     1.7  UPDATE语句     UPDATE语句的作用是改变表中原有行的列值。这个语句的语法由3部分组成:UPDATE、SET和WHERE。UPDATE子句用来指定要更新的表,SET子句用来指明哪些列改变了以及调整的值,WHERE子句用来按条件筛选需要更新的行。WHERE子句是可选的,如果忽略了这个子句的话,更新操作将针对指定表中的所有行进行。     代码清单1-18列出了几种UPDATE语句的不同写法。首先,我建立了一个employees表的副本,名称为employees2,然后我将执行几个完成基本相同任务的不同更新操作:将90部门的员工工资增加10%。在例5中,commission_pct这一列也进行了更新。下面就是采用的不同方法。     例1:使用表达式更新一个单列的值。     例2:通过子查询更新一个单列的值。     例3:通过在WHERE子句中使用子查询确定要更新的数据行来更新单列的值。     例4:通过使用SELECT语句定义表及列的值来更新表。     例5:通过子查询更新多列。     代码清单1-18  UPDATE语句的例子     1.8  DELETE语句     DELETE语句用来从表中移除数据行。该语句的语法结构由3部分组成:DELETE、FROM和WHERE。DELETE关键字是单独列出的。除非你决定使用我们后面将会讨论到的提示(hint),没有其他选项与DELETE关键字相结合。FROM子句用来指定要从哪个表中删除数据行。如代码清单1-19中的例子所示,这个表可以直接指定也可以通过子查询来确定。WHERE子句提供筛选条件有助于确定哪些行是要删除的。如果忽略了WHERE子句,删除操作将删除指定表中的所有数据行。     代码清单1-19展示出了DELETE语句的几种不同写法。注意,在这些例子中我使用了代码清单1-18中创建的employees2表。下面你将看到的就是这些不同的删除方法。     例1:使用WHERE子句中的筛选条件来从指定表中删除行。     例2:使用FROM子句中的子查询来删除行。     例3:使用WHERE子句中的子查询来从指定表中删除行。     代码清单1-19  DELETE语句的例子     1.9  MERGE语句     MERGE语句具有按条件获取要更新或插入到表中的数据行,然后从1个或多个源头对表进行更新或者向表中插入行两方面的能力。它最经常被用在数据仓库中来移动大量的数据,但它的应用不仅限于数据仓库环境下。这个语句提供的一个很大的附加值在于你可以很方便地把多个操作结合成一个。这就使你可以避免使用多个INSERT、UPDATE以及DELETE语句。并且,在本书后面的内容中你将看到,如果你避免去做那些不是必须做的事情,响应时间可能得到相应的改善。     MERGE语句的语法是:     为了说明MERGE语句的用法,代码清单1-20展示出了如何建立一个测试表,然后恰当地利用MERGE条件来向表中插入或更新行。     代码清单1-20  MERGE语句例子     MERGE语句完成了下面这些事情。     ·插入了两行(员工id 106和107)。     ·更新了一行(员工id 105)。     ·删除了一行(员工id 103)。     ·一行保持不变(员工id 104)。     如果没有MERGE语句,你必须最少写3条不同的语句来完成同样的事情。     1.10  小结     正如你可以从到目前为止的例子中看出的,SQL语言提供了很多不同的选择来得到同样的结果集。你可能还注意到了一点就是这5个核心的SQL语句都可以使用类似的构造,例如子查询。关键是需要搞清楚在各种不同的使用场景下哪种构造是最高效的。我们将在本书后面的内容中阐述如何做到这一点。     如果你对本章的例子的理解有任何困难,请一定花点时间复习Beginning Oracle SQL或者Oracle文档中的SQL Reference Guide。在本书中接下来的部分我们假设你已经很好地理解了5个核心SQL语句的基本构造:SELECT、INSERT、UPDATE、DELETE和MERGE。

81,092

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧