在将数据库投入生产使用之前,数据库管理员往往需要先往数据库中导入大量的数据。数据库中只有大量的基础数据,建立在数据库上的应用软件才能够发挥效益。
本文主要谈的就是在将数据从外部文件导入导数据库过程中的一些注意事项。也许这些内容能够帮助管理员解决难题。
一、默认值与空值的争夺战。
在数据库表设计的时候,为了数据的完整性,往往会对某些列设置一些默认值。特别是某个字段不允许为空时,要设置默认值。当用户没有输入对应的值的时候,就利用默认值来填充。如有一张销售订单的表。这个表上有一个字段是“订单日期”。当用户没有输入数据的时候,这个订单日期就默认为当前系统的日期,从而达到简化用户输入的目的。现在的问题是,在起初数据导入的时候,如果目标文件中没有这个列对应的值,而这个字段设置了默认值,此时会有什么后果呢? (DB2数据库与SQLServer数据库的异同)
通常情况下,只要字段没有非空的约束条件(即允许存在空值),则无论这个字段有没有设置默认值,在导入的时候,只要目标文件没有对应的内容,都一律都会使用NULL值来替代目标文件中缺失的列。如果这个字段有非空的约束(即不允许存在空值),则数据库系统会提示不允许空值的错误信息。也就是说,表中的字段默认值的设置一般情况下在导入的过程中是无效的。当目标文件中不存在某个值的时候,数据库不会以列的默认值来填充,而是一律使用NULL值来填充。
但是,如果数据库管理员一定要让默认值来填充这些这些列,是否可以呢?在DB2数据库中,这是可以的。只要目的表已经定义了默认值,那么就可以在导入的语句中使用USEDEFAUITS选项,就可以让数据库系统(Oracle数据库系统使用经验六则)在导入的过车观念中利用默认值来填充目标文件中不存在的数据。注意这里只有目标文件中对应记录的字段值不存在的时候,才会使用默认值。如果存在的话,则仍然采用目标文件中的值。可见这个NULL值与列默认值之间的战争,最后的结果还是在用户手中。用户可以通过USEDEFAULT选项来确定到底是否需要默认值。如果某个字段设置为了非空,而且这个列又设置了默认值的话,那么笔者建议采用默认值,这可以在很大程度上简化数据导入的工作。
二、导入过程中的性能考虑。
当将大量的数据插入到数据库表中的时候,会消耗比较多的数据库资源,从而影响到数据库的性能。为此在将数据导入导数据库的时候,除了需要选择一个用户访问量少的时间。还需要在导入的时候采用合适的手段来提高数据导入的性能。如在DB2数据库中,数据导入的工具主要分类两类,分别为装入使用工具和导入工具。当导入的数据量比较多,而且用户对于性能又有比较严格要求的话,那么笔者建立采用装入使用工具。因为通常情况下,在导入大量数据的时候,装入使用工具能够提供比较高的性能。
当在客户端上导入数据,而不是直接在服务器上导入数据的时候,加入一个compound子句也可以改善数据库的性能。这个子句主要是用来对需要插入的数据进行分组,即以多少条记录为单位,向服务器传送插入请求。由于数据需要在客户端与服务器之间进行传递。客户端从外部文件中读取数据传递到数据库服务器上需要有一段时间;而数据库服务器在接受到客户端的请求将数据插入到表中也需要一段时间。此时如果采用n语句对需要插入的大量记录进行分组,可以改善数据库的性能。一方面可以让客户端与服务器端分工合作,客户端一边从外部文件中读入数据,服务器端一边插入数据,从而减少插入的时间。另一方面,数据分步在网络在网络中传输,也可以提高网络传输的性能,同样可以起到提高性能的目的。总之,数据导入作业往往会降低数据库正常运行的性能。为此在数据导入的时候,最好选择一个比较合适的时间。并且采用以上建议的一些措施来最大程度的降低导入工作对数据库的正常运行带来的负面影响。
三、让活动日志分次落实。
在数据导入的过程中,其最终还是需要通过Insert语句来实现。而DB2数据库在使用这个语句的时候,数据库引擎将会代表导入操作对标更新进行常规的记录。这就好像是在Oracle数据库中将这个表更新的操作记入到日志文件一样。所以,当导入的记录比较多就会潜在的长时间占有当前的活动日志,最终导致数据库管理器消耗完日志空间。为此,在导入数据的过程中,如果记录的数据比较大,那么最好使用COMMITCOUNT N子句。这个子句的主要作用就是告诉数据库系统,插入N条记录之后就需要执行一次日志落实。当使用了这个子句的时候,如果导入操作失败,那么在事务回滚期间,所有最后一次落实以后执行的的改变都会取消。这还可以减少数据导入失败而造成的损失。如果没有采用这个子句,如果导入失败的话,数据库系统会撤消所有导入的记录。也就是说,一切都要重头来过。但是如果采用了这个语句,那么数据库管理员就可以根据系统提供的最后一个落实点的信息,重新启用Import命令,并通过提供RESTARTCOUNT N子句来指导这个命令跳过在前面已经被报告为成功落实到输入文件的行数。即避免重复导入,来提高数据导入效率。数据库管理员可以根据记录量的多少来合理的设置这个n值。一般情况下这个值不要设置的太大。不过如果太小的话,也会影响到数据导入的性能。如果数据量很大,笔者往往将这个值设置为500。不过具体情况具体对待,数据库管理员还是需要根据经验来判断选择一个合适的值。
四、在导入语句中采用格式化选项
在导入数据的时候,一般要求外部文件都能够遵守严格的格式。如果格式不准确的话,那么往往数据导入会失败。所以,有时候数据库管理员在导入的过程中,还不得不采用一些文件类型修饰符,又叫做格式化选项,来规范外部文件的格式。让数据库系统能够正确识别外部文件,从而顺利导入外部数据。
如默认情况下,外部文件的列与列之间是用英文状态下的逗号分割的。如果外部文件不是利用这个符号来分隔的,而是采用冒号或者TAB符号来符合来分隔的,此时数据库管理员有两个选择。一是更改原文件中的分隔符号。利用操作系统的相关命令或者其他软件的帮助,可以改变这个分隔符号。如通过Excle软件来变更等等。二是在导入的时候,采用格式化选项,让导入工具能够识别这个分隔符。如可以在导入语句中加入COLDEL :子句,告诉数据库系统,现在采用的列分隔符不是逗号,而是冒号。如此在不更改原文件的情况下,也可以顺利导入数据。
除此之外,有时候在外部文件中有可能还会因为疏忽将某条记录写成了两行。由于默认情况下是根据行来判断记录,而不是根据列分隔符来区分不同的记录,所以此时这条记录会被当作两条记录来对待。为了避免这种情况,有时候数据库管理员需要更改分隔符号的优先极。默认情况下,DB2数据库分隔符的优先极分别为记录分隔符、字符串分隔符、列分隔符。也就是说记录分隔符(往往是换行符号)具有最高的优先级别。从而就会发生上面提到的情况。为了避免将一条记录 (在两行或者多行中显示)被当作多条记录对待,最好的方法就是利用 MODIFIED BY DELPRIORITYCHAR子句来更改分隔符号的优先性。让列分隔符号具有比较高的优先级。
文章:www.dbfen.com 转载请注明出处