亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

缺失索引自動創(chuàng)建語句

iamyoung001 / 1758人閱讀

摘要:編者按本文主要介紹使用系統(tǒng)實體自動創(chuàng)建非聚集索引。會返回缺失索引的細節(jié)信息。視圖該視圖基于和表,并使用函數(shù)來計算缺失的索引名。存儲過程該存儲過程基于,并且輸出索引創(chuàng)建語句。

【編者按】 本文主要介紹使用系統(tǒng) SQL 實體自動創(chuàng)建非聚集(non-clustered)索引。作者為意大利軟件工程師 GhostHost(筆名)。

本文系 OneAPM 工程師編譯呈現(xiàn),以下為正文。

引言

一直以來,關于索引的常見問題是:判斷哪部分索引對保證數(shù)據(jù)庫的良好性能是必需的。在本文中,筆者將提供針對該問題的解決方案。本文用例中的所有代碼都基于名為 dm_db_missing_index_details 的 SQL Server 系統(tǒng)視圖。

背景

在開始安裝前,進一步了解 dm_db_missing_index_details 會更有益處。

dm_db_missing_index_details 會返回缺失索引的細節(jié)信息。在本文中,我們將更關注以下幾列:

index_handle:它是一個獨特的跨服務器標識符,并且標志一個特定的缺失索引。

equality_columns:包含用于相等謂詞的所有列

inequality_columns:包含用于其他比較的所有列

included columns索引中所包含的查詢必要出現(xiàn)列

statement: 補充完整索引缺失的表名

實現(xiàn)

本系統(tǒng)的實現(xiàn)基于以下三個實體:

一個可以計算出待創(chuàng)建索引名稱的簡單函數(shù)

一個用于簡化 dm_db_missing_index_details的用戶視圖

一個為每個索引創(chuàng)建聲明的進程

筆者選擇將這個系統(tǒng)分為三段進程,但實際上合并存儲過程和視圖也是可行的。筆者之所以沒有選擇后一種做法是因為想在創(chuàng)建索引之前先從業(yè)務邏輯檢查一下存在哪些索引。

使用代碼

函數(shù) fn_Index_CreateIndexName
在這個函數(shù)中,有三個輸入?yún)?shù):

    1.  @equality_columns
    2.  @equality_columns
    3.  @index_handlE

該函數(shù)的目的是為每個期望創(chuàng)建的索引都創(chuàng)建一個唯一名稱。

因此,首先拼接@equality_columns@equality_columns兩個輸入變量,如果拼接后所得結果超過120個字符,那就截取至第120個字符。

為什么是120個字符?

因為在SQL Server中,命名最大長度為128個字符。這個函數(shù)在 @index_handlE 名字結尾添加字段以便保證唯一的索引名。

    CREATE FUNCTION [dbo].[fn_Index_CreateIndexName] (@equality_columns NVARCHAR(4000), _
    @Inequality_columns NVARCHAR(4000), @index_handlE INT) RETURNS VARCHAR(128)
    AS
    BEGIN
    
    DECLARE @IndexName NVARCHAR(255)
    
    SET @IndexName = ISNULL(@equality_columns,@Inequality_columns)
    
    SET @IndexName = LTRIM(REPLACE(@IndexName,"[","_"))
    
    SET @IndexName = RTRIM(REPLACE(@IndexName,"]","_"))
    
    SET @IndexName = REPLACE(@IndexName,",","")
    
    SET @IndexName = REPLACE(@IndexName,"_ _","_")
    
    IF LEN(@IndexName) > 120
    BEGIN
    
        SET @IndexName = SUBSTRING(@IndexName,0,120)
    
    END  
    
    SET @IndexName = @IndexName + CAST(@index_handlE AS NVARCHAR(15))
    
    RETURN @IndexName 
    END

視圖 vw_Index_MissingIndex
該視圖基于dm_db_missing_index_details和 sys.databases 表,并使用fn_Index_CreateIndexName 函數(shù)來計算缺失的索引名。

    CREATE VIEW [dbo].[vw_Index_MissingIndex]
    AS
    
    SELECT  "[" + d.name + "]" as DBName,
            [dbo].[fn_Index_CreateIndexName]_
            (mid.equality_columns,mid.Inequality_columns,mid.index_handlE) AS ID,
            REPLACE(mid.equality_columns,","," ASC,") AS equality_columns,
            REPLACE(mid.Inequality_columns,","," ASC,") AS Inequality_columns,
            mid.Included_columns,
            mid.[statement]
    FROM sys.dm_db_missing_index_details mid
    INNER JOIN sys.databases d
    on d.database_id = mid.database_id

