2012-05-25 32 views
-1

我有一個觀點,這是非常緩慢:爲什麼排序花了我70%?

ALTER view [dbo].[TAT] as 
WITH d AS (SELECT TAT = CASE WHEN TAT > 191 THEN 192 ELSE TAT END, 
    [MONTH entered], 
    [YEAR] = DATEPART(yyyy,[datetime entered]) 
    FROM [SalesDWH].[dbo].[TurnAround] TurnAround 
    left outer join hermes.lom.dbo.lom_specimen Lom 
    on TurnAround.[specimen id] = lom.specimen 
    LEFT outer join SalesDWH.dbo.Isomers Isomers 
    on TurnAround.[specimen id] = Isomers.[accession id] 
    WHERE lom.specimen is null 
    and isomers.[accession id] is null 
-- GROUP BY CASE WHEN TAT > 191 THEN 192 ELSE TAT END 
    --[datetime entered],[Month Entered] 
), 
n AS (SELECT TOP (192) n = ROW_NUMBER() OVER (ORDER BY [object_id]) 
    FROM sys.all_columns ORDER BY [object_id] 
) 
SELECT TAT = n.n, 

    [MONTH entered], 
    [YEAR] 

FROM n LEFT OUTER JOIN d 
ON n.n = d.TAT 



GO 

當我看的執行計劃,它告訴我,哪個是排序的成本我70%的步驟之一。

當我檢查排序步驟,它說我的ORDER BY是:

[SalesDWH].[dbo].[QuickLabDump].Specimen ID Ascending, [SalesDWH].[dbo].[QuickLabDump].Date Entered Ascending, [SalesDWH].[dbo].[QuickLabDump].Time Entered Ascending, [SalesDWH].[dbo].[QuickLabDump].Date Completed Ascending, [SalesDWH].[dbo].[QuickLabDump].Time Completed Ascending, [SalesDWH].[dbo].[QuickLabDump].Practice Name Ascending, [SalesDWH].[dbo].[QuickLabDump].Practice Code Ascending, [SalesDWH].[dbo].[QuickLabDump].Order Count Ascending, [SalesDWH].[dbo].[QLMLISMapping].MLIS Practice ID Ascending, [SalesDWH].[dbo].[adjustedtime].TimeDifference Ascending 

但我還沒有指定一個ORDER BY的任何地方。

問題:

  1. 爲什麼它說ASCENDING的ORDER BY如果我沒有任何ORDER BY的?
  2. 如何加快此視圖?

我不知道如果需要此信息,但上述觀點查詢另一種觀點認爲所謂TURNAROUND

USE [SalesDWH] 
GO 

/****** Object: View [dbo].[TurnAround] Script Date: 05/25/2012 15:32:08 ******/ 
SET ANSI_NULLS ON 
GO 

SET QUOTED_IDENTIFIER ON 
GO 




ALTER VIEW [dbo].[TurnAround] 
AS 
SELECT  dbo.QuickLabDump.[Specimen ID], DATEPART(yyyy, dbo.QuickLabDump.[Date Entered]) AS [Year Entered], CAST(CAST(dbo.QuickLabDump.[Date Entered] AS DATE) 
         AS DATETIME) + CAST(dbo.QuickLabDump.[Time Entered] AS TIME) AS [DateTime Entered], CAST(CAST(dbo.QuickLabDump.[Date Completed] AS DATE) AS DATETIME) 
         + CAST(dbo.QuickLabDump.[Time Completed] AS TIME) AS [DateTime Completed], dbo.QuickLabDump.[Practice Code] AS [QL Practuce Code], 
         dbo.QLMLISMapping.[MLIS Practice ID], DATEPART(m, dbo.QuickLabDump.[Date Entered]) AS [Month Entered], ROUND(CAST(DATEDIFF(mi, 
         CAST(CAST(dbo.QuickLabDump.[Date Entered] AS DATE) AS DATETIME) + CAST(dbo.QuickLabDump.[Time Entered] AS TIME), 
         CAST(CAST(dbo.QuickLabDump.[Date Completed] AS DATE) AS DATETIME) + CAST(dbo.QuickLabDump.[Time Completed] AS TIME)) AS FLOAT)/60, 0) AS TAT, 
         ROUND(CAST(DATEDIFF(mi, CAST(CAST(dbo.QuickLabDump.[Date Entered] AS DATE) AS DATETIME) + CAST('9:00AM' AS TIME), 


         CAST(CAST(dbo.QuickLabDump.[Date Completed] AS DATE) AS DATETIME) 
         + CAST(dbo.QuickLabDump.[Time Completed] AS TIME)) AS float)/60, 0) 

         AS [Hours TurnAround Since 9AM], TAT9AMStateAdjusted=     



         ROUND(CAST(DATEDIFF(mi, CAST(CAST(dbo.QuickLabDump.[Date Entered] AS DATE) AS DATETIME) 
         + CAST('9:00AM' AS TIME),            
         CAST(CAST(dbo.QuickLabDump.[Date Completed] AS DATE) AS DATETIME) 
         + CAST(dbo.QuickLabDump.[Time Completed] AS TIME)) AS float)/60, 0)       


         +dbo.adjustedtime.timedifference 
         ,dbo.QuickLabDump.[Order Count], CONVERT(VARCHAR(8), DATEADD(D, - (1 * DATEPART(dw, dbo.QuickLabDump.[Date Entered])) + 6, 
         dbo.QuickLabDump.[Date Entered]), 1) AS [Week Ending] 
