2010-08-19 23 views
0

這裏是我的表架構SQL Server 2005中,似乎有一定的標準採取永遠where子句

[dbo].[Action_History](
    [ActionID] [int] IDENTITY(1,1) NOT NULL, 
    [objectID] [int] NOT NULL, 
    [object_mask] [varchar](max) NULL, 
    [description] [varchar](max) NOT NULL, 
    [action_by] [nchar](7) NOT NULL, 
    [action_date] [datetime] NOT NULL, 
    [response_required] [bit] NOT NULL, 
    [responded_date] [datetime] NULL, 
    [responded_by] [nchar](7) NULL, 
    [recurring] [bit] NULL CONSTRAINT [DF_Action_History_recurring] DEFAULT ((0)), 
    [actionTypeID] [int] NULL, 
    [target_user] [nchar](7) NULL, 
    [target_role] [varchar](25) NULL, 
    [object_type] [varchar](30) NULL, CONSTRAINT [PK_Action_History] PRIMARY KEY CLUSTERED 

這裏查詢1:

SELECT  
    Top(1) 
    ActionID, objectID, object_mask, 
    [description], action_by, action_date, response_required, 
    responded_date, responded_by, recurring, actionTypeID, 
    target_user, target_role, object_type 
FROM 
    Action_History 
WHERE  
    ((objectID = 201006) 
    AND (responded_date is null)  
    AND (object_type = 'MyType')) 

和查詢2:

SELECT  
    Top(1) 
    ActionID, objectID, object_mask, 
    [description], action_by, action_date, response_required, 
    responded_date, responded_by, recurring, actionTypeID, 
    target_user, target_role, object_type 
FROM 
    Action_History 
WHERE  
    ((objectID = 201006) 
    AND (responded_date is null)  
    AND (object_type = 'Mytype') 
    AND (actionTypeID = 55) 
    AND (response_required = 1)) 

查詢1將在0秒內加載,但是,查詢2無法返回結果。 where子句中的最後2個和條件中的任何一個都會導致查詢掛起。另外,如果我只有2-5個條件(沒有objectID),它似乎運行速度一樣快。

我需要查詢二來處理所有條件。有任何想法嗎?

感謝,

〜p

編輯:好像第二個查詢,如果的objectID不存在掛起,但如果這樣做,加載沒有問題。

編輯2:我有一個關於actionID的索引,我知道在這種情況下不是非常有用。我目前還沒有能力創建任何其他索引(將它填充到保護數據庫安全)。

我在數據庫的東西非常可怕 - 但是當我從「Displayed Estimated Execution Plan」顯示兩個不同查詢的集羣索引掃描時,我所看到的只是一個稍微不同的謂詞,它與我的謂詞看起來完全相同 - 可能不是正確的執行計劃...

編輯3:執行計劃 - 它們看起來相似,除了條件不存在的地方。此外,如果有結果,我的第二個查詢似乎很快就會運行。如果沒有結果,它會永久運行(除了objectid是201002而不是201006外,還有一個值相同的記錄)。我們還在談論不到4K記錄。

|--Top(TOP EXPRESSION:((1))) 
     |--Clustered Index Scan(OBJECT:([db].[dbo].[Action_History].[PK_Action_History]), 
           WHERE:([db].[dbo].[Action_History].[objectID]=(201002) AND 
             [db].[dbo].[Action_History].[responded_date] IS NULL AND 
             [db].[dbo].[Action_History].[actionTypeID]=(55) AND 
             [db].[dbo].[Action_History].[response_required]=(1) AND 
             [db].[dbo].[Action_History].[object_type]='MyType')) 

編輯4:看起來像我們的第二個數據庫中運行我的第二個查詢(用51K記錄)運行良好。我不知道兩個數據庫之間的區別,關於如何解決這個問題的任何想法?

+0

您的表定義似乎已被截斷,以至於不清楚哪些字段位於主鍵中,您能修復它嗎? – 2010-08-19 19:46:37

+0

已更新,希望對您有所幫助。我的數據庫知識相當有限。 – Prescott 2010-08-19 19:50:34

回答

0

原來一個或多個行被破壞,所以當db掃描到這些行時,它會凍結/循環,或者其他東西。感謝所有的幫助。

1

你有actionTypeID和response_required索引嗎?比較2個查詢

之間的執行計劃要查看執行計劃的文本版本上運行查詢之前以下

SET SHOWPLAN_TEXT ON 
GO 

關閉它後運行執行

SET SHOWPLAN_TEXT OFF 
GO 
+0

僅索引actionid,我比較了「顯示估計執行計劃」,它們看起來很相似,但我可能不知道我在找什麼。它也不會以易於複製和粘貼的方式顯示它...有沒有更好的方法來獲取執行計劃? – Prescott 2010-08-19 19:59:08

+0

運行SET SHOWPLAN_TEXT ON之前運行查詢 – SQLMenace 2010-08-19 20:02:17

+0

謝謝 - 添加。 – Prescott 2010-08-19 20:09:18

1

打開計劃顯示並檢查管理工作室是否提出建議。在這些列上創建索引。

如果這不起作用,請創建CREATE TABLE語句並將其發佈到此處以檢查數據類型和索引。

+0

SSMS會告訴你在哪些列放置索引,不確定,但可能甚至創建腳本。 – 2010-08-19 19:50:17

+0

他在其原始文章中顯示了CREATE表定義。 – JonH 2010-08-19 19:50:43

0

在您希望用於WHERE子句中的條件的任何字段上添加索引,排序或與其他表的關係。

此外,嘗試沒有頂部(1)。如果您只想要第一個結果,您可以排序,但如果這會將結果限制爲1行,則可以在查詢中隱藏錯誤。

+0

我現在無法創建索引,刪除頂部並沒有幫助。 – Prescott 2010-08-19 20:00:43