這裏是我的表架構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記錄)運行良好。我不知道兩個數據庫之間的區別,關於如何解決這個問題的任何想法?
您的表定義似乎已被截斷,以至於不清楚哪些字段位於主鍵中,您能修復它嗎? – 2010-08-19 19:46:37
已更新,希望對您有所幫助。我的數據庫知識相當有限。 – Prescott 2010-08-19 19:50:34