`
mgoann
  • 浏览: 253407 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

使用DB2内置函数快速构造测试数据

    博客分类:
  • DB2
阅读更多

使用DB2内置函数快速构造测试数据
 
【案例】使用DB2内置函数快速构造测试数据
 无论您是在用原型证明某一概念,还是开发一个全新的应用程序,或者只是学习 SQL,您都需要在您的应用程序上运行测试数据。为了有效地测试应用程序的性能,您必须拥有足够的测试数据,以便暴露潜在的性能问题。只要可以得到,用实际数据来进行测试总是更可取一些。如果没有可用的实际数据,那么在许多情况下,也可以生成足够的假想数据。一般来说,从头开始构造大量数据是件很容易的工作,可以使用db2的SQL语句就可以完成。
【案例类别】测试数据、构造数据
【关键字】date create generate insert select
【问题现象】
 无论您是在用原型证明某一概念,还是开发一个全新的应用程序,或者只是学习 SQL,都需要在应用程序上运行测试数据。为了有效地测试应用程序的性能,必须拥有足够的测试数据,以便暴露潜在的性能问题。只要可以得到,用实 际数据来进行测试总是更可取一些。如果没有可用的实际数据,那么在许多情况下,也可以生成足够的假想数据。一般来说,从头开始构造大量数据是件很容易的工 作,可以使用db2的SQL语句就可以完成
【问题分析】
Db2 OLAP(分析函数简介)
 生成大量测试数据需要用到DB2的分析函数来进行有规则的构造数据。
RAND():rand函数用来生成一组随机数,介于0-1之间的的随即小数,例如:
Select rand() as NUM from syscat.tablespaces,输出如下:
NUM       
-----------
+1.53311722517624E-001
          +5.54695940834794E-001
          +1.42065802655213E-001
          +7.82508742428622E-001
  4 record(s) selected.

RAND()函数应用:
 使用RAND()生成随即数,例如”SELECT INT(RAND() * 50 + 1) AS NUM FROM SYSCAT.TABLESPACES”,生成50以内的随即数。结果如下:

NUM       
-----------
         16
         19
         10
          8
  4 record(s) selected.

ROW_NUMBER():Row_Number函数用于生成整数序列很方便。
ROW_NUMBER()函数应用:
 使用ROW_NUMBER()函数生成递增序列,”SELECT ROW_NUMBER() OVER() AS SEQ FROM SYSBAT.TABLESPACES”,结果如下:
SEQ                
--------------------
                   1
                   2
                   3
                   4
  4 record(s) selected.

利用DB2内置函数生成辅助表:
 为什么要生成辅助表呢?再构造负责的数据,或者是满足某种分布状态的数据,我们的构造语句会非常复杂,如果不使用辅助表(也就是临时表),下面我们看看我们需要那些辅助表:生成一个自增加序列表,如果想要使用子增加序列或者是生成主键就需要用到该辅助表,生成一个字母和数据映射的ASCII骂表,因为再处理字符串时,需要用数字来模拟生成字符串的序列,然后再通过db2的内置函数ASCII来转化为db2的字符串序列。构造生成一个与时间映射的辅助表。

自增长序列表:
 “CREATE TABLE SEQ_DATE (NUM INT NOT NULL,PRIMARY KEY (NUM))”

“INSERT INTO SEQ_DATE SELECT ROW_NUMBER() OVER() FROM SYSCAT.COLUMNS T1 JOIN SYSCAT.COLUMNS T2 ON T1 != T2 FETCH FIRST N ROWS ONLY”
第一句为构建辅助表SQL,第二句为将数据插入到临时表中,其中N修改为自己想要插入的记录条数。

ASCII码表:
 “CREATE TABLE ASCII_DATE (ASCII CHAR(1) NOT NULL, NUM INT NOT NULL)”
 “INSERT INTO ASCII_DATE SELECT CHR(NUM) AS ASCII, NUM FROM SEQ_DATE WHERE NUM>=48 AND NUM <=122”,其中CHR函数表示将数据转化为ASCII码,而WHERE条件是指,指转换可视的ASCII码,这里可以根据需要将自己需要的ASCII添加的WHERE条件中,如下表中不包含回车和换行,如果想构造特殊的字符串(包含换行或者回车),可以将WHERE条件更改为WHERE NUM>=48 AND NUM <=122 OR NUM=10 OR NUM=13
 使用SELECT * FROM ASCII_DATE查询表中数据,结果如下:
ASCII 十进制 ASCII 十进制 ASCII 十进制
0 48 D 68 ] 93
1 49 E 69 ^ 94
2 50 F 70 _ 95
3 51 G 71 ` 96
4 52 H 72 a 97
5 53 I 73 b 98
6 54 J 74 c 99
7 55 K 75 d 100
8 56 L 76 e 101
9 57 M 77 f 102
: 58 N 78 g 103
; 59 O 79 h 104
< 60 P 80 i 105
= 61 Q 81 j 106
> 62 R 82 k 107
? 63 S 83 l 108
@ 64 T 84 m 109
A 65 U 85 n 110
B 66 V 86 o 111
C 67 W 87 p 112
w 119 X 88 q 113
x 120 Y 89 r 114
y 121 Z 90 s 115
z 122 [ 91 t 116
v 118 \ 92 u 117

 这样在构造特定字符序列的时候就可以使用先生成数据,然后转换为ASCII,这样构造特定字符序列的问题就转化为了生成特定的数据的问题了。

日期辅助表:
 
 由于日期辅助表比较灵活,需要根据具体的应用场景来生成具体的辅助表,所以这里就举例说明,下面不再累述。
 场景1:需要生成2010年3月份的某一天。
 “CREATE TABLE TIME_SEQ (DATE_ CHAR(8) NOT NULL, NUM INT NOT NULL)”
 “INSERT INTO TIME_SEQ SELECT DATE('03/01/2010') + (NUM - 1) DAYS AS DATE_1, NUM  FROM SEQ_DATE WHERE NUM>=1 AND NUM <=30”
 生成的数据如下:

DATE_1 NUM DATE_1 NUM
03/01/2010 1 03/16/2010 16
03/02/2010 2 03/17/2010 17
03/03/2010 3 03/18/2010 18
03/04/2010 4 03/19/2010 19
03/05/2010 5 03/20/2010 20
03/06/2010 6 03/21/2010 21
03/07/2010 7 03/22/2010 22
03/08/2010 8 03/23/2010 23
03/09/2010 9 03/24/2010 24
03/10/2010 10 03/25/2010 25
03/11/2010 11 03/26/2010 26
03/12/2010 12 03/27/2010 27
03/13/2010 13 03/28/2010 28
03/14/2010 14 03/29/2010 29
03/15/2010 15 03/30/2010 30

同样生成日期的问题转换为了生成数据序列,数据序列是我们很好生成的。

使用如下语句生成10000条3月份随即某一天的记录:
“SELECT DATE FROM TIME_SEQ AS S1, (SELECT INT(RAND() * 30 + 1) AS NUM FROM SYSCAT.COLUMNS T1 JOIN SYSCAT.COLUMNS T2 ON T1.COLNAME != T2.COLNAME FETCH FIRST 10000 ROWS ONLY) AS S2 WHERE S1.NUM=S2.NUM”

构造辅助表是我们构造负责数据的基础,通过辅助表可以将复杂的数据生成规则转换成为生成简单的数据序列。掌握好这样原则,构造灵活好用的辅助表可以使你的数据分布达到你的要求。

常用生成规则实例:
唯一主键:
 唯一主键一般有俩中,一种是固定长度的随即数据序列,一种是变长的递增数字序列。
 固定长度的数据序列(长度为5位的唯一序列):
 
 “CREATE TABLE SIMAPLE_TABLE (KEY VARCHAR(5) NOT NULL, PRIMARY KEY (KEY))”

 “INSERT INTO SIMAPLE_TABLE SELECT
    RTRIM(CHAR(INT(RAND() * 10)))
||RTRIM(CHAR(INT(RAND() * 10)))
||RTRIM(CHAR(INT(RAND() * 10)))
||RTRIM(CHAR(INT(RAND() * 10)))
||RTRIM(CHAR(INT(RAND() * 10))) AS KEY FROM SYSCAT.COLUMNS T1 JOIN SYSCAT.COLUMNS T2 ON T1.COLNAME != T2.COLNAME FETCH FIRST 10000 ROWS ONLY”
 
 其中用到的DB2的内置函数有RTRIM、CHAR、INT、RAND,RTRIM,RAND() * 10是产生一个0-10的随即浮点数,INT将浮点数转化为INT类型,将INT转化为字符串类型,将字符串使用RTRIM将右边的空格去掉。

 变长的递增数字序列:

 “CREATE TABLE UNIQUE_SEQ (KEY VARCHAR(30) NOT NULL, PRIMARY KEY (KEY))”

 “INSERT INTO UNIQUE_SEQ SELECT CHAR(ROW_NUMBER() OVER()) AS KEY FROM SYSCAT.COLUMNS T1 JOIN SYSCAT.COLUMNS T2 ON T1.COLNAME != T2.COLNAME FETCH FIRST 10000 ROWS ONLY”

 其中用到的db2内置函数有ROW_NUMBER() 、OVER(),ROW_NUMBER()函数是对结果集行数的统计函数,而OVER()是配合ROW_NUMBER()函数,以使ROW_NUMBER()能够按照某种分布或是排序来统计。

随即字符串:
 
 “CREATE TABLE STRING_DATE(STRING VARCHAR(5) NOT NULL)”

 “INSERT INTO STRING_DATE
SELECT CHR(INT(RAND() * 75 + 48))
||CHR(INT(RAND() * 75 + 48))
||CHR(INT(RAND() * 75 + 48))
||CHR(INT(RAND() * 75 + 48))
||CHR(INT(RAND() * 75 + 48)) AS STRING
FROM SYSCAT.COLUMNS T1 JOIN SYSCAT.COLUMNS T2 ON T1.COLNAME != T2.COLNAME”

其中用的DB2内置函数有CHR、||,CHR函数是将INT转换为ASCII,而表达式INT(RAND() * 75 + 48)是生成48~122的INT整数,ASCII可视部分都在这个范围之内。||是DB2中的字符串连接。

【问题解决】
 可见使用DB2内置函数来生成测试数据是很轻松的,效率高,而且学习成本比较低,对于构造简单数据规则的数据比较有效。
 
 项目具体实例:
 构造USER表的数据:
  数据规则:userid从1递增,手机号码从13900000001递增。
  数据数量:10000条
  用时:在毫秒级别内

 “INSERT INTO USER (USERID, PASSWD, CREATETIME, REGISTERTYPE, USERSTATE, MOBILE, USERSIGN) SELECT CHAR(ROW_NUMBER() OVER()) AS USERID, 'QTkU2ow3COlC9WDFf7J1JQ==' AS PASSWD, '20100327012752' AS CREATETIME, 3 AS REGISTERTYPE, 0 AS USERSTATE, '+86'||CHAR(13900000000 + ROW_NUMBER() OVER()) AS MOBILE, '1' AS USERSIGN FROM SYSCAT.COLUMNS T1 JOIN SYSCAT.COLUMNS T2 ON T1.COLNAME != T2.COLNAME FETCH FIRST 10000 ROWS ONLY”

【问题总结】
 灵活使用DB2内置函数,可以简化编程。

分享到:
评论

相关推荐

    DB2各类函数总汇

    DB2 中内置了许多种函数,为了便于了解和使用这些函数,本文对 DB2 函数进行了分类总汇。DB2 函数可以分为九大类:聚合函数、类型转换函数、数学函数、字符串函数、日期时间函数、XML 函数、分区函数、安全函数和...

    DB2数值函数简介及使用

    DB2数值函数简介及使用 1、取绝对值的函数:abs、absval 2、向上取整:ceil、ceiling 3、向下取整数:floor 4、求M的n次幂:power(M,n) 5、随机数:rand(m)函数 6、四舍五入:round (m,n) 7、将数值转换为字符串形式...

    DB2函数大全(自己整理的)

    通过以上详细解析,我们可以看出 DB2 提供了大量的内置函数来帮助用户进行数据分析、数据处理以及数据格式化等操作。这些函数不仅能够提高 SQL 查询的效率,还能使查询变得更加灵活和强大。对于从事数据库管理和开发...

    db2调自定义函数(小例)

    4. **调用函数**:一旦函数被成功注册,你就可以像使用内置函数一样在SQL查询中调用它了。例如,你可以创建一个函数`readFile`,它接受一个文件名作为参数,并返回一个CLOB类型的值。这样,你可以在SQL语句中使用这...

    DB2 SQL函数和使用方法

    以下将详细介绍DB2中的SQL函数及其使用方法,以及一些基本的DB2命令。 一、SQL函数 1. **数值函数** - `ABS(x)`: 计算x的绝对值。 - `ROUND(x,y)`: 对x进行四舍五入,y为保留的小数位数。 - `TRUNC(x,y)`: 截断...

    DB2常用函数与Oracle比较

    对于处理时间日期的需求,DB2与Oracle提供了丰富的内置函数,这些函数在日常开发中极为常用。 1. **获取当前时间** - **Oracle**: ```sql SELECT SYSDATE FROM DUAL; ``` - **DB2**: ```sql SELECT CURRENT_...

    DB2数据库函数大全

    在DB2中,函数是处理数据和进行计算的重要工具,对于数据库查询和数据分析至关重要。本篇文章将详细介绍DB2数据库中的一些基本和常用的函数。 1. AVG() 函数:此函数用于计算一组数值的平均值。例如,`SELECT AVG...

    db2字符串分隔,函数,过程的使用

    总的来说,理解和掌握DB2中的字符串分隔函数、字符串函数以及过程的使用,对于日常的数据处理工作至关重要。它们能够帮助我们有效地操作和管理数据库中的字符串数据,提高工作效率。在实际应用中,应根据具体场景...

    db2常用函数

    DB2 是一种关系型数据库管理系统,提供了多种内置函数用于数据处理和分析。下面是 DB2 中常用的函数分类和使用实例。 聚合函数 DB2 提供了多种聚合函数,用于对数据进行汇总和统计分析。 1. COUNT() 函数:返回一...

    db2常用函数整理.doc

    DB2 是一款强大的关系型数据库管理系统,其内置了大量的函数,以支持各种数据处理和分析任务。在DB2中,函数的使用是数据库查询语言SQL的重要组成部分。以下是对DB2常用函数的详细介绍: 1. AVG 函数:这个函数用于...

    db2函数大全,使用方法

    DB2 函数大全使用方法 DB2 函数大全是 DB2 数据库管理系统中提供的一组函数,用于进行数据处理和分析。本文将对 DB2 函数大全进行总结,包括 AVG、CORR、COUNT、COVAR、MAX、MIN、STDDEV、SUM、VAR 等函数,并提供...

    DB2常用函数(初学者必备)

    本文将深入探讨DB2中的常用函数,这些函数覆盖了类型转换、日期时间操作、字符串处理以及数学计算等多个方面,对于初学者来说,掌握这些函数能够极大地提升在DB2环境下的数据操作效率。 ### 类型转换函数 DB2提供...

    db2中自定义函数文档

    本文将深入探讨如何在DB2中创建自定义函数以及它们的使用方式。 首先,创建函数的过程涉及使用`CREATE FUNCTION`语句。这个语句定义了函数的基本结构,包括函数名、参数、返回类型和函数体。下面是对`CREATE ...

    db2,oracle函数大全合集

    它们都提供了丰富的内置函数,以支持复杂的查询、数据处理和分析任务。本合集涵盖了DB2与Oracle的函数大全,旨在帮助数据库管理员和开发人员更好地理解和运用这些功能。 DB2函数: 1. **转换函数**:如`CHAR()`, `...

    DB2函数的详细总结

    DB2函数的使用极大地提高了SQL查询的灵活性和功能性,使得数据处理变得更加便捷。在实际应用中,开发者可以根据需求组合使用这些函数,以实现复杂的逻辑和数据转换。了解和熟练掌握这些函数是DB2数据库开发和管理的...

    DB2函数大全详细解释

    在数据库管理中,DB2提供了丰富的内置函数,用于处理和分析数据。这些函数在SQL查询中发挥着至关重要的作用,帮助用户执行计算、统计分析、字符串操作等多种任务。以下是DB2中一些常见的函数及其详细解释: 1. AVG...

    DB2错误码及其函数

    其次,DB2提供了一些内置的函数来处理错误和诊断信息。例如,SQLCODE函数返回最近执行的SQL语句的错误码,SQLSTATE则返回一个五位的错误状态码,这两个函数是DB2错误处理的核心。SQLERRM函数可以获取与错误码相对应...

    DB2字符串处理 字符串处理 db2 函数

    DB2 中的字符串处理函数可以分为多种类型,包括字符转换函数、去空格函数、取子串函数、字符串比较函数和字符串操作函数等。 一、字符转换函数 * ASCII() 函数:返回字符表达式最左端字符的 ASCII 码值。在 ASCII...

Global site tag (gtag.js) - Google Analytics