楼主: hotpig

有用【东软】HIS的请进来!

[复制链接]
论坛徽章:
194
红宝石
日期:2014-05-09 08:24:37萤石
日期:2014-01-03 10:25:39奥运会纪念徽章:羽毛球
日期:2008-07-01 10:46:06奥运会纪念徽章:马术
日期:2008-07-07 17:43:24奥运会纪念徽章:射箭
日期:2008-07-25 18:07:39奥运会纪念徽章:皮划艇激流回旋
日期:2008-07-30 10:02:57奥运会纪念徽章:花样游泳
日期:2008-09-26 13:02:43奥运会纪念徽章:排球
日期:2008-12-03 11:23:272010新春纪念徽章
日期:2010-01-04 08:33:082010年世界杯参赛球队:澳大利亚
日期:2010-02-26 11:08:44
31#
发表于 2005-3-11 14:28 | 只看该作者
最初由 husthxd 发布
[B]

呵呵,就事论事,不妨把某些缺陷说出来听听的 [/B]


1.绑定变量的问题。
2。bad sql语句,顺便我们使用的8.1.7
的标准版,不支持索引:
SELECT NVL (MAX (seeno), 0) + 1
  FROM r_register
WHERE dept_code = :1
   AND noon_code = :2
   AND reglevl_code = :3
   AND TRUNC (see_date) = :4

原来索引建立在dept_code+noon_code+reglevl_code
显然不合理,最佳的修改sql
see_date between :4 and :5
在see_date建立索引(因为不支持函数索引)。

使用道具 举报

回复
论坛徽章:
168
马上加薪
日期:2014-02-19 11:55:142012新春纪念徽章
日期:2012-02-13 15:10:582012新春纪念徽章
日期:2012-01-04 11:49:54蜘蛛蛋
日期:2011-12-05 16:08:56ITPUB十周年纪念徽章
日期:2011-11-01 16:19:41设计板块每日发贴之星
日期:2011-07-22 01:01:02ITPUB官方微博粉丝徽章
日期:2011-06-30 12:30:16管理团队成员
日期:2011-05-07 01:45:082011新春纪念徽章
日期:2011-01-25 15:42:562011新春纪念徽章
日期:2011-01-25 15:42:33
32#
发表于 2005-3-11 15:25 | 只看该作者
最初由 lfree 发布
[B]

1.绑定变量的问题。
2。bad sql语句,顺便我们使用的8.1.7
的标准版,不支持索引:
SELECT NVL (MAX (seeno), 0) + 1
  FROM r_register
WHERE dept_code = :1
   AND noon_code = :2
   AND reglevl_code = :3
   AND TRUNC (see_date) = :4

原来索引建立在dept_code+noon_code+reglevl_code
显然不合理,最佳的修改sql
see_date between :4 and :5
在see_date建立索引(因为不支持函数索引)。 [/B]


不了解表中各列的分布以及选择性.如果你能够在不同的情况下把执行计划以及相应的统计信息贴出来就更好比较了.
下面是我做的一个实验.


test@SYSTEM_SERVER> set autotrace off
test@SYSTEM_SERVER> set timing on
test@SYSTEM_SERVER>
test@SYSTEM_SERVER> drop table r_register
  2  /

表已丢弃。

已用时间:  00: 00: 01.07
test@SYSTEM_SERVER> create table r_register
  2  (
  3  dept_code  char(10),
  4  noon_code  char(10),
  5  reglevl_code       char(10),
  6  seeno              number(10),
  7  see_date   date
  8  )
  9  /

表已创建。

已用时间:  00: 00: 00.01
test@SYSTEM_SERVER>
test@SYSTEM_SERVER> declare
  2  begin
  3    for i in 1..100000 loop
  4      insert into r_register values(to_char(mod(i,10000)),'N'||to_char(i),'R'
||to_char(mod(i,50000)),i,sysdate-mod(i,365));
  5    end loop;
  6  end;
  7  /

PL/SQL 过程已成功完成。

已用时间:  00: 01: 46.06
test@SYSTEM_SERVER> commit
  2  /

提交完成。

已用时间:  00: 00: 00.00
test@SYSTEM_SERVER>
test@SYSTEM_SERVER> create index idx_r_register_c on r_register(dept_code,noon_c
ode,reglevl_code)
  2  /

