通过DB2 TPC-C基准实现探索SQL(2)

PAYMENT事务

PAYMENT事务有两种版本。对于那些提供了客户id 的客户,使用第一种版本。对于不记得客户ID,而只提供了姓氏的客户,使用第二种版本。这里只讨论第二种版本,因为其中提出了第一种版本中所没有的挑战。

在支付事务(按姓氏)中,必须发生以下步骤:

检索地区的名称和地址。

根据姓氏发现客户的客户 id。如果在该地区有多个同姓的客户,则正确的客户应该是根据客户的名字得来的“中间”客户。

检索客户的个人信息。

增加该地区至今为止的收入。

增加仓库至今为止的收入。

增加客户的支付额,如果客户信用不佳,则还应包括额外的数据。

将这次的支付记录到历史中。

与前面的事务一样,这里的大部分逻辑被封装到一个名为 PAY_C_LAST() 的表函数中。

清单 13. 表函数 PAY_C_LAST

1
CREATE FUNCTION PAY_C_LAST( W_ID INTEGER
2              , D_ID SMALLINT
3              , C_W_ID INTEGER
4              , C_D_ID SMALLINT
5              , C_LAST VARCHAR(16)
6              , H_DATE BIGINT
7              , H_AMOUNT BIGINT
8              , BAD_CREDIT_PREFIX VARCHAR(34)
9              )
10
RETURNS TABLE(  W_STREET_1 CHAR(20)
11        , W_STREET_2 CHAR(20)
12        , W_CITY CHAR(20)
13        , W_STATE CHAR(2)
14        , W_ZIP CHAR(9)
15        , D_STREET_1 CHAR(20)
16        , D_STREET_2 CHAR(20)
17        , D_CITY CHAR(20)
11        , D_STATE CHAR(2)
19        , D_ZIP CHAR(9)
20        , C_ID INTEGER
21        , C_FIRST VARCHAR(16)
22        , C_MIDDLE CHAR(2)
23        , C_STREET_1 VARCHAR(20)
24        , C_STREET_2 VARCHAR(20)
25        , C_CITY VARCHAR(20)
26        , C_STATE CHAR(2)
27        , C_ZIP CHAR(9)
28        , C_PHONE CHAR(16)
29        , C_SINCE BIGINT
30        , C_CREDIT CHAR(2)
31        , C_CREDIT_LIM BIGINT
32        , C_DISCOUNT INTEGER
33        , C_BALANCE BIGINT
34        , C_DATA CHAR(200)
35       )
36
SPECIFIC PAY_C_Id
INHERIT ISOLATION LEVEL WITH LOCK REQUEST
37
MODIFIES SQL DATA DETERMINISTIC NO EXTERNAL ACTION LANGUAGE SQL
38 VAR:
BEGIN ATOMIC
39
DECLARE W_NAME CHAR(10) ;
40
DECLARE D_NAME CHAR(10) ;
41
DECLARE W_STREET_1 CHAR(20) ;
42
DECLARE W_STREET_2 CHAR(20) ;
43
DECLARE W_CITY CHAR(20) ;
44
DECLARE W_STATE CHAR(2) ;
45
DECLARE W_ZIP CHAR(9) ;
46
DECLARE D_STREET_1 CHAR(20) ;
47
DECLARE D_STREET_2 CHAR(20) ;
48
DECLARE D_CITY CHAR(20) ;
49
DECLARE D_STATE CHAR(2) ;
50
DECLARE D_ZIP CHAR(9) ;
51
DECLARE C_ID INTEGER ;
52
DECLARE C_FIRST VARCHAR(16) ;
53
DECLARE C_MIDDLE CHAR(2) ;
54
DECLARE C_STREET_1 VARCHAR(20) ;
55
DECLARE C_STREET_2 VARCHAR(20) ;
56
DECLARE C_CITY VARCHAR(20) ;
57
DECLARE C_STATE CHAR(2) ;
58
DECLARE C_ZIP CHAR(9) ;
59
DECLARE C_PHONE CHAR(16) ;
60
DECLARE C_SINCE BIGINT ;
61
DECLARE C_CREDIT CHAR(2) ;
62
DECLARE C_CREDIT_LIM BIGINT ;
63
DECLARE C_DISCOUNT INTEGER ;
64
DECLARE C_BALANCE BIGINT ;
65
DECLARE C_DATA CHAR(200) ;
66
67  /* Update District and retrieve its data */
68
SET ( D_NAME, D_STREET_1, D_STREET_2, D_CITY, D_STATE, D_ZIP )
69   = (
SELECT  D_NAME, D_STREET_1, D_STREET_2, D_CITY, D_STATE, D_ZIP
70
FROM OLD TABLE (
UPDATE DISTRICT
71
SET D_YTD = D_YTD + PAY_C_ID.H_AMOUNT
72
WHERE D_W_ID = PAY_C_ID.W_Id
73
AND D_ID  = PAY_C_ID.D_Id
74              )
AS U
75    )
76  ;
77  /* Determine the C_ID */
78
SET ( C_ID )
79   = (
SELECT C_Id
80
FROM (
SELECT  C_Id
81             , COUNT(*) OVER()
AS COUNT
82             , ROWNUMBER() OVER (
ORDER BY C_FIRST)
AS NUM
83
FROM CUSTOMER
84
WHERE C_LAST = PAY_C_LAST.C_LAST
85
AND C_W_ID = PAY_C_LAST.C_W_Id
86
AND C_D_ID = PAY_C_LAST.C_D_Id
87        )
AS T
88
WHERE NUM = (COUNT + 1) / 2
89    )
90  ;
91  /* Update the customer */
92
SET (  C_FIRST, C_MIDDLE, C_STREET_1, C_STREET_2
93     , C_CITY, C_STATE, C_ZIP, C_PHONE, C_SINCE, C_CREDIT, C_CREDIT_LIM
94     , C_DISCOUNT, C_BALANCE, C_DATA )
95   = (
SELECT  C_FIRST, C_MIDDLE, C_STREET_1, C_STREET_2
96        , C_CITY, C_STATE, C_ZIP, C_PHONE, C_SINCE, C_CREDIT
97        , C_CREDIT_LIM , C_DISCOUNT, C_BALANCE
98        ,
CASE WHEN C_CREDIT = 'BC'
99
THEN SUBSTR(C_DATA, 1, 200)
END AS C_DATA
100
FROM NEW TABLE (
UPDATE CUSTOMER
101
SET  C_BALANCE   = C_BALANCE - PAY_C_ID.H_AMOUNT
102                  , C_YTD_PAYMENT = C_YTD_PAYMENT + PAY_C_ID.H_AMOUNT
103                  , C_PAYMENT_CNT = C_PAYMENT_CNT + 1
104                  , C_DATA =
CASE WHEN C_CREDIT = 'BC'
105
THEN  BAD_CREDIT_PREFIX
106                            || SUBSTR( C_DATA, 1, 466 )
107
ELSE C_DATA
108
ENd
109
WHERE C_W_ID = PAY_C_ID.C_W_Id
110
AND C_D_ID = PAY_C_ID.C_D_Id
111
AND C_ID  = PAY_C_ID.C_Id
112             )
AS U
113    )
114  ;
115  /* Update the warehouse */
116
SET ( W_NAME, W_STREET_1, W_STREET_2, W_CITY, W_STATE, W_ZIP )
117   = (
SELECT W_NAME, W_STREET_1, W_STREET_2, W_CITY, W_STATE, W_ZIP
118
FROM OLD TABLE (
UPDATE WAREHOUSE
119
SET W_YTD = W_YTD + PAY_C_ID.H_AMOUNT
120
WHERE W_ID = PAY_C_ID.W_Id
121             )
AS U
122    )
123  ;
124  /* Finally insert into the history */
125
INSERT
126
INTO HISTORY ( H_C_ID, H_C_D_ID, H_C_W_ID, H_D_Id
127         , H_W_ID, H_DATA, H_DATE, H_AMOUNT )
128
VALUES (  PAY_C_ID.C_Id
129       , PAY_C_ID.C_D_Id
130       , PAY_C_ID.C_W_Id
131       , PAY_C_ID.D_Id
132       , PAY_C_ID.W_Id
133       , VAR.W_NAME || CHAR( '  ', 4 ) || VAR.D_NAME
134       , PAY_C_ID.H_DATE
135       , PAY_C_ID.H_AMOUNT
136      )
137  ;
138  /* Done - return the collected data */
139
RETURN VALUES (  W_STREET_1, W_STREET_2, W_CITY, W_STATE, W_ZIP
140          , D_STREET_1, D_STREET_2, D_CITY, D_STATE, D_ZIP
141          , C_ID , C_FIRST, C_MIDDLE, C_STREET_1, C_STREET_2
142          , C_CITY, C_STATE, C_ZIP, C_PHONE, C_SINCE, C_CREDIT
143          , C_CREDIT_LIM , C_DISCOUNT, C_BALANCE, C_DATA
144         )
145  ;
146
END