存儲過程 usp_Index_MissingIndexCreationStatements
該存儲過程基于 vw_Index_MissingIndex,并且輸出索引創(chuàng)建語句。

    CREATE PROCEDURE [dbo].[usp_Index_MissingIndexCreationStatements]
    AS
    
    DECLARE @IndexCreationPlaceholder_Start  AS NVARCHAR(MAX)
    DECLARE @IndexCreationPlaceholder_End  AS NVARCHAR(MAX)
    
    -- PREPARE PLACEHOLDER
    
    SET @IndexCreationPlaceholder_Start = "IF NOT EXISTS(SELECT * _
    FROM {2}.sys.indexes WHERE [name] = ""IX_{0}"" )
                    BEGIN
                    CREATE NONCLUSTERED INDEX [IX_{0}] ON {1}"
    
    SET @IndexCreationPlaceholder_End = " WITH (PAD_INDEX = OFF, _
    STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, _
    ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
                    END;" + char(13) + char(10)
    
    -- STATEMENT CREATION
    
    SELECT
        DBName,
        CASE
        WHEN NOT mid.equality_columns IS NULL AND NOT mid.Inequality_columns IS NULL THEN
                    REPLACE(REPLACE(REPLACE(@IndexCreationPlaceholder_Start,"{0}", _
                    mid.ID),"{1}",mid.[statement]),"{2}",mid.DBName)
                    + "
                       ( " +
                       COALESCE(mid.equality_columns,"") +
                       " ASC," + 
                       COALESCE(mid.Inequality_columns,"") +
                       " ASC
                    )" +
                    COALESCE("INCLUDE ( " + mid.Included_columns + " ) ","")
                    + @IndexCreationPlaceholder_End
    
            WHEN mid.equality_columns IS NULL AND NOT mid.Inequality_columns IS NULL THEN
                    REPLACE(REPLACE(REPLACE(@IndexCreationPlaceholder_Start,_
                    "{0}", mid.ID),"{1}",mid.[statement]),"{2}",mid.DBName)
                    + "
                       ( " +
                       COALESCE(mid.Inequality_columns,"") +
                       " ASC
                    ) " +
                    COALESCE("INCLUDE ( " + mid.Included_columns + " ) ","")
                    + @IndexCreationPlaceholder_End
    
        WHEN NOT mid.equality_columns IS NULL AND mid.Inequality_columns IS NULL THEN
                REPLACE(REPLACE(REPLACE(@IndexCreationPlaceholder_Start,"{0}", _
                mid.ID),"{1}",mid.[statement]),"{2}",mid.DBName)
                + "
                   ( " +
               COALESCE(mid.equality_columns,"") +  " ASC
                    ) " +
                COALESCE("INCLUDE ( " + mid.Included_columns + " ) ","")
                + @IndexCreationPlaceholder_End
        ELSE NULL
    END AS Index_Creation_Statement,
        " DROP INDEX [IX_" + mid.ID  + "] ON " + mid.[statement]  _
        +  + char(13) + char(10) AS Index_Drop_Statement
    FROM [dbo].[vw_Index_MissingIndex] AS mid
