IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    [原]-------------SQL SERVER与DB2统计信息与索引碎片整理---------------

    fredrickhu发表于 2014-12-31 10:23:25
    love 0

    今年我的一个项目是用的DB2数据库。所以也学习了一把DB2数据库。本人学艺不精,遇到了很多困难。不过就我工作中使用DB2的感受而言,DB2对于统计信息和索引 碎片整理的使用频率比SQL SERVER的要高很多。所以现在我将两种数据库的相关内容都整理在这里,作为参考之用,对于高手来说,仅博一笑而已。


    对于SQL SERVER来说,统计指定表信息的查询方法如下:


    --查询指定表的统计信息(sys.stats和sysobjects联合查询)
    select
      o.name,--表名
      s.name,--统计信息的名称
      auto_created,--统计信息是否由查询处理器自动创建
      user_created--统计信息是否由用户显示创建
    from
      sys.stats
    inner join
      sysobjects o
    on
      s.object_id=o.id
    where 
      o.name='表名'
    go



    更新统计信息可以这样:

    update statistics 表名


    具体的一些方法就不再多说,联机丛书上都可以查询到。


    DB2中可以通过下面的语句来查询:


    WITH TMP(ID, NUM) AS
    (
       SELECT COLGROUPID, MAX(ORDINAL)
         FROM SYSCAT.COLGROUPCOLS
       GROUP BY COLGROUPID
    ),
    TMP2 (ID, NAME, NUM, TNAME, TSCHEMA) AS
    (
       SELECT ID, CAST(RTRIM(COLNAME) AS CHAR(128)), NUM, TABNAME, TABSCHEMA
         FROM TMP Y, SYSCAT.COLGROUPCOLS X
        WHERE X.COLGROUPID = Y.ID
          AND Y.NUM = X.ORDINAL
      UNION ALL
       SELECT Y.ID, CAST(RTRIM(X.COLNAME) || ',' || Y.NAME AS CHAR(128)), Y.NUM-1,
       	 TNAME, TSCHEMA
         FROM TMP2 Y, SYSCAT.COLGROUPCOLS X
        WHERE Y.ID=X.COLGROUPID
          AND X.ORDINAL=Y.NUM-1
          AND Y.NUM > 1
          AND TNAME = TABNAME
          AND TSCHEMA = TABSCHEMA
    )
    SELECT SUBSTR(TSCHEMA,1,10) TABSCHEMA, SUBSTR(TNAME,1,10) TABNAME, NAME COLS,
    	 COLGROUPCARD 
    FROM TMP2, SYSSTAT.COLGROUPS
    WHERE ID = COLGROUPID
    AND NUM = 1
    ORDER BY TABSCHEMA, TABNAME
    ;


    SELECT SUBSTR(COLNAMES, 1, 30) AS COLS, FIRST2KEYCARD, FIRST3KEYCARD,
    	 FIRST4KEYCARD, FULLKEYCARD
    FROM SYSSTAT.INDEXES
    WHERE TABSCHEMA='TABSCHEMA' AND TABNAME='TABNAME';


    上述代码中的TABSCHEMA是模式名,TABNAME是表名。


    这里简单介绍下DB2中统计信息的收集与整理:

    DB2 RUNSTATS ON TABLE TABNAME WITH DISTRIBUTION AND IN INDEX ALL

    有关于表和索引的很多种用法,就不一一列举了。大家查查资料就很容易找到。



    对于索引碎片处理这块,SQL SERVER中分成4种方法:

    1.删除索引并重建

    2.DROP EXISTING

    3.ALTER INDEX REBUILD语句重建

    4.ALTER INDEX REORGANIZE语句整理索引碎片


    DB2中也应该有以下几种:

    1.删除并重建索引

    2.DB2 REOGR TABLE TABNAME整理表

    3.DB2 REORG TABLE TABNAME INDEX 索引名 RESETDICTONARY (根据索引整理表)

    4.整理表的所有索引(DB2 REORG INDEXES ALL FOR TABLE TABNAME)


    DB2比较麻烦的一点是这些整理或者重建动作可能导致数据包丢失,还需要重新绑定数据包。这个内容与本文关系不大,在这里就不多说了。


    总体来说,就我个人感觉,SQL SERVER中关于索引的操作相对来说要简单一些,在SQL SERVER 2008以后,查询统计信息与索引信息都较为方便。而在DB2中,统计信息的查询方法复杂一些,但方法比SQL SERVER多。索引碎片的处理方面,两者都差不多。不过DB2数据包可能会丢失,还需要重新绑定包的操作,这个比SQL SERVER 麻烦。


    关于统计信息和索引碎片整理方面的方法很多,在这里不可能全部一一列举,各位可以自己动手查查资料。SQL SERVER丰富的资料是一大优势,相比之下,IDM的资料就要少很多了。好了,就写这么多吧。

    


沪ICP备19023445号-2号
友情链接