时间: 2024-12-04 17:52:27

通过DB2 TPC-C基准实现探索SQL(2)的相关文章

通过DB2 TPC-C基准实现探索SQL(1)

简介 在过去一年半的时间里,在 标准TPC-C基准方面有很多DB2 for LUW 活动,这个基准常用于测试在线事务处理环境中的性能.其结果跨度很大,在具备通常配置的机器上,它可能是非常小的数字,在那些家庭和工作中不多见的特殊配置上,又可能是非常大的数字. 虽然填充数据库模式的行的数量可能被调整到一定规模,但有一个地方仍然是相同的:SQL.在本文中,您将认识 TPC-C 基准的逻辑,理解 SQL 技术,并发现如何在实际的客户环境中使用 SQL 技术. 为了达到这个目的,作者 Serge Riel

DB2 for i5/OS上的SQL性能优化目标评测

简介 DB2 for i5/OS on V5R4 提供了一些新方法来通过一些流行的动态 SQL 接口提高数据库查询的性能.SQL Call Level Interface (CLI) 为用户提供了一个新的连接属性,用于调优数据库查询使用的优化目标.用于 IBM Developer Kit for Java 的 Java Database Connectivity (JDBC) 接口(也称 Native JDBC)和 Toolbox 也提供了一个新的可控制查询优化目标的连接属性.那些熟悉 Syst

