oracle外部表
oracle use_nl的用法
oracle use_nl的用法在Oracle数据库中,USE_NL是一个查询提示,用于指示查询计划使用嵌套循环连接(Nested Loops Join)来执行连接操作。
嵌套循环连接是一种连接操作的执行方式,其中,外部表的每一行都会与内部表的每一行进行比较,并返回符合连接条件的结果。
这种连接方式适用于内部表较小的情况。
USE_NL提示的语法如下:SELECT /*+ USE_NL(alias1 alias2 ...) */ column_listFROM table1 alias1, table2 alias2...WHERE join_condition;在这个提示中,alias1,alias2等是表的别名,column_list是要查询的列,table1,table2等是要连接的表,join_condition是连接条件。
通过使用USE_NL提示,Oracle优化器会将嵌套循环连接纳入查询计划中。
但需要注意的是,USE_NL只是一个提示,最终的执行计划仍然由Oracle优化器决定,它可能会选择其他连接方式,比如哈希连接(Hash Join)或者排序-合并连接(Sort-Merge Join)。
为了进行有效的查询优化,我们可以考虑以下几点:1. 使用USE_NL只在需要时使用,对于较小的表进行嵌套循环连接可能会提高性能,但对于大型表可能会导致性能下降。
2. 考虑使用其他连接操作,如哈希连接或者排序-合并连接,根据实际情况选择最优的连接方式。
3. 使用合适的索引来加速连接操作,确保连接列上有适当的索引。
4. 注意连接条件的选择,确保它们是准确的,并且索引统计信息是最新的。
总之,USE_NL提示可以在一些情况下提供查询性能的改进,但使用时需要谨慎考虑实际情况,并综合考虑其他查询优化技术和最佳实践。
expdp access_method
expdp access_methodexpdp是Oracle数据库中的一个工具,用于将数据库中的数据以二进制格式导出。
在expdp命令中,access_method参数用于指定数据导出的方式。
本文将重点介绍expdp access_method的相关内容。
在Oracle数据库中,expdp access_method参数有两个可选值:direct path和external table。
下面将详细介绍这两种方式的特点和适用场景。
1. 直接路径导出(direct path)直接路径导出是一种快速导出数据的方式。
在这种方式下,expdp 会绕过Oracle数据库的buffer cache,直接读取磁盘上的数据文件,并将数据以二进制格式导出。
这种方式的优点是导出速度快,适用于大规模数据的导出。
但是,由于绕过了buffer cache,所以在导出过程中对数据库的访问会增加磁盘I/O负载。
直接路径导出的语法如下:expdp username/password@connect_string directory=directory_name dumpfile=dumpfile_name access_method=direct2. 外部表导出(external table)外部表导出是一种将数据导出到外部表的方式。
在这种方式下,expdp会创建一个外部表,然后将数据插入到外部表中,最后将外部表的数据导出。
这种方式的优点是可以将数据以文本格式导出,便于人工查看和处理。
同时,外部表导出的过程中不会增加磁盘I/O负载。
但是,由于需要创建外部表,所以在导出大规模数据时可能会占用较多的内存和磁盘空间。
外部表导出的语法如下:expdp username/password@connect_string directory=directory_name dumpfile=dumpfile_name access_method=external_table需要注意的是,外部表导出需要事先创建外部表的定义。
oracle读取文件方法
Oracle读取文件方法及应用实践正文内容:引言:在Oracle数据库中,读取外部文件是一项常见的任务。
无论是读取文本文件、CSV文件、XML文件还是其他格式的文件,Oracle提供了多种方法来实现这个功能。
本文将介绍一些常用的Oracle读取文件的方法,并结合实际案例来说明其应用。
一、使用UTL_FILE包读取文本文件UTL_FILE包是Oracle提供的一个标准包,可以用于读取和写入文本文件。
它提供了多个过程和函数,可以实现对指定目录下的文件进行读取、写入、定位等操作。
下面是一个使用UTL_FILE包读取文本文件的示例:DECLAREfile_handle UTL_FILE.FILE_TYPE;file_line VARCHAR2(255);BEGIN-- 打开文件file_handle := UTL_FILE.FOPEN('DATA_DIR', 'example.txt', 'R');-- 逐行读取文件内容LOOPUTL_FILE.GET_LINE(file_handle, file_line);-- 处理文件内容DBMS_OUTPUT.PUT_LINE(file_line);END LOOP;-- 关闭文件UTL_FILE.FCLOSE(file_handle);EXCEPTIONWHEN UTL_FILE.INVALID_DIRECTORY THENDBMS_OUTPUT.PUT_LINE('无效的目录');WHEN UTL_FILE.INVALID_OPERATION THENDBMS_OUTPUT.PUT_LINE('无效的操作');WHEN UTL_FILE.INVALID_FILEHANDLE THENDBMS_OUTPUT.PUT_LINE('无效的文件句柄');END;二、使用外部表读取CSV文件除了使用UTL_FILE包读取文本文件外,还可以使用外部表来读取CSV文件。
oracle update left join用法
Oracle UPDATE LEFT JOIN 用法一、什么是 Oracle UPDATE LEFT JOIN在 Oracle 数据库中,UPDATE LEFT JOIN 是一种用于更新一张表中的数据,同时根据另一张表中的匹配条件进行连接的操作。
通过使用 UPDATE LEFT JOIN,我们可以根据两个表之间的关联关系,更新被连接表中符合条件的记录。
通常,在使用 UPDATE 语句时,只能更新一个表中的数据。
但是,在某些情况下,我们需要根据外部表的数据来更新主表,这时就需要使用到 LEFT JOIN。
二、UPDATE LEFT JOIN 语法格式下面是在 Oracle 数据库中使用 UPDATE LEFT JOIN 的语法格式:UPDATE table1SET column1 = value1, column2 = value2, ...FROM table1LEFT JOIN table2ON table1.column = table2.columnWHERE condition;在上述语法中:•table1是要进行更新操作的表;•column1, column2是要更新的列和对应的值;•table2是要连接的外部表;•table1.column和table2.column是用于连接两个表的列;•condition是 WHERE 子句用于过滤符合条件的记录。
三、Oracle UPDATE LEFT JOIN 示例假设我们有两张表,一张是employees表,另一张是departments表。
我们需要根据departments表中的数据来更新employees表中的department_id列。
步骤 1:创建示例表首先,我们需要创建并插入一些示例数据到employees和departments表中。
下面是创建表和插入数据的 SQL 语句:CREATE TABLE employees (employee_id NUMBER,first_name VARCHAR2(100),last_name VARCHAR2(100),department_id NUMBER);CREATE TABLE departments (department_id NUMBER,department_name VARCHAR2(100));INSERT INTO employees VALUES (1, 'John', 'Doe', NULL);INSERT INTO employees VALUES (2, 'Jane', 'Smith', NULL);INSERT INTO employees VALUES (3, 'Mike', 'Johnson', NULL);INSERT INTO departments VALUES (1, 'HR');INSERT INTO departments VALUES (2, 'Finance');INSERT INTO departments VALUES (3, 'Marketing');步骤 2:执行 UPDATE LEFT JOIN 操作下面是使用 UPDATE LEFT JOIN 语句来更新employees表的示例:UPDATE employeesSET department_id = departments.department_idFROM employeesLEFT JOIN departmentsON employees.employee_id = departments.department_id;上述语句将根据employees.employee_id和departments.department_id进行连接,并将符合条件的department_id数据更新到employees表中的相应记录。
oracle三种表连接方式
oracle三种表连接⽅式
1、排序合并连接(Sort Merge Join)
排序合并连接的执⾏过程如下所⽰:
* 将每个⾏源的⾏按连接谓词列排序
* 然后合并两个已排序的⾏源,并返回⽣成的⾏源
例如:
select * from employees d,departments t where d.department_id=t.department_id;
访问机制如下:访问departments表并排序department_id列,访问employees表并排序department_id列,然后依次交替⽐较、归并。
注意:排序合并连接⼀般⽤在两张表中没有索引,并且连接列已经排好序的情况下。
2、嵌套循环连接(Nested Loops Join)
* 两个表中的⼀个被定义为“外部表”(或“驱动表”)
* 另⼀个表被称为“内部表”
* 将针对外部表中的每⼀⾏检索内部表中所有匹配的⾏
注意:join的顺序很重要,⼀般选择⼩表作为“驱动表”,⼤表作为“内部表”。
如两个表,⼀个100⾏,⼀个10000⾏,理想的连接⽅式是:100⾏的⼩表作为“驱动表”,10000⾏的⼤表作为“内部表”,⽤⼩表中的每条记录去匹配⼤表中的记录。
如果两张表的连接词在⼤表中是索引列,则是最完美的。
3、哈希连接(Hash Join)
* 优化器对⼩表利⽤连接键在内存中建⽴hash表
* 扫描⼤表,每得到⼀条记录,就来hash表中“探测”⼀次,找出与hash表匹配的⾏
注意:Hash Join 是CBO做⼤数据集连接时的常⽤⽅式。
使用Oracle的外部表查询警告日志文件
使用Oracle的外部表查询警告日志文件从Oracle9i开始,Oracle的外部表技术(Oracle External Tables)被极大的增强,通过外部表访问外部数据增强了Oracle数据库和外部数据源进行数据交互的能力,对于数据仓库和ETL来说,这些增强极大的方便了数据访问。
对于DBA来说,最常见一个例子是可以使用外部表来访问警告日志文件或其他跟踪文件.以下一个例子用来说明外部表的用途。
首先需要创建一个Directory:[oracle@jumper oracle]$ sqlplus "/ as sysdba"SQL*Plus: Release 9.2.0.4.0 - Production on Sun Oct 15 21:42:28 2006Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved.Connected to:Oracle9i Enterprise Edition Release 9.2.0.4.0 - ProductionWith the Partitioning optionJServer Release 9.2.0.4.0 - ProductionSQL> create or replace directory bdump2 as '/opt/oracle/admin/eygle/bdump';Directory created.SQL> col DIRECTORY_PATH for a30SQL> col owner for a10SQL> select * from dba_directories;OWNER DIRECTORY_NAME DIRECTORY_PATH---------- ------------------------------ ------------------------------SYS BDUMP /opt/oracle/admin/eygle/bdump然后创建一个外部表:SQL> create table alert_log ( text varchar2(400) )2 organization external (3 type oracle_loader4 default directory BDUMP5 access parameters (6 records delimited by newline7 nobadfile8 nodiscardfile9 nologfile10 )11 location('alert_eygle.log')12 )13 reject limit unlimited14 /Table created.然后我们就可以通过外部表进行查询警告日志的内容:SQL> select * from alert_log where rownum < 51;TEXT----------------------------------------------------------------------------------------- Mon Jun 26 12:00:24 2006Starting ORACLE instance (normal)Mon Jun 26 12:00:25 2006WARNING: EINVAL creating segment of size 0x0000000008c00000 fix shm parameters in /etc/system or equivalentLICENSE_MAX_SESSION = 0LICENSE_SESSIONS_WARNING = 0SCN scheme 2Using log_archive_dest parameter default valueLICENSE_MAX_USERS = 0SYS auditing is disabledStarting up ORACLE RDBMS Version: 9.2.0.4.0.System parameters with non-default values:processes = 150timed_statistics = TRUEshared_pool_size = 104857600large_pool_size = 0java_pool_size = 0control_files = /opt/oracle/oradata/eygle/control01.ctldb_block_size = 8192db_cache_size = 16777216db_cache_advice = ONcompatible = 9.2.0.0.0db_file_multiblock_read_count= 16fast_start_mttr_target = 300log_checkpoints_to_alert = TRUEundo_management = AUTOundo_tablespace = UNDOTBS1undo_retention = 10800remote_login_passwordfile= EXCLUSIVEdb_domain =instance_name = eyglejob_queue_processes = 10hash_join_enabled = TRUEbackground_dump_dest = /opt/oracle/admin/eygle/bdumpuser_dump_dest = /opt/oracle/admin/eygle/udumpcore_dump_dest = /opt/oracle/admin/eygle/cdumpsort_area_size = 524288db_name = eygleopen_cursors = 500star_transformation_enabled= FALSEquery_rewrite_enabled = FALSEpga_aggregate_target = 52428800aq_tm_processes = 0PMON started with pid=2DBW0 started with pid=3LGWR started with pid=4CKPT started with pid=5SMON started with pid=6RECO started with pid=750 rows selected.SQL>如果我们需要查看数据库中曾经出现过的ORA-错误,那么可以执行如下查询: SQL> select * from alert_log where text like 'ORA-%';TEXT----------------------------------------------------------------------------------- ORA-1652: unable to extend temp segment by 128 in tablespace TEMP ORA-1113 signalled during: alter database open...ORA-1113 signalled during: alter database datafile 3 online...ORA-09968: scumnt: unable to lock fileORA-1102 signalled during: ALTER DATABASE MOUNT...ORA-1507 signalled during: ALTER DATABASE CLOSE NORMAL...ORA-01157: cannot identify/lock data file 3 - see DBWR trace fileORA-01110: data file 3: '/opt/oracle/oradata/eygle/users01.dbf'ORA-27037: unable to obtain file statusORA-01157: cannot identify/lock data file 3 - see DBWR trace fileORA-01110: data file 3: '/opt/oracle/oradata/eygle/users01.dbf'TEXT----------------------------------------------------------------------------------- ORA-01157: cannot identify/lock data file 4 - see DBWR trace fileORA-01110: data file 4: '/opt/oracle/oradata/eygle/eygle01.dbf'ORA-27037: unable to obtain file statusORA-01157: cannot identify/lock data file 4 - see DBWR trace fileORA-01110: data file 4: '/opt/oracle/oradata/eygle/eygle01.dbf'ORA-1109 signalled during: ALTER DATABASE CLOSE NORMAL...ORA-01157: cannot identify/lock data file 4 - see DBWR trace fileORA-01110: data file 4: '/opt/oracle/oradata/eygle/eygle01.dbf'ORA-27037: unable to obtain file statusORA-01157: cannot identify/lock data file 4 - see DBWR trace fileORA-01110: data file 4: '/opt/oracle/oradata/eygle/eygle01.dbf'TEXT----------------------------------------------------------------------------------- ORA-1109 signalled during: ALTER DATABASE CLOSE NORMAL...ORA-1113 signalled during: alter database open...ORA-01157: cannot identify/lock data file 4 - see DBWR trace fileORA-01110: data file 4: '/opt/oracle/oradata/eygle/eygle01.dbf'ORA-27037: unable to obtain file statusORA-01157: cannot identify/lock data file 4 - see DBWR trace fileORA-1113 signalled during: alter database open...ORA-1122 signalled during: alter database open...ORA-283 signalled during: ALTER DATABASE RECOVER database ...ORA-1122 signalled during: alter database open...TEXT-----------------------------------------------------------------------------------ORA-1109 signalled during: ALTER DATABASE CLOSE NORMAL...ORA-1113 signalled during: ALTER DATABASE OPEN...ORA-1109 signalled during: ALTER DATABASE CLOSE NORMAL...ORA-1122 signalled during: ALTER DATABASE OPEN...ORA-1503 signalled during: CREATE CONTROLFILE REUSE DATABASE "EYGLE" NORESETL... ORA-1109 signalled during: ALTER DATABASE CLOSE NORMAL...ORA-1991 signalled during: ALTER DATABASE MOUNT...ORA-01110: data file 4: '/opt/oracle/oradata/eygle/eygle01.dbf'ORA-01115: IO error reading block from file 4 (block # 1)ORA-27069: skgfdisp: attempt to do I/O beyond the range of the fileORA-01122: database file 1 failed verification checkTEXT-----------------------------------------------------------------------------------ORA-01110: data file 1: '/opt/oracle/oradata/eygle/system01.dbf'ORA-01207: file is more recent than controlfile - old controlfileORA-1122 signalled during: alter database open...ORA-283 signalled during: ALTER DATABASE RECOVER database using backup cont... ORA-01110: data file 4: '/opt/oracle/oradata/eygle/eygle01.dbf'ORA-01115: IO error reading block from file 4 (block # 1)ORA-27069: skgfdisp: attempt to do I/O beyond the range of the fileORA-01194: file 1 needs more recovery to be consistentORA-1194 signalled during: alter database open resetlogs...ORA-283 signalled during: ALTER DATABASE RECOVER datafile 1 ...TEXT-----------------------------------------------------------------------------------ORA-283 signalled during: ALTER DATABASE RECOVER database using backup cont... ORA-01110: data file 4: '/opt/oracle/oradata/eygle/eygle01.dbf'ORA-01115: IO error reading block from file 4 (block # 1)ORA-27069: skgfdisp: attempt to do I/O beyond the range of the fileORA-01194: file 1 needs more recovery to be consistentORA-01110: data file 1: '/opt/oracle/oradata/eygle/system01.dbf'ORA-1194 signalled during: alter database open resetlogs...ORA-283 signalled during: ALTER DATABASE RECOVER datafile 1 ...ORA-1109 signalled during: ALTER DATABASE CLOSE NORMAL...ORA-1589 signalled during: ALTER DATABASE OPEN...ORA-01110: data file 4: '/opt/oracle/oradata/eygle/eygle01.dbf'TEXT-----------------------------------------------------------------------------------ORA-01115: IO error reading block from file 4 (block # 1)ORA-27069: skgfdisp: attempt to do I/O beyond the range of the fileORA-01194: file 1 needs more recovery to be consistentORA-01110: data file 1: '/opt/oracle/oradata/eygle/system01.dbf'ORA-1194 signalled during: alter database open resetlogs...ORA-1109 signalled during: alter database close...ORA-1503 signalled during: CREATE CONTROLFILE REUSE DATABASE "EYGLE" NORESETL... ORA-1507 signalled during: ALTER DATABASE CLOSE NORMAL...ORA-1113 signalled during: alter database open...ORA-00202: controlfile: '/opt/oracle/oradata/eygle/control01.ctl'ORA-27037: unable to obtain file statusTEXT----------------------------------------------------------------------------------- ORA-205 signalled during: ALTER DATABASE MOUNT...ORA-1507 signalled during: ALTER DATABASE CLOSE NORMAL...ORA-01501: CREATE DATABASE failedORA-01526: error in opening file '?/rdbms/admin/sql.bsq'ORA-07391: sftopn: fopen errorORA-01526: error in opening file ''ORA-1092 signalled during: CREATE DATABASE eygleORA-1079 signalled during: ALTER DATABASE MOUNT...ORA-1507 signalled during: alter database open...ORA-214 signalled during: alter database mount...ORA-1507 signalled during: ALTER DATABASE CLOSE NORMAL...TEXT----------------------------------------------------------------------------------- ORA-214 signalled during: ALTER DATABASE MOUNT...ORA-214 signalled during: alter database mount...ORA-1113 signalled during: ALTER DATABASE OPEN...ORA-01157: cannot identify/lock data file 3 - see DBWR trace fileORA-01110: data file 3: '/opt/oracle/oradata/eygle/eygle02.dbf'ORA-27037: unable to obtain file statusORA-1113 signalled during: ALTER DATABASE OPEN...ORA-01157: cannot identify/lock data file 3 - see DBWR trace fileORA-01110: data file 3: '/opt/oracle/oradata/eygle/eygle02.dbf'ORA-27037: unable to obtain file statusORA-1113 signalled during: alter database open...TEXT-----------------------------------------------------------------------------------ORA-01157: cannot identify/lock data file 3 - see DBWR trace fileORA-01110: data file 3: '/opt/oracle/oradata/eygle/eygle02.dbf'ORA-27037: unable to obtain file statusORA-283 signalled during: ALTER DATABASE RECOVER database ...ORA-1109 signalled during: ALTER DATABASE CLOSE NORMAL...ORA-1100 signalled during: alter database mount...ORA-1178 signalled during: alter database create datafile '/opt/oracle/produc...ORA-1516 signalled during: alter database create datafile '/opt/oracle/oradat...ORA-1991 signalled during: ALTER DATABASE MOUNT...ORA-01157: cannot identify/lock data file 3 - see DBWR trace fileORA-01110: data file 3: '/opt/oracle/oradata/eygle/eygle02.dbf'TEXT-----------------------------------------------------------------------------------ORA-27037: unable to obtain file statusORA-283 signalled during: ALTER DATABASE RECOVER database ...ORA-01157: cannot identify/lock data file 3 - see DBWR trace fileORA-01110: data file 3: '/opt/oracle/oradata/eygle/eygle02.dbf'ORA-27037: unable to obtain file statusORA-283 signalled during: ALTER DATABASE RECOVER database using backup cont... ORA-1109 signalled during: ALTER DATABASE CLOSE NORMAL...ORA-1991 signalled during: ALTER DATABASE MOUNT...ORA-01157: cannot identify/lock data file 3 - see DBWR trace fileORA-01110: data file 3: '/opt/oracle/oradata/eygle/users01.dbf'ORA-27037: unable to obtain file statusTEXT-----------------------------------------------------------------------------------ORA-283 signalled during: ALTER DATABASE RECOVER database ...ORA-01157: cannot identify/lock data file 3 - see DBWR trace fileORA-01110: data file 3: '/opt/oracle/oradata/eygle/users01.dbf'ORA-27037: unable to obtain file statusORA-283 signalled during: ALTER DATABASE RECOVER database using backup cont... ORA-01157: cannot identify/lock data file 3 - see DBWR trace fileORA-01110: data file 3: '/opt/oracle/oradata/eygle/users01.dbf'ORA-27037: unable to obtain file statusORA-283 signalled during: ALTER DATABASE RECOVER database using backup cont... ORA-279 signalled during: ALTER DATABASE RECOVER database using backup cont... ORA-308 signalled during: ALTER DATABASE RECOVER CONTINUE DEFAULT ...TEXT-----------------------------------------------------------------------------------ORA-308 signalled during: ALTER DATABASE RECOVER CONTINUE DEFAULT ...ORA-1547 signalled during: ALTER DATABASE RECOVER CANCEL ...ORA-1589 signalled during: alter database open...ORA-1109 signalled during: ALTER DATABASE CLOSE NORMAL...ORA-1503 signalled during: CREATE CONTROLFILE REUSE DATABASE "EYGLE" NORESETL... ORA-1178 signalled during: alter database create datafile '/opt/oracle/produc...ORA-1991 signalled during: ALTER DATABASE MOUNT...ORA-01157: cannot identify/lock data file 3 - see DBWR trace fileORA-01110: data file 3: '/opt/oracle/oradata/eygle/eygle02.dbf'ORA-27037: unable to obtain file statusORA-1157 signalled during: alter database open...TEXT-----------------------------------------------------------------------------------ORA-1113 signalled during: alter database open...ORA-1991 signalled during: ALTER DATABASE MOUNT...ORA-1109 signalled during: ALTER DATABASE CLOSE NORMAL...ORA-1031 signalled during: alter database open...ORA-3217 signalled during: ALTER TABLESPACE TEMP DEFAULT STORAGE (INITIAL 10M... ORA-1507 signalled during: alter database close...ORA-1507 signalled during: ALTER DATABASE CLOSE NORMAL...ORA-1507 signalled during: alter database close normal...ORA-1507 signalled during: ALTER DATABASE CLOSE NORMAL...ORA-1106 signalled during: alter database dismount...ORA-1531 signalled during: alter database open...TEXT-----------------------------------------------------------------------------------ORA-1531 signalled during: alter database open...ORA-1531 signalled during: alter database open...ORA-1531 signalled during: alter database open...ORA-1531 signalled during: alter database open...ORA-1109 signalled during: alter database close...ORA-1507 signalled during: alter database close...ORA-1507 signalled during: ALTER DATABASE CLOSE NORMAL...ORA-1185 signalled during: alter database add logfile group 6ORA-350 signalled during: alter database drop logfile group 3...163 rows selected.SQL>。
Oracle数据库实用教程-第 2章 Oracle表
表TABLE
约束CONSTRAINT
索引INDEX
表空间TABLESPACE
视图VIEW
回退段ROLLBACK SEGMENT
序列生成器SEQUENCE 同义词SYNONYM
用户USER
数据库链路DATABASE LINK
聚簇CLUSTER 分区PARTITION 函数/过程/程序包 触发器TRIGER 对象OBJECT
DESC emp_old;
SELECT * FROM emp_old;
16
2.3.3 存储参数
带存储参数的CREATE TABLE命令的简要语法及说明如下
CREATE TABLE [schema.] table
( { COLUMN1 DATATYPE [DEFAULT EXPn]
[COLUMN_CONSTRAINT] | TABLE_CONSTRAINT }
INSERT
INTO emp(deptno,empno,ename,sal,comm) VALUES(10,1020,'Jordan',4800,500);
32
6.修改存储参数
可 修 改 表 的 PCTFREE , PCTUSED , INITRANS 和MAXTRANS等存储参数。
例:修改表student的存储参数。
12
图2-4 table_properties的语法图
2.3 简单表的创建
2.3.1 简单表的创建语法
语法如下: CREATE TABLE 表名( 列名 类型 [NULL|NOT NULL] [PRIMARY KEY],
… 列名 类型 [NULL|NOT NULL][,[表级完整性约束]]);
13
oracle 数据库表同步方法
oracle 数据库表同步方法Oracle数据库是一种关系型数据库管理系统,可以用于存储和管理大量数据。
在日常的数据库管理工作中,经常会遇到需要将数据从一个表同步到另一个表的情况。
本文将介绍几种常见的Oracle数据库表同步方法。
方法一:使用INSERT INTO SELECT语句INSERT INTO SELECT语句可以将一个表的数据插入到另一个表中。
首先,我们需要创建目标表,确保目标表的结构与源表相同。
然后,使用INSERT INTO SELECT语句将源表的数据插入到目标表中。
该方法适用于数据量较小、结构相同的表之间的同步。
方法二:使用MERGE语句MERGE语句可以同时执行插入、更新和删除操作,可以将源表的数据同步到目标表中。
首先,我们需要创建目标表,确保目标表的结构与源表相同。
然后,使用MERGE语句将源表的数据同步到目标表中。
该方法适用于数据量较大、需要同时进行插入、更新和删除操作的表之间的同步。
方法三:使用Oracle GoldenGateOracle GoldenGate是一种高性能的数据同步和复制工具,可以实现实时的、零数据丢失的数据同步。
使用Oracle GoldenGate可以将源表的数据实时同步到目标表中,并保持数据的一致性。
该工具适用于对数据同步要求较高的场景,但需要购买和配置相应的许可证和环境。
方法四:使用Oracle Data PumpOracle Data Pump是Oracle数据库自带的一种数据导入导出工具,可以将表数据导出为二进制文件,然后再导入到目标表中。
使用Oracle Data Pump可以将源表的数据导出为.dmp文件,然后再导入到目标表中。
该方法适用于数据量较大、需要跨不同数据库实例进行数据同步的场景。
方法五:使用外部表外部表是一种特殊的表,它不存储数据,而是通过定义外部表和数据文件的映射关系,实现对外部文件中数据的查询和操作。
可以使用外部表将数据从源表同步到目标表。
Oracle 修改外部表
Oracle 修改外部表
当在操作系统环境中修改了数据文件所对应的OS路径后,为了使用Oracle能够正确标识OS文件所在的目录,则必须改变DIRECTORY对象。
例如,下面的语句修改外部表EXT_EMP的默认DIRECTORY对象为EXT_NEW:
SQL>alter table ext_emp default direct ext_new;
当在操作系统中修改了OS文件名后,为了使Oracle能够正确标识该OS文件,则必须逻辑修改外部表对应的OS文件。
例如,下面的语句修改外部表EXT_EMP对应OS文件EMP.CVS:
SQL>alter table ext_emp location('emp.csv');
当数据文件的数据格式发生改变时,如分隔符由“,”变为“;”,这就需要改变访问参数设置。
例如:
SQL>alter table ext_emp access parameters
2 (fields terminated by ';')。
将文本数据导入到ORACLE数据库的方法
将文本数据导入到ORACLE数据库的方法
1. 使用命令行工具 sqlldr:
sqlldr 是 ORACLE 提供的一个命令行工具,可以用于将文本数据导入到 ORACLE 数据库。
以下是使用 sqlldr 导入数据的步骤:
a.创建一个控制文件,控制文件描述了文本数据的结构和如何导入数据库。
例如,可以指定字段的名称、类型和顺序等。
b. 使用 sqlldr 命令加载数据,命令格式如下:
2. 使用外部表(External Table):
外部表是ORACLE数据库的一种特殊对象,它将外部文件(如文本文件)映射为数据库表的一部分。
以下是使用外部表导入数据的步骤:
a.创建外部表,指定外部文件的位置和格式。
例如,可以使用ANIZATIONEXTERNAL语句创建外部表。
b.使用INSERT...SELECT语句将外部表中的数据插入到其他数据库表中。
3.使用ORACLEDATAPUMP工具:
ORACLEDATAPUMP是ORACLE提供的一个工具,可以方便地导入和导出数据库对象和数据。
以下是使用ORACLEDATAPUMP工具导入数据的步骤:
a. 使用 expdp 命令导出数据,命令格式如下:
b.创建一个目标表,用于接收导入的数据。
c. 使用 impdp 命令导入数据,命令格式如下:
4.使用ETL工具:
总结起来,将文本数据导入到 ORACLE 数据库的方法包括使用sqlldr 命令行工具、外部表、ORACLE DATA PUMP 工具和 ETL 工具。
根据具体情况选择合适的方法进行数据导入。
Oracle外部表的应用
Oracle外部表的应用在本练习中,将在SCOTT模式中练习如何创建外部表,并进行练习如何通过外部表将外部数据导入到数据库。
(1)创建两个文本文件F1和F2文件,在两个文件中输入如下的数据并保存:F1.txt文件:132,OneLine464,TwoLineF2.TEXT文件:133,ThreeLine467,FourLine(2)以SYSTEM身份连接到数据库,并创建指向两个数据文件所在位置的目录对象,然后将对该目录进行读写的权限授予SCOTT用户:create directory ext_data as 'd:\exterior';grant read,write on directory ext_data to scott;注意,这里假设将数据文件存放在D:\EXTERIOR目录。
(3)连接到SCOTT模式,创建外部表。
create table exterior_table(id number(5),tip varchar(20))ORGANIZATION EXTERNAL(TYPE ORACLE_LOADERDEFAULT DIRECTORY ext_dataACCESS Parameters(RECORDS DELIMITED BY NEWLINEbadfile 'bad_dev.txt'LOGFILE 'log_dev.txt'FIELDS TERMINATED BY ',')LOCATION('F1.txt','F2.txt'));(4)查询外部表,显示两个数据文件中的数所。
select * from test_table;(5)在文本文件F1.TXT中添加一行数据,然后再使用上一步中的语句查询外部表。
这时显示的数据应该包括新添加的数据行。
(6)在外部表中,用户不可以直接修改、添加数据,为了解决这个问题,可以将外部表中显示的数据导入到数据库。
Oracle左连接、右连接、全外连接以及(+)号用法
Oracle左连接、右连接、全外连接以及(+)号⽤法1、准备⼯作Oracle 外连接(OUTER JOIN)包括以下:左外连接(左边的表不加限制)右外连接(右边的表不加限制)全外连接(左右两表都不加限制)对应SQL:LEFT/RIGHT/FULL OUTER JOIN。
通常省略OUTER关键字,写成:LEFT/RIGHT/FULL JOIN。
在左连接和右连接时都会以⼀张A表为基础表,该表的内容会全部显⽰,然后加上A表和B表匹配的内容。
如果A表的数据在B表中没有记录。
那么在相关联的结果集⾏中列显⽰为空值(NULL)。
对于外连接,也可以使⽤“(+) ”来表⽰。
关于使⽤(+)的⼀些注意事项:1. (+)操作符只能出现在WHERE⼦句中,并且不能与OUTER JOIN语法同时使⽤。
2. 当使⽤(+)操作符执⾏外连接时,如果在WHERE⼦句中包含有多个条件,则必须在所有条件中都包含(+)操作符。
3. (+)操作符只适⽤于列,⽽不能⽤在表达式上。
4. (+)操作符不能与OR和IN操作符⼀起使⽤。
5. (+)操作符只能⽤于实现左外连接和右外连接,⽽不能⽤于实现完全外连接。
创建两张表,插⼊数据⽤于学习测试:CREATE TABLE t_A (id number,name VARCHAR2(10));CREATE TABLE t_B (id number,name VARCHAR2(10));INSERT INTO t_A VALUES(1,'A');INSERT INTO t_A VALUES(2,'B');INSERT INTO t_A VALUES(3,'C');INSERT INTO t_A VALUES(4,'D');INSERT INTO t_A VALUES(5,'E');INSERT INTO t_B VALUES(1,'AA');INSERT INTO t_B VALUES(1,'BB');INSERT INTO t_B VALUES(2,'CC');INSERT INTO t_B VALUES(1,'DD');2、左外连接(LEFT OUTER JOIN/ LEFT JOIN) LEFT JOIN是以左表的记录为基础的,⽰例中t_A可以看成左表,t_B可以看成右表,它的结果集是t_A表中的全部数据,再加上t_A表和t_B表匹配后的数据。
Oracle 建立外部表
Oracle 建立外部表建立外部表也是使用CREATE TABLE语句来完成的,但建立外部表是必须指定ORGANIZATION EXTERNAL子句。
与建立普通表不同,建立外部表包括两部分:一部分描述列的数据类型,另一部分描述OS文件数据与表列的对应关系。
为了演示如何建立外部表,这里将使用包含逗号分隔符的文件“成绩表.CSV”,该类型的文件可以被Excel使用。
(1)为了建立外部表,Oracle需要知道外部文件在操作系统中的位置,这可以通过使用目录对象作为服务器文件系统上目录的别名来解决。
创建时还需为非特权用户或DBA用户授予CREATE ANY DIRECTORY系统权限。
另外,为了使数据库用户可以访问特定目录下的OS文件,必须将读写目录对象的权限授予用户。
SQL>conn / as sysdba已连接。
SQL> create directory exterior_data2 as 'd:\orcldata\exterior';目录已创建。
SQL> grant read,write on directory exterior_data to scott;授权成功。
在上面的语句中,建立一个名为EXTERIOR_DATA的目录,该目录指向服务器上“d:\orcldata\exterior”目录,D:\ORCLDATA\EXTERIOR目录也是存放EMPLOYEES.XLS 数据文件的位置。
(2)在指定数据文件的位置后,就可以使用CREATE TABLE ... ORGANIZATION EXTERNAL语句创建外部表。
这里需要注意,数据文件中的数据并不会被存储在数据库中。
创建的外部表EXT_EMP的语句如下:SQL> create table ext_emp2 (empno number(4),3 ename varchar2(12),4 job varchar2(12) ,5 mgr number(4) ,6 hiredate date,7 salary number(8),8 comm number(8),9 deptno number(3))10 organization external11 (type oracle_loader12 default directory exterior_data13 access parameters(14 records delimited by newline15 fields terminated by ',')16 location('employees.csv'));表已创建。
ORACLE-技术文档-oracle 驱动表(包含 hint使用 nested loop hash join sortmergegate方式)
Oracle 驱动表Oracle驱动表(driving table/outer table)也叫做外部表,也叫外层表,是在多表关联查询中首先遍历的表,驱动表的每一行都要到另一个表中寻找相应的记录,然后计算返回最终数据。
驱动表的概念只在nested loops和hash join时存在。
原则:1.驱动表一般是小表,但不绝对,看下边2.驱动表一般是通过where条件筛选后剩余行数较少的表。
3.如果表的一条记录很长,占用几个数据块也适合做驱动表4.CBO和RBO中,对于驱动表的选择是不同的,CBO中通过对统计信息的参考进行计算来选择驱动表,而RBO中按照既定原则选择驱动表。
5.RBO中,from后边最右边的表为驱动表(from后边表从右向左遍历,where条件从下向上遍历)6.涉及驱动表的查询,连接条件的索引很重要,驱动表连接字段可以没有索引,但是被驱动表需要被扫描驱动表经过筛选后剩余条数的遍数,所以被驱动表的连接字段上有一条索引是非常重要的。
分析:假设a表10行记录,b表1000行记录,两个表都有id列,查询时使用id列进行关联Select * from a,b where a.id=b.id and a.id=100;A表作为驱动表比较合适,假设a.id=100只有1行,即使全表扫描a表也就几个块,假设a 表占用10个块。
B表的id假如非唯一,如果b表的id列有索引,b表占用100个块,每个块10行记录,id 列索引占用10个块,并且id为100有2条记录,在两个块中那么这条语句的成本(以块计算,下同):A表(10个块)*b表索引(10个块)+b表id为100的2个块=102个块如果b表没有索引,成本为:A表(10个块)*b表(100个块)=1000个块如果a,b表都没有索引,可以看出不管哪个表作为驱动表,语句的执行成本都是一样的。
如果a,b表id列都有索引,a表id列索引占2个块,成本为:A表id列索引(2个块)*b表id列索引(10个块)+ b表id为100的2个块=22个块如果B表的记录很长,可以作为驱动表的情况比较复杂,大家可以自己想象适合的场景。
Oracle执行计划详解
索引唯一扫描(index unique scan)
索引范围扫描(index range scan)
索引全扫描(index full scan)
索引快速扫描(index fast full scan)
(1) 索引唯一扫描(index unique scan)
SQL> explain plan for select empno, ename from emp
where empno > 7876 order by empno;
Query Plan
--------------------------------------------------------------------------------
Oracle执行计划详解
简介:
本文全面详细介绍oracle执行计划的相关的概念,访问数据的存取方法,表之间的连接等内容。
并有总结和概述,便于理解与记忆!
+++
目录
---
一.相关的概念
Rowid的概念
RecursiveSql概念
Predicate(谓词)
DRiving Table(驱动表)
SELECT STATEMENT[CHOOSE] Cost=
TABLE ACCESS FULL DUAL
2) 通过ROWID的表存取(Table Access by ROWID或rowid lookup)
行的ROWID指出了该行所在的数据文件、数据块以及行在该块中的位置,所以通过ROWID来存取数据可以快速定位到目标数据上,是Oracle存取单行数据的最快方法。
oracle中outer用法
oracle中outer用法在Oracle数据库中,outer关键字用于指定查询的外部范围,包括外部连接和外部筛选。
它对于处理多表查询和数据整合非常有用。
本文将介绍outer用法的常见应用场景和示例。
一、外部连接(Outer Join)外部连接可以将两个表中的记录匹配,同时也可以将一个表中未匹配的记录添加到结果集中。
outer连接主要有左外连接(Left Outer Join)、右外连接(Right Outer Join)和全外连接(Full Outer Join)。
1. 左外连接(Left Outer Join)左外连接返回左表中的所有记录以及右表中匹配的记录。
未匹配的左表记录将包含NULL值。
示例:假设有两个表Table1和Table2,其中Table1包含员工信息,Table2包含销售业绩。
我们希望获取所有员工及其对应的销售业绩,同时包括未销售的员工的记录。
```sqlSELECT *FROM Table1 T1LEFT OUTER JOIN Table2 T2ON T1.employee_id = T2.employee_id;```上述查询将返回所有员工及其对应的销售业绩,对于未销售的员工,其业绩字段将显示为NULL。
2. 右外连接(Right Outer Join)右外连接返回右表中的所有记录以及左表中匹配的记录。
未匹配的右表记录将包含NULL值。
示例:假设有两个表Table3和Table4,其中Table3包含订单信息,Table4包含订单明细。
我们希望获取所有订单及其对应的订单明细,同时包括未下订单的记录。
```sqlSELECT *FROM Table3 T3RIGHT OUTER JOIN Table4 T4ON T3.order_id = T4.order_id;```上述查询将返回所有订单及其对应的订单明细,对于未下订单的订单,其明细字段将显示为NULL。
3. 全外连接(Full Outer Join)全外连接返回左表和右表中的所有记录,包括匹配和未匹配的记录。
oracle的insert into用法
oracle的insert into用法提起oracle,大家可能会首先想到它是一种数据库管理系统,可用于存储数据和管理数据库。
但是,oracle不仅有存储和管理数据库的功能,它也拥有一系列SQL语言,比如INSERT INTO语句,可以用来将数据插入到数据库中。
在oracle中,INSERT INTO语句用于将新行插入到表中,以添加新数据。
INSERT INTO语句定义如下:INSERT INTO名 (列名1,列名2) VALUES (值1,值2…);表名是要插入数据的表名;列名1,列名2是要插入的列名;值1,值2是要插入的值。
如果要插入的行中的所有值都有效,则可以使用以下INSERT INTO语句:INSERT INTO名 VALUES (值1,值2…);使用INSERT INTO语句可以在oracle中插入多行,INSERT INTO 语句还可以使用SELECT子句来实现,此时可以使用以下语句:INSERT INTO名 (列名1,列名2… SELECT名1,列名2… FROM名。
以上的语法只是oracle的基本insert into语句的用法。
实际上,oracle的insert into语句还有更多的用法,比如带WHERE子句的INSERT INTO语句,外部表INSERT INTO语句,SELECT WHERE 子句INSERT INTO语句,以及VALUES子句的INSERT INTO语句等。
WHERE子句的INSERT INTO语句用于将数据插入到满足WHERE子句指定条件的行中,语法如下:INSERT INTO名 (列名1,列名2…VALUES (值1,值2… WHERE件1 and件2…。
外部表INSERT INTO语句用于将数据从外部表中插入到oracle 数据库中,语法如下:INSERT INTO名 (列名1,列名2… VALUES (值1,值2… FROM部表;SELECT WHERE子句INSERT INTO语句用于从oracle数据库中的一个表中查询数据并插入到另一个表中。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
外部表介绍ORACLE外部表用来存取数据库以外的文本文件(Text File)或ORACLE专属格式文件。
因此,建立外部表时不会产生段、区、数据块等存储结构,只有与表相关的定义放在数据字典中。
外部表,顾名思义,存储在数据库外面的表。
当存取时才能从ORACLE专属格式文件中取得数据,外部表仅供查询,不能对外部表的内容进行修改(INSERT、UPDATE、DELETE操作)。
不能对外部表建立索引。
因为创建索引就意味着要存在对应的索引记录。
而外部表其实在没有存储在数据库中。
故在外部是无法建立索引的。
如果硬要建立的话,则系统会提示“操作在外部组织表上不受支持”的错误提示。
Notice: 外部表是ORACLE 9i后引入的。
外部表特征(1)位于文件系统之中(一定要在数据库服务器中,而不是其它网络路径),按一定格式分割,例如@#$等,文本文件或者其他类型的文件可以作为外部表。
(2)对外部表的访问可以通过SQL语句来完成,而不需要先将外部表中的数据装载进数据库中。
(3)外部数据表都是只读的,因此在外部表不能够执行DML操作,也不能创建索引。
(4) ANALYZE语句不支持采集外部表的统计数据,应该使用DMBS_STATS包来采集外部表的统计数据。
(5)可以查询操作和连接。
也可以并行操作。
(6)数据在数据库的外部组织,是操作系统文件。
(7)操作系统文件在数据库中的标志是通过一个逻辑目录来映射的。
外部表范例:1:创建目录对象并授权从9i开始,ORACLE数据库若需要存取文件系统,就必须使用目录对象,以相对路径方式存取文件,强化数据库的安全性。
建立目录对象、授予权限。
SQL>CREATE OR REPLACE DIRECTORY DUMP_DIR AS '/oradata/exterltab';给用户授予指定目录的操作权限SQL>GRANT READ,WRITE ON DIRECTORY DUMP_DIR TO ETL;2:创建外部表我创建了一个平面文件作为测试用例,如下所示,总共5条记录,其中一条错误记录[oracle@DB-Server exterltab]$ more student.data10001@#$kerry@#$male@#$28@#$110002@#$jimmy@#$male@#$22@#$110003@#$ken@#$male@#$21@#$110004@#$merry@#$femal@#$20@#$1this is a bad fileCREATE TABLE EXTER_TEST(ID NUMBER(5) ,NAME VARCHAR(12) ,SEX VARCHAR(8) ,AGE NUMBER(3) ,GRADE NUMBER(1)) ORGANIZATION EXTERNAL(type oracle_loaderdefault directory dump_diraccess parameters(records delimited by newlinefields terminated by'@#$')location ('student.data'));外部表语法也是蛮复杂的,参数选项非常多,这里不做过多解释。
有兴趣自然可以翻阅官方文档。
SQL> select * from exter_test;select * from exter_test*ERROR at line 1:ORA-29913: error in executing ODCIEXTTABLEFETCH calloutORA-30653: reject limit reachedORA-06512: at "SYS.ORACLE_LOADER", line 52出现下面错误,是因为student.data文件中有不符合规范的记录,可以删除“this is a bad file”这一条记录,但是这是为了测试下面情况,所以可以通过执行 alter table exter_test reject limit unlimited;跳过一些限制。
SQL> alter table exter_test reject limit unlimited;Table altered.SQL> select * from exter_test;ID NAME SEX AGE GRADE---------- ------------ -------- ---------- ----------10001 kerry male 28 110002 jimmy male 22 110003 ken male 21 110004 merry femal 20 1SQL>此时去查看/oradata/exterltab,你会发现自动生成了EXTER_TEST_8907.bad 和EXTER_TEST_8907.log两个文件,其中log记录访问外部表的记录信息,bad文件记录错误记录的信息。
大体如下所示[oracle@DB-Server exterltab]$ lsEXTER_TEST_8907.bad EXTER_TEST_8907.log student.data[oracle@DB-Server exterltab]$3:查看外部表的目录xxx_external_locations 可以知道当前所有的目录对象以及相关的外部表,还会查询出这些外部表所对应的操作系统文件的名字。
select * from all_external_locations;select * from user_external_locations;select * from dba_external_locations;SQL> show userUSER is "SYS"SQL> col owner for a20SQL> col table_name for a30SQL> col location for a30SQL> col directory_owner for a3;SQL> col directory_name for a30;SQL> select * from dba_external_locations;OWNER TABLE_NAME LOCATION DIR DIRECTORY_NAME--------- -------------------------- ------------------------------------------SH SALES_TRANSACTIONS_EXT sale1v3.dat SYSDATA_FILE_DIRETL EXTER_TEST student.data SYS DUMP_DIR 4:查看外部表的详细信息select * from user_external_tables;select * from all_external_tables;select * from dba_external_tables;SQL> desc dba_external_tables;Name Null? Type----------------------------------------- ------------------------------------OWNER NOT NULL VARCHAR2(30)TABLE_NAME NOT NULL VARCHAR2(30)TYPE_OWNER CHAR(3)TYPE_NAME NOT NULL VARCHAR2(30)DEFAULT_DIRECTORY_OWNER CHAR(3)DEFAULT_DIRECTORY_NAME NOT NULL VARCHAR2(30)REJECT_LIMIT VARCHAR2(40)ACCESS_TYPE VARCHAR2(7)ACCESS_PARAMETERS VARCHAR2(4000)PROPERTY VARCHAR2(10) 5:删除外部表删除外部表SQL语法跟普通表一样,但是不同之处在于有可能还要删除与之对应的目录对象。
当外部表不用时,需要及时删除外部表或者与之对应的目录对象。
不过在删除这些内容时会有一些限制。
这些限制主要是管理上的限制,而不是技术上的限制。
也就是说,Oracle 数据库系统没有对其进行强制的限制。
但是如果数据库管理员不遵守这些限制的话,可能会出现一些问题。
如要先删除外部表,然后再删除目录对象。
有时候一个目录对象中可能会包含多个外部表。
此时必须要确认所有的外部表都不用了,都已经删除干净了,然后才能够删除目录对象。
在创建外部表时,操作系统会判断一下,与之对应的目录对象是否已经创建。
但是在删除对象时,系统不会去判断跟这个目录对象关联的外部表是否已经全部删除。
如果目录对象删除了,但是还有外部表存在。
此时查询这个外部表的时候,系统就会提示“对象不存在”的错误信息。
所以这个删除目录对象时,数据库系统缺乏一种检查,此时只有数据库管理员在删除目录对象时,先手工确认一下这个目录对象是否存在其他的外部表。
外部表限制:1. 只能对表进行SELECT,不能进行DELETE、UPDATE、INSERT这些DML操作。
2. 因为外部表需要在ORACLE数据库“服务端”创建目录,OS文件必须放在这些目录中。
即这些文件只能放在数据库服务端。
如果数据文件不位于服务器,则无法使用外部表3. 外部表上不能创建索引。
但可以建立视图4. 外部表不支持LOB对象。
如果要使用LOB类型,则不能使用外部表。
eg:删除外部表的记录SQL> delete from exter_test where id=10001;delete from exter_test where id=10001*ERROR at line 1:ORA-30657: operation not supported on external organized tableeg: 在外部表上创建视图SQL> create or replace view vv2 as3 select * from etl.exter_test;View created.SQL> select * from vv;ID NAME SEX AGE GRADE---------- ------------ -------- ---------- ----------10001 kerry male 28 110002 jimmy male 22 110003 ken male 21 110004 merry femal 20 1SQL>外部表优势:如果要谈外部表的优势,一般会和SQLLDR来对比,外部表很多语法跟SQLLDR控制文件确实有很多类似的地方,下面谈谈自己的理解和"Oracel 9i&10g编程艺术"里面的一些对比1. SQLLDR需要将数据装载入库后才能查询相关记录,如果只是为了查询一些记录,外部表确实比SQLLDR要有优势一些,很方便又不占用数据库存储空间。