<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    The NoteBook of EricKong

      BlogJava :: 首頁 :: 聯系 :: 聚合  :: 管理
      611 Posts :: 1 Stories :: 190 Comments :: 0 Trackbacks

            現在SQL2005提供了DTA的工具,大家在去優化一個語句時都有意無意的使用此工具所給出的一些優化建議。不過它始終是個工具,所給出的優化建議很多時候都是使用2005新的索引功能INCLUDE把查詢列表統統包括在一個索引中。因此,每個開發人員所定義的索引就會存在重復或是很相似的地方。因為索引頁的數據比較密集,因此在對包含有索引列的字段做修改操作時,都會去相應的修改包含此鍵值列的索引。理論上對一張表多加一個索引,修改數據的速度就會比原來慢1.2倍。因此,這會增加記錄被鎖定的時間,從而也就會影響到查詢的性能。

          但是,如果通過SQL2005提供的幾個與索引相關的視圖,我們不能很方便的觀察出索引所包含的鍵值列和它的包含列是哪些。同時,如果表是分區表,通過sys.partitions查看總記錄數時要累加各分區的行數。

             下面的腳本可以組合這些視圖,查詢出對象名稱、對象類型(表或索引視圖)、索引名稱、索引編號、索引類型、是否主鍵、是否唯一、填充度、鍵值字段、包含字段、表的總記錄數(取各分區中行的總數)、索引描述,如下圖部分顯示結果所示,這樣就很方便的判斷出哪些索引是重復或相似的:


    對取包含字段時用到了FOR XML PATH這個功能,可以方便的把包含列組織成A,B,C的形式。然后使用CROSS APPLY得出最終的結果。腳本定義如下:


    USE AdventureWorks;
    GO
    DROP INDEX IX_SalesOrderHeader_CustomerID ON Sales.SalesOrderHeader
    GO
    CREATE INDEX IX_SalesOrderHeader_CustomerID ON Sales.SalesOrderHeader(CustomerID)
    INCLUDE(ShipDate,Freight)
    GO

    --sp_helpindex不能反應出包含字段
    EXEC sp_helpindex 'Sales.SalesOrderHeader'
    GO
    --SQL2005下用于診斷索引重復的腳本
    DECLARE @Result TABLE(
        objname            sysname            NOT NULL,
        objtype            char(2)            NOT NULL,
        indexname        sysname            NOT NULL,
        index_id        int                NOT NULL,
        indextype        tinyint            NOT NULL,
        is_primary_key  bit                NOT NULL,
        is_unique        bit                NOT NULL,
        fill_factor        tinyint            NOT NULL,
        IndexKeys        nvarchar(2126)    NOT NULL,
        Included        nvarchar(max)    NULL,
        rows            bigint            NOT NULL,
        IndexDesc        varchar(210)    NULL
    )


    CREATE TABLE #IndexInfo
    (
        IndexName    sysname         NOT NULL,
        IndexDesc    varchar(210)     NULL,
        IndexKeys    nvarchar(2126)     NULL
    )
    DECLARE @objname     sysname

    DECLARE ObjectList CURSOR FAST_FORWARD FOR
        SELECT SCHEMA_NAME(o.schema_id)+'.'+o.name AS objname
        FROM sys.indexes i JOIN sys.objects o ON i.object_id=o.object_id
        WHERE o.type IN('U','V') AND i.index_id IN(0,1)
            --AND o.object_id=OBJECT_ID(N'Sales.SalesOrderHeader')

    OPEN ObjectList
    FETCH NEXT FROM ObjectList INTO @objname

    WHILE @@FETCH_STATUS = 0
    BEGIN
        INSERT INTO #IndexInfo EXEC sp_helpindex @objname--使用全名稱,防止直接使用表名稱時無法獲取其它架構表的信息
       
        INSERT INTO @Result
         SELECT SCHEMA_NAME(o.schema_id)+'.'+o.name AS objname, o.type AS objtype,
             i.name AS indexname,i.index_id,i.type AS indextype,i.is_primary_key,i.is_unique,i.fill_factor,
            t.IndexKeys,
            c.name AS Included,
            p.rows,t.IndexDesc
        FROM sys.indexes i
             INNER JOIN sys.objects o ON i.object_id=o.object_id
             INNER JOIN #IndexInfo t ON t.IndexName=i.name
             CROSS APPLY (SELECT SUM(rows) AS rows
                             FROM sys.partitions p
                             WHERE p.index_id = i.index_id AND p.object_id = i.object_id
                         ) p
             CROSS APPLY (SELECT name=STUFF((SELECT N',' + QUOTENAME(y) AS [text()]
                           FROM (SELECT c.name AS y
                                    FROM sys.index_columns ic
                                        JOIN sys.columns c ON ic.column_id=c.column_id AND ic.object_id=c.object_id
                                    WHERE ic.object_id=i.object_id AND ic.index_id=i.index_id  AND ic.is_included_column=1
                                ) AS Y
                           ORDER BY y FOR XML PATH('')), 1, 1, N'')
                         ) c
        WHERE o.object_id=OBJECT_ID(@objname)
               
        TRUNCATE TABLE #IndexInfo
       
      FETCH NEXT FROM ObjectList INTO @objname
    END

    CLOSE ObjectList
    DEALLOCATE ObjectList

    DROP TABLE #IndexInfo
    SELECT * FROM @Result ORDER BY objname,index_id
    用于SQL2000的腳本:

    --SQL2000下用于診斷索引重復的腳本
    DECLARE @Result TABLE (
        [objname] [sysname] NOT NULL ,
        [indexname] [sysname] NOT NULL ,
        [indid] [smallint] NOT NULL ,
        [IsUnique] [int] NOT NULL ,
        [IndexKeys] [nvarchar] (2126) NOT NULL ,
        [rowcnt] [bigint] NOT NULL ,
        [rowmodctr] [int] NOT NULL ,
        [keycnt] [smallint] NOT NULL ,
        [OrigFillFactor] [tinyint] NOT NULL ,
        [dpages] [int] NOT NULL ,
        [IndexDesc] [varchar] (210) NULL
    )

    CREATE TABLE #IndexInfo
    (
        IndexName    sysname     NOT NULL,
        IndexDesc    varchar(210)     NULL,
        IndexKeys    nvarchar(2126)     NULL
    )
    DECLARE @objname     sysname,
            @objid        int

    DECLARE ObjectList CURSOR FAST_FORWARD FOR
        SELECT USER_NAME(o.uid)+'.'+o.name AS objname,o.id AS objid
        FROM dbo.sysobjects o JOIN dbo.sysindexes i ON i.id = o.id
        WHERE o.type IN( 'U','V') AND i.indid IN(0,1) AND o.name<>'dtproperties'--用于保存關系圖的系統表
        ORDER BY o.name,o.uid

    OPEN ObjectList
    FETCH NEXT FROM ObjectList INTO @objname,@objid

    WHILE @@FETCH_STATUS = 0
    BEGIN
        INSERT INTO #IndexInfo EXEC sp_helpindex @objname--使用全名稱,防止直接使用表名稱時無法獲取其它用戶表的信息
       
        INSERT INTO @Result
         SELECT USER_NAME(o.uid)+'.'+o.name AS objname, i.name AS indexname, i.indid,
            CASE WHEN t.IndexDesc LIKE '%unique%' THEN 1 ELSE 0 END AS IsUnique,
            t.IndexKeys, i.rowcnt, i.rowmodctr, i.keycnt, i.OrigFillFactor, i.dpages,t.IndexDesc
        FROM dbo.sysindexes i
             INNER JOIN dbo.sysobjects o ON i.id = o.id
             INNER JOIN #IndexInfo t ON t.IndexName=i.name
        WHERE o.id=@objid
        TRUNCATE TABLE #IndexInfo
       
      FETCH NEXT FROM ObjectList INTO @objname,@objid
    END

    CLOSE ObjectList
    DEALLOCATE ObjectList

    DROP TABLE #IndexInfo
    SELECT * FROM @Result ORDER BY objname,indid

    posted on 2010-09-02 13:39 Eric_jiang 閱讀(568) 評論(0)  編輯  收藏 所屬分類: 數據庫
    主站蜘蛛池模板: 免费A级毛片无码久久版| 成人免费无码视频在线网站| 亚洲?V乱码久久精品蜜桃| 亚洲中文字幕无码中文| 三年片在线观看免费观看高清电影| 久久丫精品国产亚洲av| 6080午夜一级毛片免费看 | 亚洲人成网站在线播放影院在线| 美女无遮挡拍拍拍免费视频| 国产亚洲精午夜久久久久久| 成人久久免费网站| 亚洲AV第一页国产精品| 最近免费中文字幕mv电影| 亚洲的天堂av无码| 成人午夜性A级毛片免费| 成人亚洲国产精品久久| 亚洲伊人成无码综合网| 黄页免费在线观看| 亚洲成a人片7777| 日韩免费高清视频网站| 麻豆一区二区三区蜜桃免费| 亚洲乱码中文字幕综合| 精品久久8x国产免费观看| 色天使亚洲综合在线观看| 免费一级特黄特色大片在线观看| www成人免费观看网站| 亚洲国产精品久久久久| 一本无码人妻在中文字幕免费| 国产亚洲精品AAAA片APP| 国产午夜亚洲不卡| 免费阿v网站在线观看g| 搜日本一区二区三区免费高清视频 | 成人无码WWW免费视频| 亚洲人成网网址在线看| 四虎永久免费地址在线观看| 国产精品免费久久久久影院| 亚洲黄网站wwwwww| 日韩高清在线免费观看| 99麻豆久久久国产精品免费| 亚洲影视自拍揄拍愉拍| 亚洲愉拍99热成人精品热久久|