DB2中两种语言:SQL/XML和XQuery的使用

您可以单独使用 XQuery 和 SQL,但也可将 XQuery 嵌入 SQL 中使用(反之亦可).每一种可选方案在特定环境下都非常有用.本文将讨论这些可选方案,介绍其各自的优缺点,并给出根据您的需求选择恰当方案的指导原则. DB2 中的 pureXML 支持为管理 XML 数据提供了高效且通用的功能.DB2 以 XML 数据自身固有的分层格式存储和处理这些数据,避免因为将 XML 存储为 CLOB 中的文本或将它映射为关系表而导致的性能和灵活性限制.与仅使用 XML 的数据库不同,DB2 V9

MS SQL Server 大战 IBM DB2

数据库技术是计算机科学中发展最快的领域之一,数据库的诞生和发展给计算机信息管理带来了一场巨大的革命. 数据库的诞生和发展给计算机信息管理带来了一场巨大的革命, 作为关系数据库领域的开拓者和领航人,IBM在1983年推出第一款数据库DB2 for MVSV1 ,目前,其最新版本为DB2 9.7 版. Microsoft SQL Server提供了良好的性能和扩展性.高有效性.行业领先的安全性且便于管理,但只能用于Windows操作系统,最新版本为SQL Server 2008. 下面对这两类操作系

SQL Server与Oracle、DB2的优劣对比

SQL Server与Oracle.DB2的优劣对比: 1.开放性: SQL Server 只能在Windows上运行,没有丝毫的开放性,操作系统的系统的稳定对数据库是十分重要的.Windows9X系列产品是偏重于桌面应用,NT Server只适合中小型企业.而且Windows平台的可靠性,安全性和伸缩性是非常有限的.它不象unix那样久经考验,尤其是在处理大数据量的关键业务时. Oracle 能在所有主流平台上运行(包括 windows).完全支持所有的工业标准.采用完全开放策略.可以使客户选

使用SQL语句优化DB2应用程序性能

当我们设计一个新的或分析一个现存的系统时,其中所要考虑的一个重要问题就是应用程序的设计问 题.即使数据库设计得很好而且还经过优化处理,应用程序设计不适当还是会引起性能问题的 数据库. 实践证明,如果应用程序存在设计上的问题,那么修改这些问题比调整数据库配置参数更能改善应用程序 的性能. 例如,SQL是一种高级语言,具有很大的灵活性,从数据库中提取相同的数据可以用不同形式的SELECT 语句来实现,但是,应用程序的性能却随着SELECT语句形式的不同而大相径庭,这是因为不同形式的 SELECT语句

调优IBM DB2 UDB SQL存取路径

简介 Visual Explain 是 IBM DB2 Universal Database 中的杰出工具,程序员和 DBA 用它来详细说明 DB2 优化器为 SQL 语句所选择的存取路径.事实上,Explain 应该是您性能监控策略的 关键组件.Explain 为解决许多类型的性能问题提供了价值无法估量的信息,因为它提供这样的细节: DB2 在"幕后"所做的工作,以实现 SQL 请求的数据需求 DB2 是否使用可用的索引,如果使用,DB2 如何使用它们 为满足连接条件而访问 DB2

SQL Server 2008与IBM DB2对比

Microsoft SQL Server 2008提供了更好的性能和扩展性.高有效性.行业领先的安全性.更容易的管理能力.提高的开发人员生产力.领先的商业智能和数据仓储能力.一个用于主机OLTP的平台和SAP集成--所有这些都以低于IBM DB2的总体拥有成本提供.基于此,许多公司从DB2移植到了SQL Server.目前SQL Server在新的关系型数据库管理系统许可证市场中所占的份额高于DB2. 对比方面 · 总体拥有成本(TCO)和ROI · 性能和可扩展性 · 高有效性 · 安全性 ·

SQL Server链接服务器访问DB2设置步骤图解

原文 http://database.51cto.com/art/201108/283240.htm SQL Server可以使用链接服务器功能来连接其他的数据库,以实现不同数据库之间的操作.本文我们主要介绍了利用SQL Server利用链接服务器连接访问DB2数据库的操作步骤,并给出了详细的截图,接下来就让我们一起来了解一下这部分内容吧. 使用SQL SERVER的链接服务器连接DB2 1.下载安装Microsoft OLEDB Provider for DB2,SQL SERVER链接服务器