2015-12-29 36 views
2

基於https://www.simple-talk.com/books/sql-books/sql-server-performance-tuning-using-wait-statistics-a-beginners-guide/(第34頁),我試圖創建表並使用Wait Stats填充它。捕獲等待統計

IF NOT EXISTS (
    SELECT * 
    FROM [sys].[tables] 
    WHERE [name]=N'WaitStats'AND[type] =N'U' 
) 

CREATE TABLE [dbo].[T_WaitStats](
[RowNum] [BIGINT] IDENTITY(1, 1) , 
[CaptureDate] [DATETIME] , 
[WaitType] [NVARCHAR](120) , 
[Wait_S] [DECIMAL](14, 2) , 
[Resource_S] [DECIMAL](14, 2), 
[Signal_S] [DECIMAL](14, 2) , 
[WaitCount] [BIGINT] , 
[Percentage] [DECIMAL](4, 2) , 
[AvgWait_S] [DECIMAL](14, 2), 
[AvgRes_S] [DECIMAL](14, 2), 
[AvgSig_S] [DECIMAL](14, 2)); 

GO 


INSERT INTO dbo.T_WaitStats([WaitType]) 
    VALUES ('Wait Statistics for '+ CAST(GETDATE() AS NVARCHAR(19))); 

INSERT INTO dbo.T_WaitStats( 
    [CaptureDate], 
    [WaitType], 
    [Wait_S], 
    [Resource_S], 
    [Signal_S], 
    [WaitCount], 
    [Percentage], 
    [AvgWait_S], 
    [AvgRes_S], 
    [AvgSig_S] 
) 

EXEC(
    'WITH [Waits] AS(
     SELECT 
      [wait_type], 
      [wait_time_ms]/1000.0 AS [Wait_S], 
      ([wait_time_ms] - [signal_wait_time_ms])/1000.0 AS [Resource_S], 
      [signal_wait_time_ms]/1000.0 AS [Signal_S], 
      [waiting_tasks_count] AS [WaitCount], 
      100.0 * [wait_time_ms]/SUM ([wait_time_ms]) OVER() AS [Percentage], 
      ROW_NUMBER() OVER(ORDER BY [wait_time_ms] DESC) AS [RowNum] 
     FROM sys.dm_os_wait_stats 
     WHERE [wait_type] NOT IN (
      N''BROKER_EVENTHANDLER'', N''BROKER_RECEIVE_WAITFOR'', 
      N''BROKER_TASK_STOP'',  N''BROKER_TO_FLUSH'', 
      N''BROKER_TRANSMITTER'', N''CHECKPOINT_QUEUE'', 
      N''CHKPT'',     N''CLR_AUTO_EVENT'', 
      N''CLR_MANUAL_EVENT''  
     ) 
    ) 
    SELECT  
     GETDATE() AS [CaptureDate], 
     [W1].[wait_type] AS [WaitType], 
     CAST ([W1].[Wait_S] AS DECIMAL(14, 2)) AS [Wait_S], 
     CAST ([W1].[Resource_S] AS DECIMAL(14, 2)) AS [Resource_S], 
     CAST ([W1].[Signal_S] AS DECIMAL(14, 2)) AS [Signal_S], 
     [W1].[WaitCount] AS [WaitCount], 
     CAST ([W1].[Percentage] AS DECIMAL(4, 2)) AS [Percentage], 
     CAST (([W1].[Wait_S]/[W1].[WaitCount]) AS DECIMAL (14, 4)) 
                AS [AvgWait_S], 
     CAST (([W1].[Resource_S]/[W1].[WaitCount]) AS DECIMAL (14, 4)) 
                AS [AvgWait_S], 
     CAST (([W1].[Resource_S]/[W1].[WaitCount]) AS DECIMAL (14, 4)) 
                AS [AvgRes_S], 
     CAST (([W1].[Signal_S]/[W1].[WaitCount]) AS DECIMAL (14, 4)) 
                AS [AvgSig_S] 
    FROM [Waits] AS [W1] 
    INNER JOIN [Waits] AS [W2] 
     ON [W2].[RowNum] <= [W1].[RowNum] 
    GROUP BY [W1].[RowNum], [W1].[wait_type], [W1].[Wait_S], 
     [W1].[Resource_S], [W1].[Signal_S], [W1].[WaitCount], 
     [W1].[Percentage] 
    HAVING SUM ([W2].[Percentage]) - [W1].[Percentage] < 95;' 
); 