索引已创建。

已用时间:  00: 00: 45.05
test@SYSTEM_SERVER>
test@SYSTEM_SERVER> analyze table r_register compute statistics for table for al
l indexes
  2  /

表已分析。

已用时间:  00: 00: 01.09
test@SYSTEM_SERVER>
test@SYSTEM_SERVER> set autotrace on
test@SYSTEM_SERVER>
test@SYSTEM_SERVER> SELECT NVL (MAX (seeno), 0) + 1
  2  FROM r_register
  3  WHERE dept_code = '1'
  4  AND noon_code = 'N2'
  5  AND reglevl_code = 'M3'
  6  AND TRUNC (see_date) = to_date('20050101','yyyymmdd')
  7  /

NVL(MAX(SEENO),0)+1
-------------------
                  1

已用时间:  00: 00: 00.01

Execution Plan
----------------------------------------------------------
   0      SELECT STATEMENT Optimizer=CHOOSE (Cost=4 Card=1 Bytes=49)
   1    0   SORT (AGGREGATE)
   2    1     TABLE ACCESS (BY INDEX ROWID) OF 'R_REGISTER' (Cost=4 Ca
          rd=1 Bytes=49)

   3    2       INDEX (RANGE SCAN) OF 'IDX_R_REGISTER_C' (NON-UNIQUE)
          (Cost=3 Card=1)





Statistics
----------------------------------------------------------
        102  recursive calls
          0  db block gets
          8  consistent gets
          0  physical reads
          0  redo size
        375  bytes sent via SQL*Net to client
        153  bytes received via SQL*Net from client
          2  SQL*Net roundtrips to/from client
          1  sorts (memory)
          0  sorts (disk)
          1  rows processed

test@SYSTEM_SERVER>

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


test@SYSTEM_SERVER> drop index idx_r_register_c
  2  /

索引已丢弃。

已用时间:  00: 00: 01.00
test@SYSTEM_SERVER> create index idx_r_register_date on r_register(see_date)
  2  /

索引已创建。

已用时间:  00: 00: 27.03
test@SYSTEM_SERVER> analyze table r_register compute statistics for table for al
l indexes
  2  /

表已分析。

已用时间:  00: 00: 01.01
test@SYSTEM_SERVER>
test@SYSTEM_SERVER> set autotrace on
test@SYSTEM_SERVER>
test@SYSTEM_SERVER> SELECT NVL (MAX (seeno), 0) + 1
  2  FROM r_register
  3  WHERE dept_code = '1'
  4  AND noon_code = 'N2'
  5  AND reglevl_code = 'M3'
  6  AND see_date between to_date('20050101 00:00:00','yyyymmdd hh24:mi:ss') and

  7  to_date('20050101 23:59:59','yyyymmdd hh24:mi:ss')
  8  /

NVL(MAX(SEENO),0)+1
-------------------
                  1

已用时间:  00: 00: 00.01

Execution Plan
----------------------------------------------------------
   0      SELECT STATEMENT Optimizer=CHOOSE (Cost=107 Card=1 Bytes=49)
   1    0   SORT (AGGREGATE)
   2    1     TABLE ACCESS (BY INDEX ROWID) OF 'R_REGISTER' (Cost=107
          Card=1 Bytes=49)

   3    2       INDEX (RANGE SCAN) OF 'IDX_R_REGISTER_DATE' (NON-UNIQU
          E) (Cost=3 Card=1)





Statistics
----------------------------------------------------------
         29  recursive calls
          0  db block gets
        279  consistent gets
          0  physical reads
          0  redo size
        376  bytes sent via SQL*Net to client
        517  bytes received via SQL*Net from client
          3  SQL*Net roundtrips to/from client
          1  sorts (memory)
          0  sorts (disk)
          1  rows processed

test@SYSTEM_SERVER>


虽然从时间上看没什么差别,但从统计信息中的consistent gets来看,创建复合索引要优于单索引.

使用道具 举报

