db2&unix使用总结(四)


1、索引:

建立索引是用来提高查询性能最常用的方法。对于一个特定的查询,可以为某一个表所有出现在查询中的列建立一个联合索引,包括出现在 select 子句和条件语句中的列。但简单的建立一个覆盖所有列的索引并不一定能有效提高查询,因为在多列索引中列的顺序是非常重要的。这个特性是由于索引的 B+ 树结构决定的。一般情况下,要根据谓词的选择度来排列索引中各列的位置,选择度大的谓词所使用的列放在索引的前面,把那些只存在与 select 子句中的列放在索引的最后,因为这会造成Non-matchingIndex Scan扫描和matching Index Scan 不同的结果。

例如,对于:select add_date from temp.customer where city = 'WASHINGTON' andcntry_code = 'USA';

应建立索引的顺序为:index1(city,cntry_code,add_date),而不能把add_date放在前面。

避免在建有索引的列上使用函数

在那些需要被排序的列上创建索引:distinct 和 group by和order by

一般情况下,当查询的 where 子句中存在主键的谓词我们就可以创建带有 include 列的唯一索引,形成纯索引访问来提高查询性能。注意 include 只能用在创建唯一性索引中

创建降序索引可以提高max函数性能:

create indextemp.employee_i1 on temp.employee(add_date desc)

同理还有升序索引,双向索引ALLOW REVERSE SCANS,但以后数据更新时的维护成本较高。

重组索引:REORG INDEXES ALL FOR TABLE table_name

根据某索引重组表:REORG TABLE table_name INDEX index_name

Not in 由内向外,子查询的复杂度影响其性能

Not exist 由外向内,嵌套的复杂度影响其性能


2、游标的使用:

declarecontinue handler for not found

   begin

     set v_notfound = 1;

   end;

 

declare cursor1 cursor with hold forselect market_code from tb_market_code    for update;

open cursor1;

set v_notfound=0;

fetch cursor1 into v_market_code;

while v_notfound=0 Do

          --work

          set v_notfound=0;

fetch cursor1 into v_market_code;

end while;

close cursor1;

修改游标的当前记录:update tb_market_code set market_code='0' where current of cursor1;

   前提是游标是可修改的:declarecursor1 cursor for select market_code from tb_market_code for update;


3、计算某调度流程一段时间的5日平均运行时长,并与当前运行时长一起展示,形成类似于股票行情的K线图。

SCHEDULE.RUNTIMEFLOWLOG表结构如下:

名称

数据类型

长度

备注

LOGID

DECIMAL

20

ID,主键

FLOWID

DECIMAL

11

流程ID 

STATUS

DECIMAL

11

流程状态

STARTTIME

TIMESTAMP

10

开始时间

ENDTIME

TIMESTAMP

10

结束时间

DATATIME

VARCHAR

32

数据时间

FLOWTYPE

DECIMAL

11

 

两个计算字段:
cursec:当前运行时长,单位:秒
avgsec:5日平均运行时长,单位:秒
SQL如下(以DB2为例):

SELECT logid,
status,
datatime,
starttime,
MIDNIGHT_SECONDS (ENDTIME) - MIDNIGHT_SECONDS (STARTTIME) cursec,
AVG(MIDNIGHT_SECONDS (ENDTIME) - MIDNIGHT_SECONDS (STARTTIME))
OVER (PARTITION BY flowid, status
ORDER BY logid DESC
ROWS BETWEEN 1 FOLLOWING AND 5 FOLLOWING) avgsec
FROM SCHEDULE.RUNTIMEFLOWLOG
WHERE FLOWID = 471

ORDER BY logid DESC;

如为Oracle,只需要将cursec和avgsec计算秒数的部分做相应调整:
(CAST(ENDTIME AS DATE)-CAST(STARTTIME AS DATE))*3600*24
而分析函数的用法此处Oracle和DB2均通用,不需要任何调整。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值