DB2数据库SQL存储过程.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
DB2数据库SQL存储过程

DB2数据库SQL存储过程 高性能的SQL过程是数据库开发人员所追求的,我将不断把学到的,或在实际开发中用到的一些提高SQL过程性能的技巧整理出来,温故而知新. 1,在只使用一条语句即可做到时避免使用多条语句 让我们从一个简单的编码技巧开始。如下所示的单个 INSERT 行序列: INSERT INTO tab_comp VALUES (item1, price1, qty1); INSERT INTO tab_comp VALUES (item2, price2, qty2); INSERT INTO tab_comp VALUES (item3, price3, qty3); 可以改写成: INSERT INTO tab_comp VALUES (item1, price1, qty1), (item2, price2, qty2), (item3, price3, qty3); 执行这个多行 INSERT 语句所需时间大约是执行原来三条语句的三分之一。孤立地看,这一改进看起来似乎是微乎其微的,但是,如果这一代码段是重复执行的(例如该代码段位于循环体或触发器体中),那么改进是非常显著的。 类似地,如下所示的 SET 语句序列: SET A = expr1; SET B = expr2; SET C = expr3; 可以写成一条 VALUES 语句: VALUES expr1, expr2, expr3 INTO A, B, C; 如果任何两条语句之间都没有相关性,那么这一转换保留了原始序列的语义。为了说明这一点,请考虑: SET A = monthly_avg * 12; SET B = (A / 2) * correction_factor; 将上面两条语句转换成: VALUES (monthly_avg * 12, (A / 2) * correction_factor) INTO A, B; 不会保留原始的语义,因为是以“并行”方式对 INTO 关键字之前的表达式进行求值的。这意味着赋给 B 的值并不以赋给 A 的值为基础,这是原始语句预期的语义。 2,从多个 SQL 语句到一个 SQL 表达式 跟其它编程语言一样,SQL 语言提供了两类条件构造:过程型(IF 和 CASE 语句)和函数型(CASE 表达式)。在大多数环境中,可使用任何一种构造来表达计算,到底使用哪一种只是喜好问题。但是,使用 CASE 表达式编写的逻辑不但比使用 CASE 或 IF 语句编写的逻辑更紧凑,而且更有效。 请考虑下面的 SQL PL 代码片段: IF (Price = MaxPrice) THEN INSERT INTO tab_comp(Id, Val) VALUES(Oid, Price); ELSE INSERT INTO tab_comp(Id, Val) VALUES(Oid, MaxPrice); END IF; IF 子句中的条件仅用于决定将什么值插入 tab_comp.Val 列中。为了避免过程层和数据流层之间的上下文切换,可利用 CASE 表达式将相同的逻辑表示成一个 INSERT 语句: INSERT INTO tab_comp(Id, Val) VALUES(Oid, CASE WHEN (Price = MaxPrice) THEN Price ELSE MaxPrice END); 值得注意的是,CASE 表达式可在任何希望有标量值的上下文中使用。特别地,可在赋值符号的右边使用它们。例如: IF (Name IS NOT NULL) THEN SET ProdName = Name; ELSEIF (NameStr IS NOT NULL) THEN SET ProdName = NameStr; ELSE SET ProdName = DefaultName; END IF; 可以改写成: SET ProdName = (CASE WHEN (Name IS NOT NULL) THEN Name WHEN (NameStr IS NOT NULL) THEN NameStr ELSE DefaultName END); 实际上,这个特殊的示例有一个更好的解决方案: SET ProdName = COALESCE(Name, NameStr, DefaultName); 3、使用 SQL 的一次处理一个集合语义 诸如循环、赋值和游标之类的过程化构造允许我们表达那些只使用 SQL DML 语句是不可能表达的计算。但是,当我们拥有一些可以随意使用的过程语句时,即使我们手头的计算实际上仅使用 SQL DML 语句就可表达,但转换成过程语句还是有风险的。正如我们以前提到的,过程计算的性能与使用 DML 语句表

文档评论(0)

xcs88858 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

版权声明书
用户编号:8130065136000003

1亿VIP精品文档

相关文档