FROM   dbo.QuickLabDump 
      INNER JOIN dbo.QLMLISMapping 
      ON dbo.QuickLabDump.[Practice Code] = dbo.QLMLISMapping.[Quicklab ID] 
      left outer join dbo.AccountState 
      on dbo.QuickLabDump.[Practice Code]=dbo.AccountState.[Account] 
      left outer join dbo.AdjustedTime 
      ON dbo.AccountState.[state]=dbo.adjustedtime.[state] 
WHERE  (dbo.QuickLabDump.[Practice Code] NOT LIKE 'test%') AND (dbo.QuickLabDump.[Specimen ID] NOT LIKE 'of%') AND (dbo.QuickLabDump.Outcome <> 'rejected') 
GROUP BY dbo.QuickLabDump.[Specimen ID], dbo.QuickLabDump.[Date Entered], dbo.QuickLabDump.[Time Entered], dbo.QuickLabDump.[Date Completed], 
         dbo.QuickLabDump.[Time Completed], dbo.QuickLabDump.[Practice Name], dbo.QuickLabDump.[Practice Code], dbo.QuickLabDump.[Order Count], 
         dbo.QLMLISMapping.[MLIS Practice ID],dbo.adjustedtime.timedifference 
HAVING  (dbo.QuickLabDump.[Order Count] = MAX(dbo.QuickLabDump.[Order Count])) OR 
         (dbo.QuickLabDump.[Order Count] IS NULL) 




GO 

下面是表定義:

CREATE TABLE [dbo].[QuickLabDump](
    [Specimen ID] [varchar](50) NULL, 
    [Client Key] [int] NULL, 
    [Outcome] [varchar](50) NULL, 
    [Medications] [varchar](max) NULL, 
    [Date Collected] [date] NULL, 
    [Time Collected] [time](0) NULL, 
    [Date Entered] [date] NULL, 
    [Time Entered] [time](0) NULL, 
    [Date Completed] [date] NULL, 
    [Time Completed] [time](0) NULL, 
    [Test Date] [date] NULL, 
    [Test Time] [time](0) NULL, 
    [Practice Name] [varchar](500) NULL, 
    [Practice Code] [varchar](50) NULL, 
    [Requesting Physician] [varchar](500) NULL, 
    [Other Medications] [varchar](max) NULL, 
    [Order Comments] [varchar](max) NULL, 
    [Reference Number] [varchar](500) NULL, 
    [Order Count] [int] NULL, 
    [QuickLabDumpID] [int] NOT NULL, 
    [Source] [varchar](50) NULL, 
    [MLIS] [varchar](50) NULL, 
CONSTRAINT [PK_QuickLabDump_1] PRIMARY KEY CLUSTERED 
(
    [QuickLabDumpID] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) ON [PRIMARY] 

回答

2

查詢分析器顯示您的Group BY正在進行排序。

您應該在分組正在使用的字段上測試\創建索引以提高性能。

下面是Group By如何創建排序的更詳細說明。 Link

1

只是爲了請確保你知道,我看到一個訂單:

, 
n AS (SELECT TOP (192) n = ROW_NUMBER() OVER (ORDER BY [object_id]) 
    FROM sys.all_columns ORDER BY [object_id] 
) 
+0

如果我擺脫了ORDER BY,那部分會是什麼樣子? –

+0

順便說一句偉大的一點! –

+0

我甚至在那裏看到兩個...一個用於窗口函數,另一個用於輸出。 – Lucero

2

您看到排序的列是TurnAround的GROUP BY子句中的列。執行GROUP BY的最簡單方法首先按組列排序,然後拆分每個組的行數,最後計算每個組的聚合數,在這種情況下,它看起來就是數據庫正在做的事情。

+0

謝謝你,這是很棒的信息。我怎麼能加快視圖? –

+0

我想嘗試的第一件事是運行索引調整嚮導(在測試環境中),應用其建議,並查看它們是否有幫助。如果他們幫助,請確定它的哪些建議是值得的以及爲什麼。如果他們沒有幫助,仔細想想你的觀點應該做什麼。它不易讀,所以我不能確定你現在的定義是否是最明智的定義。 – hvd

+0

索引調整嚮導在哪裏? –

2

您的group by和(outer)join可能是排序的原因,您在使用的列上是否有任何匹配索引?如果發佈表的完整定義(包括索引和鍵/約束),那麼找出問題的猜測就會少一些。

+0

lucero你能告訴我你的意思是通過匹配索引嗎?你是指連接列上的索引? –

+0

我剛剛爲主表發佈了表定義 –

+0

如果這是完整的表定義,那麼您沒有定義任何明智的索引,並且查詢緩慢也就不足爲奇了。但是一般來說,代碼看起來非常混亂,並且由許多列組成的代碼羣是一種代碼異味 - 您可以通過使用不同的方法(可能通過使用窗口函數)獲得所需的代碼。一般來說,規範輸出的意思是幫助理解視圖。 – Lucero

相關問題