DB2中有没有类似if exists功能

DB2中有没有类似if exists功能,第1张

DB2中没有if exists功能,但有exists功能用法

SELECTE.EMPNO,E.LASTNAME FROM EMPE

WHERE EXISTS

(SELECT1 FROMDEPARTMENTD WHERE D.MGRNO=E.EMPNO AND D.DEPTNO LIKE 'D%')

如果一定要用if exists,刚可使用存储过程的方法解决。

db2 =>call procedure_name()

于我来说,我喜欢技术,不偏执于某一类开发语言,愿意花时间精力去解决问题。

1.去除在谓词列上编写的任何标量函数

优化前:(耗时3.1s)

优化后:(耗时0.922s)

总结:

DB2可以选择使用START_DATE上的列索引,但是在列上使用了函数后,DB2就无法使用列索引了,从而导致查询效率变低。

2.去除在谓词列上编写的任何数学运算

优化前:(耗时10.265)

优化后:(耗时3.39s)

总结:

DB2查询时候,会优先选择列CONTRACT_AMT上的索引,如果直接对列CONTRACT_AMT应用数学运算,DB2就无法使用索引了。一定要做到:列本身(不加数学运算)放在 *** 作符的一边,而所有的计算都放在另外一边。

3.SQL语句中指定查询列

优化前:(耗时13.15s)

优化后:(耗时2.922s)

总结:

如果Select包含不需要的列,优化工具会选择Indexonly=’N’,这会强制DB2必须进入数据页来得到所请求的特定列,这就要求更多的I/O *** 作,梁歪,这些多余的列可能是某些排序的部分,这样一来就需要和传递一个更大的排序文件,相应的会使排序成本更高。

4.尽可能不使用distinct

优化前:(耗时0.687s)

优化后:(耗时0.437s)

总结:

在测试distinct与group by性能的过程中,在列CST_ID上添加索引后,发现group by 确实比distinct快一些,但是在数据分布比较离散的情况下使用group by ,比较集中的情况下使用distinct.表数据量较少的情况随便使用哪个都一样, 不管选择谁,都要建立索引

5.Exists、in、not in 、not exists的使用场景选择

5.1 in跟exists的区别:

例如:表A(小表),表B(大表)

优化前:(耗时1.93s)

优化后:(耗时1.125s)

相反的,

优化前:(耗时1.9s)

优化后:(耗时1.0s)

总结:

in是把外表和内表作hash连接,而exists是对外表作loop循环,每次loop循环再对内表进行查询,一直以来认为exists比in效率高的说法是不准确的。 如果查询的两个表大小相当,那么用in和exists差别不大;如果两个表中一个较小一个较大,则子查询表大的用exists,子查询表小的用in;

简称:子大Exists,子小in

5.2 not in 与 not exists区别:

如果查询语句使用了not in,那么对内外表都进行全表扫描,没有用到索引;而not exists的子查询依然能用到表上的索引。所以无论哪个表大,用not exists都比not in 要快。

6.尽可能使用union all来代替union

优化前:(耗时15.344s)

优化后:(耗时2.719s)

总结:

在union中,DB2最后会自动执行一个排序来消除重复值,这样是很耗费资源的,所以在不需要去重复的情况下,尽可能使用UNION ALL 代替union

N.模板

优化前:(耗时3.1s)

优化后:(耗时0.922s)

总结:

一、建表空间和数据库

1.在db2ad、db2db和db2ap上均执行:

[sql] view plaincopy

db2set db2comm=tcpip

db2set db2codepage=1386

2.新建数据库:

[sql] view plaincopy

db2 create db <dbname>using codeset gbk territory CN collate using identity

3.连接上数据库:

[sql] view plaincopy

db2 "connect to <dbname>"

4.创建缓冲池 + 建立表空间;

1).删除旧的表空间:

[sql] view plaincopy

db2 drop tablespace tablespace1, tablespace2, tablespace3

2).新建缓冲池:

[sql] view plaincopy

db2 create bufferpool bp32k all nodes size -1 pagesize 32k

bp32k为该缓冲池的名称;

32K为页大小;

size=-1表示使用缺省的buffpage,而buffpage可以通过db2 get db cfg|grep -i buff参数查看到;

3).新建表空间:

[sql] view plaincopy

db2 "create regular tablespace tablespace1 pagesize 32k managed by database using(file '/usr/yixiayizi/tablespace1' 5g) bufferpool bp32k"

db2 "create regular tablespace tablespace2 pagesize 32k managed by database using(file '/usr/yixiayizi/tablespace2' 10g) bufferpool bp32k"

db2 "create regular tablespace tablespace3 pagesize 32k managed by database using(file '/usr/yixiayizi/tablespace3' 2g) bufferpool bp32k"

注意(file '/usr/yixiayizi/tablespace1' 5g)的设置:

第一个参数:

当指向外置盘时,file改为device;

当指向文件路径时,为file;

第二个参数:需要是绝对路径;

第三个参数:该表空间的大小;

关于表空间和缓冲池的说明见如下网页:

http://www.ibm.com/developerworks/cn/data/library/techarticles/0212wieser/0212wieser.html

5.调整表空间大小:

[sql] view plaincopy

ALTER TABLESPACE <tablespace1>RESIZE ( FILE '/cstp/usr/db2ad/db2ad/ <tablespace1>' 5g )

6.调整缓冲池大小:

[sql] view plaincopy

db2 alter bufferpool bp32k size 2g

--------------------------------------------------------------------------------------------

远程客户端的配置网络:

1.db2ad账户下:

1). 首先查看/etc/services中db2各个服务的端口号:

more /etc/services

可以看到如下信息:

DB2_db2ad 60040/tcp

DB2_db2ad_1 60041/tcp

DB2_db2ad_2 60042/tcp

DB2_db2ad_END 60043/tcp

2).

[sql] view plaincopy

db2 update dbm cfg using SVCENAME DB2_db2ad

这样在服务端实例对应的端口号就是60040;

------------

2.db2db账户下:

1).

[sql] view plaincopy

db2 catalog tcpip node <node_name>remote 172.17.252.214 server 60040

(上面 *** 作的反编目:db2 uncatalog node <node_name>)

2).db2 list node directory可以看到如下信息:

Node Directory

Number of entries in the directory = 1

Node 1 entry:

Node name = <node_name>

Comment=

Directory entry type = LOCAL

Protocol = TCPIP

Hostname = 172.17.252.214

Service name = 60040

3).

[sql] view plaincopy

db2 catalog db <dbname>at node <node_name>

(上面 *** 作的反编目:db2 uncatalog db <dbname>)

4).db2 list db directory可以看到如下信息:

System Database Directory

Number of entries in the directory = 1

Database 1 entry:

Database alias = <dbname>

Database name= <dbname>

Node name= <node_name>

Database release level = c.00

Comment =

Directory entry type = Remote

Catalog database partition number= -1

Alternate server hostname=

Alternate server port number =

--编目系统数据库目录

-----------------------

授权:

在db2ad账户下,给db2db授权使用表空间:

[sql] view plaincopy

db2 "grant use of tablespace <tablespace1>to user db2db"

db2 "grant use of tablespace <tablespace2>to user db2db"

db2 "grant use of tablespace <tablespace3>to user db2db"

二、建表

切换到db2db用户,执行建表的sql语句:

db2 -vf tmp.sql


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/6936412.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-03-30
下一篇 2023-03-30

发表评论

登录后才能评论

评论列表(0条)

保存