华人澳洲中文论坛

热图推荐

    MS SQL 数据库调优小记

    [复制链接]

    2021-5-16 12:40:41 293 18

    几个月前陆陆续续做了一个次要数据库的调优,写出来给本人留个记号(曾经健忘掉得多了),也但愿对初学者有参考意义。

    这个MS SQL2000数据库愈来愈慢,次要缘故是每一年在零碎上加运用模块,并且业务数据不停减少。次要的表示有两个:在外埠的200多销售人员在Sync数据的时分长达5-10分钟,天天都有好多DeadLock。 并且有一种愈来愈差的开展趋向。

    咱们这里没有专职的SQLDBA,我只好本人下马,用了一部份时间做了些调优,取患了不错的成果,当初Sync的时间大部份都在30秒内,很少有DeadLock,几个月过来了安枕无忧。

    1.  数据库硬件降级,买了一个很好的办事器,使用64位零碎(原来是32位),40多G内存,windows2008 / SQL Enterprise 2008

    2 Index优化, 对几个大的表调剂了index,调剂后成果十分显著,使用statistics对比就知道,一个一样的查问,从SCAN几十万降到scan几千。调的时分子细浏览代码,从代码中发现蛛丝蚂迹, where 或者join on所需求的index 对比好找,select 前面隐含的index需要对比难点。 次要的工具就是execution plan

    3 优化修正了一批stored proc, 尤为是有些代码带有得多子查问,子细浏览后发现了一些分歧理之处,进行改写并对比statistics,成果显著;一些无奈防止的大查问,在业务许可的时分参加readuncommitted hint,防止lock 

    4 略微修正了一下零碎,
    4.1 一些对比动态的查问(好比过来几个月客户们的销售历史),在子夜的时分用job建设暂时表,并给暂时表调配index,这样查起来飞快,成果很显著;
    4.2 一些计算:需求用到少量join或子查问,间接改到客户端去做计算,有好几个这样的胜利例子。其中有一个网页查问,每次需求提早10几秒能力有后果,用户十分不爽,通过剖析后我用C#给写了一段代码,把计算逻辑放到网页外部去实现,后果用户觉得不就任何提早(提早低于1秒),
    4.3 差未几同上,干脆把一些两头计算后果保留到数据表中,其它中央需求的时分就不必算来算去,间接掏出来

    5.有些对比新的技术对履行效力并无益处,好比Co妹妹on Table Expression - CTE, 我做了得多statistics对比,效力并无任何进步,只是使代码读起来十分简洁罢了

    原本还有几个慢的stored proc顺序,曾经筹备了优化计划,斟酌到各个方面的用户曾经对零碎很满意了,所以临时不论了。

    全部回复18

    right 发表于 2021-5-16 11:53:22

    right 沙发

    2021-5-16 11:53:22

    不错不错,感激楼主分享。
    nq1999 发表于 2021-5-16 11:56:31

    nq1999 板凳

    2021-5-16 11:56:31

    谢谢楼主教训分享。

    顺便求教下,你们公司数据库有无程度扩展才能。能不克不及加办事器数量来进步机能的?
    Cyan 发表于 2021-5-16 11:58:18

    Cyan 地板

    2021-5-16 11:58:18

    改用oracle 会不会要好些?
    cm1000000 发表于 2021-5-16 12:02:22

    cm1000000 5#

    2021-5-16 12:02:22

    03年也做过一个。其实SqlServer的优化次要应该针对超过4个表的链接。4个表之下的链接查问不论写的多烂,其实SqlServer会自动优化成果不会太差。记得好像Oracle等也是,针对4个表之下的查问,根本上不必调剂啥子查问甚么的,99%的子查问运转时曾经被 dbms 自动优化了

    不知道当初咋样,过后用的是sqlserver2k

    此外lz说的index也是大头。

    其余更多仍是关注逻辑。有的年代长远的stored procedure外面真的是有一些无用或者没有与时俱进的逻辑,吧这样之处去掉最爽了

    [ 本帖最初由 wtf 于 2010-2-19 15:十二 编纂 ]
    ccccc 发表于 2021-5-16 12:03:55

    ccccc 6#

    2021-5-16 12:03:55

    机能调优是件无意思的事件,有时分能够把跑三个小时的SQL调成2分钟,固然要看逻辑上是不是还正确.

    固然不是甚么均可以调优的,如在CDR话单上sum计算总通话时长的,没有太好的方法,数量太大,只能请客户多加几个节点
    kkk-top 发表于 2021-5-16 12:05:10

    kkk-top 7#

    2021-5-16 12:05:10


    当前可能会斟酌,当初才不到100G的数据,用户数才200多,算是个小零碎,所以临时不必减少办事器。并且曾经把报表零碎分到其它 的办事器了。
    KKK 发表于 2021-5-16 12:09:07

    KKK 8#

    2021-5-16 12:09:07


    次要仍是运用零碎自身设计和编程方面问题,毕竟咱们的零碎不大,用SQL显然足足无余
    dgbfly2002 发表于 2021-5-16 12:10:35

    dgbfly2002 9#

    2021-5-16 12:10:35

    各位数据库里手,查问时防止lock超时,是否加之no lock就行了?
    wang730000 发表于 2021-5-16 12:11:53

    wang730000 10#

    2021-5-16 12:11:53


    要详细看了,
        首先仍是要斟酌优化 ,
        其次呢,由于那样做会带来欠好的结果,要看能不克不及承受
    缘尽天空 发表于 2021-5-16 12:15:04

    缘尽天空 11#

    2021-5-16 12:15:04

    各位数据库里手,你们说的statistice在sql server 2008下是否就是关上 Include Client Statistice?
    bjgame 发表于 2021-5-16 12:18:51

    bjgame 12#

    2021-5-16 12:18:51



    能够胪陈吗?甚么欠好的结果?
    louisking 发表于 2021-5-16 12:21:10

    louisking 13#

    2021-5-16 12:21:10



    好贴~
    能不克不及详细说说甚么样的计算在数据库里10几秒而在客户端只要不到1秒呢?
    glluoya 发表于 2021-5-16 12:23:41

    glluoya 14#

    2021-5-16 12:23:41

    汇共计算(sum,avg等等)算10秒,前往一个数,不需求1秒
    wall9683 发表于 2021-5-16 12:25:27

    wall9683 15#

    2021-5-16 12:25:27



    我猜是假如把unco妹妹ited data都读了,后果出来的数据有可能不会被承受。
    pingsheng 发表于 2021-5-16 12:29:42

    pingsheng 16#

    2021-5-16 12:29:42



    这个还真没留意时间会差那末多啊~
    liaoyx 发表于 2021-5-16 12:32:30

    liaoyx 17#

    2021-5-16 12:32:30

    10秒过长了,你说的是cpu时间吗,假如是10秒的话,表的大小估量有1TB,
    moyunbing 发表于 2021-5-16 12:35:50

    moyunbing 18#

    2021-5-16 12:35:50

    当需求繁杂计算的时分,用.Net对比好,所以SQL2005开始减少了一个用.net 写函数和stored proc的功用。

    我举的阿谁例就是要从几个大内外,取些子集,而后按不同的前提计算后再去此外的大内外取不同组合的子集再做一些计算,等等。固然用SQL stored proc 可能也能够写出高效力的来,但对比头疼。用.net写则十分容易。
    ana314 发表于 2021-5-16 12:40:41

    ana314 19#

    2021-5-16 12:40:41


    差未几是这个意思吧,

    发表回复

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

    返回列表 本版积分规则

    :
    论坛元老
    :
    论坛短信
    :
    未填写
    :
    未填写
    :
    未填写

    主题335

    帖子4659

    积分10475

    图文推荐