回复
论坛徽章:
194
红宝石
日期:2014-05-09 08:24:37萤石
日期:2014-01-03 10:25:39奥运会纪念徽章:羽毛球
日期:2008-07-01 10:46:06奥运会纪念徽章:马术
日期:2008-07-07 17:43:24奥运会纪念徽章:射箭
日期:2008-07-25 18:07:39奥运会纪念徽章:皮划艇激流回旋
日期:2008-07-30 10:02:57奥运会纪念徽章:花样游泳
日期:2008-09-26 13:02:43奥运会纪念徽章:排球
日期:2008-12-03 11:23:272010新春纪念徽章
日期:2010-01-04 08:33:082010年世界杯参赛球队:澳大利亚
日期:2010-02-26 11:08:44
33#
发表于 2005-3-11 16:10 | 只看该作者
佩服老兄,看来老兄oracle的功底比我好!我没有做更今一步的解析。
dept_code表示科室号,充气量仅仅40个,
noon_code表示上下午,最多两个值,
reglevl_code 表示 正常门诊或者急诊。仅仅存在160个可能。

很明显数据重复率很高,实际上这段sql要与程序结合在一起看,
他的主要目的就是获得当天以上where情况的最大号,作为下一条记录的插入。
参数:4的值是sysdate,很明显索引建立在see_date最好,另外从数据分布看
数据具有时间相关性,读取块的数量会很少,正常每天的门诊在1000上下。
占8块左右。如果使用旧索引,在cbo模式下根本不会使用此索引。

使用道具 举报

回复
论坛徽章:
168
马上加薪
日期:2014-02-19 11:55:142012新春纪念徽章
日期:2012-02-13 15:10:582012新春纪念徽章
日期:2012-01-04 11:49:54蜘蛛蛋
日期:2011-12-05 16:08:56ITPUB十周年纪念徽章
日期:2011-11-01 16:19:41设计板块每日发贴之星
日期:2011-07-22 01:01:02ITPUB官方微博粉丝徽章
日期:2011-06-30 12:30:16管理团队成员
日期:2011-05-07 01:45:082011新春纪念徽章
日期:2011-01-25 15:42:562011新春纪念徽章
日期:2011-01-25 15:42:33
34#
发表于 2005-3-11 16:50 | 只看该作者
如果表很大的话,在see_date上建立分区的话优化的效果会更好.
btw:当然分区更多的是为了方便管理.

使用道具 举报

回复
论坛徽章:
1
授权会员
日期:2005-10-30 17:05:33
35#
 楼主| 发表于 2005-3-11 18:15 | 只看该作者
最初由 husthxd 发布
[B]如果表很大的话,在see_date上建立分区的话优化的效果会更好.
btw:当然分区更多的是为了方便管理. [/B]


说的不错,如果检索条件WHERE中的值比较少的话,随着数据量的增加,其检索效率将逐渐变缓,应为其可能访问到条数比较多,也就意味着IO操作频繁。

使用道具 举报

回复
论坛徽章:
168
马上加薪
日期:2014-02-19 11:55:142012新春纪念徽章
日期:2012-02-13 15:10:582012新春纪念徽章
日期:2012-01-04 11:49:54蜘蛛蛋
日期:2011-12-05 16:08:56ITPUB十周年纪念徽章
日期:2011-11-01 16:19:41设计板块每日发贴之星
日期:2011-07-22 01:01:02ITPUB官方微博粉丝徽章
日期:2011-06-30 12:30:16管理团队成员
日期:2011-05-07 01:45:082011新春纪念徽章
日期:2011-01-25 15:42:562011新春纪念徽章
日期:2011-01-25 15:42:33
36#
发表于 2005-3-11 22:11 | 只看该作者
最初由 hotpig 发布
[B]

说的不错,如果检索条件WHERE中的值比较少的话,随着数据量的增加,其检索效率将逐渐变缓,应为其可能访问到条数比较多,也就意味着IO操作频繁。 [/B]


如果可以预见的表的数据会越来越多,预先建好分区表会方便不少.
btw:
更多的调整与优化的案例请参考itpub即将出版的专门讲述Oracle优化的系列丛书.

使用道具 举报

回复
论坛徽章:
0
37#
发表于 2005-3-30 15:28 | 只看该作者
说风凉话好可真多啊。怎么做软件的人都是高学历低素质的呢,要不然就是这里面的人很少有做软件的?无稽之谈,论坛更应该是大家学习的空间吧?有好的东西就拿上来让大家分享一下,一会东家长一会西家短的。你们自己又是做什么的呢?如果也是在做软件的话就应该想得到,在你说别人软件坏话的时候也许别的软件又多出了一个功能。这家不好那家不好的你给拿出一个好的来啊。