先插入工作,但第二個給我一個錯誤:

(1 row(s) affected) Msg 213, Level 16, State 7, Line 1 Column name or number of supplied values does not match table definition.

運行第二個語句沒有插入(僅EXEC部分)的作品。 什麼可能會導致此錯誤?

回答

2

複製粘貼在查詢(返回11列,但表預計10列)

CAST (([W1].[Resource_S]/[W1].[WaitCount]) AS DECIMAL (14, 4)) AS [AvgWait_S], 

查詢 -

IF OBJECT_ID('dbo.T_WaitStats', 'U') IS NOT NULL 
    DROP TABLE dbo.T_WaitStats 
GO 

CREATE TABLE [dbo].[T_WaitStats] (
    RowNum INT IDENTITY (1, 1) PRIMARY KEY, 
    CaptureDate DATETIME, 
    WaitType NVARCHAR(120), 
    Wait_S DECIMAL(14,2), 
    Resource_S DECIMAL(14,2), 
    Signal_S DECIMAL(14,2), 
    WaitCount BIGINT, 
    Percentage DECIMAL(4,2), 
    AvgWait_S DECIMAL(14,2), 
    AvgRes_S DECIMAL(14,2), 
    AvgSig_S DECIMAL(14,2) 
) 
GO 

INSERT INTO dbo.T_WaitStats ([WaitType]) 
VALUES ('Wait Statistics for ' + CAST(GETDATE() AS NVARCHAR(19))) 

INSERT INTO dbo.T_WaitStats (CaptureDate, WaitType, Wait_S, Resource_S, Signal_S, WaitCount, Percentage, AvgWait_S, AvgRes_S, AvgSig_S) 
EXEC ('WITH [Waits] AS(
     SELECT 
      [wait_type], 
      [wait_time_ms]/1000.0 AS [Wait_S], 
      ([wait_time_ms] - [signal_wait_time_ms])/1000.0 AS [Resource_S], 
      [signal_wait_time_ms]/1000.0 AS [Signal_S], 
      [waiting_tasks_count] AS [WaitCount], 
      100.0 * [wait_time_ms]/SUM ([wait_time_ms]) OVER() AS [Percentage], 
      ROW_NUMBER() OVER(ORDER BY [wait_time_ms] DESC) AS [RowNum] 
     FROM sys.dm_os_wait_stats 
     WHERE [wait_type] NOT IN (
      N''BROKER_EVENTHANDLER'', N''BROKER_RECEIVE_WAITFOR'', 
      N''BROKER_TASK_STOP'',  N''BROKER_TO_FLUSH'', 
      N''BROKER_TRANSMITTER'', N''CHECKPOINT_QUEUE'', 
      N''CHKPT'',     N''CLR_AUTO_EVENT'', 
      N''CLR_MANUAL_EVENT''  
     ) 
    ) 
    SELECT  
     GETDATE() AS [CaptureDate], 
     [W1].[wait_type] AS [WaitType], 
     [W1].[Wait_S] AS [Wait_S], 
     [W1].[Resource_S] AS [Resource_S], 
     [W1].[Signal_S] AS [Signal_S], 
     [W1].[WaitCount] AS [WaitCount], 
     [W1].[Percentage] AS [Percentage], 
     [W1].[Wait_S]/[W1].[WaitCount] AS [AvgWait_S], 
     [W1].[Resource_S]/[W1].[WaitCount] AS [AvgRes_S], 
     [W1].[Signal_S]/[W1].[WaitCount] AS [AvgSig_S] 
    FROM [Waits] AS [W1] 
    INNER JOIN [Waits] AS [W2] 
     ON [W2].[RowNum] <= [W1].[RowNum] 
    GROUP BY [W1].[RowNum], [W1].[wait_type], [W1].[Wait_S], 
     [W1].[Resource_S], [W1].[Signal_S], [W1].[WaitCount], 
     [W1].[Percentage] 
    HAVING SUM ([W2].[Percentage]) - [W1].[Percentage] < 95;' 
);