完整代碼
    -- CREATE FUNCTION fn_Index_CreateIndexName
    
    CREATE FUNCTION [dbo].[fn_Index_CreateIndexName] (@equality_columns NVARCHAR(4000), _
    @Inequality_columns NVARCHAR(4000), @index_handlE INT) RETURNS VARCHAR(128)
    AS
    BEGIN
    
            DECLAR
    
    E @IndexName NVARCHAR(MAX)
    
        SET @IndexName = ISNULL(@equali
    
    ty_columns,@Inequality_columns)
    
    SET @IndexName = LTRIM(REPLACE(@IndexName,"[","_"))
    
    SET @IndexName = RTRIM(REPLACE(@IndexName,"]","_"))
    
    SET @IndexName = REPLACE(@IndexName,",","")
    
    SET @IndexName = REPLACE(@IndexName,"_ _","_")
    
        IF LEN(@IndexName) > 120
        BEGIN
    
            SET @IndexName = SUBSTRING(@IndexName,0,120)
    
        END  
    
        SET @IndexName = @IndexName + CAST(@index_handlE AS NVARCHAR(15))
    
        RETURN @IndexName 
    END
    
    GO
    
    -- CREATE FUNCTION vw_Index_MissingIndex
    
    CREATE VIEW [dbo].[vw_Index_MissingIndex] 
    AS
    
    SELECT  "[" + d.name + "]" as DBName,
            [dbo].[fn_Index_CreateIndexName]_
            (mid.equality_columns,mid.Inequality_columns,mid.index_handlE) AS ID,
            REPLACE(mid.equality_columns,","," ASC,") AS equality_columns,
            REPLACE(mid.Inequality_columns,","," ASC,") AS Inequality_columns,
            mid.Included_columns,
            mid.[statement]
    FROM sys.dm_db_missing_index_details mid
    INNER JOIN sys.databases d
    on d.database_id = mid.database_id
    
    GO
    
    CREATE PROCEDURE [dbo].[usp_Index_MissingIndexCreationStatements]
    AS
    
    DECLARE @IndexCreationPlaceholder_Start  AS NVARCHAR(MAX)
    DECLARE @IndexCreationPlaceholder_End  AS NVARCHAR(MAX)
    
    -- PREPARE PLACEHOLDER
    
    SET @IndexCreationPlaceholder_Start = "IF NOT EXISTS_
    (SELECT * FROM {2}.sys.indexes WHERE [name] = ""IX_{0}"" )
                    BEGIN
                    CREATE NONCLUSTERED INDEX [IX_{0}] ON {1}"
    
    SET @IndexCreationPlaceholder_End = " WITH (PAD_INDEX = OFF, _
    STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, _
    ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
                    END;" + char(13) + char(10)
    
    -- STATEMENT CREATION
    
    SELECT
        DBName,
        CASE
        WHEN NOT mid.equality_columns IS NULL AND NOT mid.Inequality_columns IS NULL THEN
                    REPLACE(REPLACE(REPLACE(@IndexCreationPlaceholder_Start,"{0}", _
                    mid.ID),"{1}",mid.[statement]),"{2}",mid.DBName)
                    + "
                       ( " +
                       COALESCE(mid.equality_columns,"") +
                       " ASC," + 
                       COALESCE(mid.Inequality_columns,"") +
                       " ASC
                    )" +
                    COALESCE("INCLUDE ( " + mid.Included_columns + " ) ","")
                    + @IndexCreationPlaceholder_End
    
            WHEN mid.equality_columns IS NULL AND NOT mid.Inequality_columns IS NULL THEN
                    REPLACE(REPLACE(REPLACE(@IndexCreationPlaceholder_Start,"{0}", _
    
    
    mid.ID),"{1}",mid.[statement]),"{2}",mid.DBName)
                + "
                   ( " +
                   COALESCE(mid.Inequality_columns,"") +
                   " ASC
                ) " +
                COALESCE("INCLUDE ( " + mid.Included_columns + " ) ","")
                + @IndexCreationPlaceholder_End
    
        WHEN NOT mid.equality_columns IS NULL AND mid.Inequality_columns IS NULL THEN
                REPLACE(REPLACE(REPLACE(@IndexCreationPlaceholder_Start,"{0}", _
                mid.ID),"{1}",mid.[statement]),"{2}",mid.DBName)
                + "
                   ( " +
               COALESCE(mid.equality_columns,"") +  " ASC
                    ) " +
                COALESCE("INCLUDE ( " + mid.Included_columns + " ) ","")
                + @IndexCreationPlaceholder_End
        ELSE NULL
    END AS Index_Creation_Statement,
    " DROP INDEX [IX_" + mid.ID  + "] ON " + mid.[statement]  _
        +  + char(13) + char(10) AS Index_Drop_Statement
    FROM [dbo].[vw_Index_MissingIndex] AS mid
    
    GO

OneAPM 助您輕松鎖定 .NET 應用性能瓶頸,通過強大的 Trace 記錄逐層分析,直至鎖定行級問題代碼。以用戶角度展示系統(tǒng)響應速度,以地域和瀏覽器維度統(tǒng)計用戶使用情況。想閱讀更多技術文章,請訪問 OneAPM 官方博客。

本文轉自 OneAPM 官方博客

原文地址:http://www.codeproject.com/Tips/1079651/Automatic-Missing-Non-Clustered-Creation-Statement

文章版權歸作者所有,未經(jīng)允許請勿轉載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉載請注明本文地址:http://www.ezyhdfw.cn/yun/17518.html

相關文章

  • 【數(shù)據(jù)科學系統(tǒng)學習】Python # 數(shù)據(jù)分析基本操作[二] pandas

    摘要:中面向行和面向列的操作基本是平衡的。用層次化索引,將其表示為更高維度的數(shù)據(jù)。使用浮點值表示浮點和非浮點數(shù)組中的缺失數(shù)據(jù)。索引的的格式化輸出形式選取數(shù)據(jù)子集在內層中進行選取層次化索引在數(shù)據(jù)重塑和基于分組的操作中很重要。 我們在上一篇介紹了 NumPy,本篇介紹 pandas。 pandas入門 Pandas 是基于Numpy構建的,讓以NumPy為中心的應用變的更加簡單。 pandas...

    jayzou 評論0 收藏0
  • 數(shù)據(jù)科學

    摘要:資料分析資料篩選偵測缺失值補齊缺失值資料轉換處理時間格式數(shù)據(jù)重塑資料學習正規(guī)運算式處理資料格式,提供高效能,簡易使用的數(shù)據(jù)格式讓用戶可以快速操作及分析資料。使用平均數(shù),中位數(shù),眾數(shù)等敘述性統(tǒng)計補齊缺失值。 有90%的有用數(shù)據(jù),都在數(shù)據(jù)庫中。 數(shù)據(jù) 數(shù)據(jù)類型 定性數(shù)據(jù): 敘述特征或種類,例如:種族,區(qū)域。 定量數(shù)據(jù): 可以被計數(shù)或測量,例如:身高,消費金額。 定量數(shù)據(jù) 離散數(shù)據(jù)只能...

    anquan 評論0 收藏0

發(fā)表評論

0條評論

iamyoung001

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<