使用道具 举报

回复
论坛徽章:
194
红宝石
日期:2014-05-09 08:24:37萤石
日期:2014-01-03 10:25:39奥运会纪念徽章:羽毛球
日期:2008-07-01 10:46:06奥运会纪念徽章:马术
日期:2008-07-07 17:43:24奥运会纪念徽章:射箭
日期:2008-07-25 18:07:39奥运会纪念徽章:皮划艇激流回旋
日期:2008-07-30 10:02:57奥运会纪念徽章:花样游泳
日期:2008-09-26 13:02:43奥运会纪念徽章:排球
日期:2008-12-03 11:23:272010新春纪念徽章
日期:2010-01-04 08:33:082010年世界杯参赛球队:澳大利亚
日期:2010-02-26 11:08:44
38#
发表于 2005-4-1 10:22 | 只看该作者
最初由 飘浮的云 发布
[B]说风凉话好可真多啊。怎么做软件的人都是高学历低素质的呢,要不然就是这里面的人很少有做软件的?无稽之谈,论坛更应该是大家学习的空间吧?有好的东西就拿上来让大家分享一下,一会东家长一会西家短的。你们自己又是做什么的呢?如果也是在做软件的话就应该想得到,在你说别人软件坏话的时候也许别的软件又多出了一个功能。这家不好那家不好的你给拿出一个好的来啊。 [/B]


什么这个帖子husthxd你编辑过。

实际上确实有这个问题,但是如果你是DBA,你就明白许多现象不应该出现。
这些我可以举出许多例子。

讲个简单一点的问题,oracle绑定变量的问题,许多开发公司都出现这种低级错误,这个仅仅提醒程序员很容易避免。还有优化应该贯穿于产品的开始,而不是事后来优化它。你可以看看许多sql server开发人员,经常会使用datediff函数在where子句里面,时间看看执行计划就很容易定位问题。

我们的医保系统。开始一上传数据就很容易出现死锁的现象,我开始不了解sql server,叫开发公司解决,开始怀疑网络有病毒还有网络有问题,我仅仅问他在别的医院是否存在这个问题,我打电话到别的医院询问,问题一样,所以我跟他讲不要怀疑网络有问题。后来我使用事件探查器,很容易跟踪这个问题。

在换句化讲,如果你是这些数据库的管理员,你不骂才怪?我现在仅仅告诉医保科的操作员如何杀进程。

使用道具 举报

回复
论坛徽章:
168
马上加薪
日期:2014-02-19 11:55:142012新春纪念徽章
日期:2012-02-13 15:10:582012新春纪念徽章
日期:2012-01-04 11:49:54蜘蛛蛋
日期:2011-12-05 16:08:56ITPUB十周年纪念徽章
日期:2011-11-01 16:19:41设计板块每日发贴之星
日期:2011-07-22 01:01:02ITPUB官方微博粉丝徽章
日期:2011-06-30 12:30:16管理团队成员
日期:2011-05-07 01:45:082011新春纪念徽章
日期:2011-01-25 15:42:562011新春纪念徽章
日期:2011-01-25 15:42:33
39#
发表于 2005-4-1 22:02 | 只看该作者
不单是客户其实任何人都可以提出有益于系统改进的意见.
不过呢,评判一个现成产品的缺点总是容易的,因为软件总是有缺点的,其实如果做过软件的人都知道,bug无处不在,做一个软件并不是很容易的.
总的来说,开发人员要对客户提出的意见和建议要虚心接受.毕竟客户是甲方嘛

使用道具 举报

回复
论坛徽章:
36
ITPUB元老
日期:2007-08-14 09:10:50美羊羊
日期:2015-06-08 11:13:51懒羊羊
日期:2015-05-27 14:41:362015年新春福章
日期:2015-03-06 11:57:31美羊羊
日期:2015-03-04 14:48:58马上加薪
日期:2014-02-19 11:55:14马上有对象
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14马上有车
日期:2014-02-19 11:55:14
40#
发表于 2005-4-22 11:30 | 只看该作者
医保业务的复杂性大家都已经是知道了
而且各个地方的政策差异(人为因素)又特别的大
不可以说大家一起来挨条语句的优化
那就不用工作了
不过优化的工作是一直在做的

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表