<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 :: 首頁(yè) :: 聯(lián)系 :: 聚合  :: 管理
      611 Posts :: 1 Stories :: 190 Comments :: 0 Trackbacks

            現(xiàn)在SQL2005提供了DTA的工具,大家在去優(yōu)化一個(gè)語(yǔ)句時(shí)都有意無(wú)意的使用此工具所給出的一些優(yōu)化建議。不過(guò)它始終是個(gè)工具,所給出的優(yōu)化建議很多時(shí)候都是使用2005新的索引功能INCLUDE把查詢(xún)列表統(tǒng)統(tǒng)包括在一個(gè)索引中。因此,每個(gè)開(kāi)發(fā)人員所定義的索引就會(huì)存在重復(fù)或是很相似的地方。因?yàn)樗饕?yè)的數(shù)據(jù)比較密集,因此在對(duì)包含有索引列的字段做修改操作時(shí),都會(huì)去相應(yīng)的修改包含此鍵值列的索引。理論上對(duì)一張表多加一個(gè)索引,修改數(shù)據(jù)的速度就會(huì)比原來(lái)慢1.2倍。因此,這會(huì)增加記錄被鎖定的時(shí)間,從而也就會(huì)影響到查詢(xún)的性能。

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

             下面的腳本可以組合這些視圖,查詢(xún)出對(duì)象名稱(chēng)、對(duì)象類(lèi)型(表或索引視圖)、索引名稱(chēng)、索引編號(hào)、索引類(lèi)型、是否主鍵、是否唯一、填充度、鍵值字段、包含字段、表的總記錄數(shù)(取各分區(qū)中行的總數(shù))、索引描述,如下圖部分顯示結(jié)果所示,這樣就很方便的判斷出哪些索引是重復(fù)或相似的:


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


    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不能反應(yīng)出包含字段
    EXEC sp_helpindex 'Sales.SalesOrderHeader'
    GO
    --SQL2005下用于診斷索引重復(fù)的腳本
    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--使用全名稱(chēng),防止直接使用表名稱(chēng)時(shí)無(wú)法獲取其它架構(gòu)表的信息
       
        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下用于診斷索引重復(fù)的腳本
    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'--用于保存關(guān)系圖的系統(tǒng)表
        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--使用全名稱(chēng),防止直接使用表名稱(chēng)時(shí)無(wú)法獲取其它用戶(hù)表的信息
       
        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 閱讀(563) 評(píng)論(0)  編輯  收藏 所屬分類(lèi): 數(shù)據(jù)庫(kù)
    主站蜘蛛池模板: fc2成年免费共享视频18| 亚洲a∨无码一区二区| 亚洲18在线天美| 亚洲AV永久无码精品网站在线观看 | 伊在人亚洲香蕉精品区麻豆| www.亚洲色图| 亚洲欧洲成人精品香蕉网| 亚洲人成依人成综合网| 2020亚洲男人天堂精品| 添bbb免费观看高清视频| 日本免费A级毛一片| 99在线精品视频观看免费| 午夜毛片不卡免费观看视频| 亚洲女同成人AⅤ人片在线观看 | 亚洲乱码中文字幕综合234| 亚洲av中文无码乱人伦在线r▽| 亚洲国产一区国产亚洲| 亚洲av无码专区青青草原| 拍拍拍无挡视频免费观看1000| 精品无码免费专区毛片| 国产传媒在线观看视频免费观看| 亚洲乱码中文字幕久久孕妇黑人| 亚洲欧洲中文日产| 免费国产在线精品一区| 99精品热线在线观看免费视频| 四虎成人精品一区二区免费网站| 在线a亚洲v天堂网2019无码| 亚洲乱码一区av春药高潮| 最好2018中文免费视频| 最好看的中文字幕2019免费| 国产又大又长又粗又硬的免费视频| 亚洲国产精品成人精品无码区在线| 亚洲色欲色欱wwW在线| 两个人日本免费完整版在线观看1| 嘿嘿嘿视频免费网站在线观看| 亚洲高清无码在线观看| 亚洲男人的天堂在线| 免费一级做a爰片久久毛片潮| 亚洲一级毛片免费观看| 亚洲中文字幕无码一区 | 久久亚洲国产成人影院|