这是我的表模式
[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无法返回结果。这最后的2和where子句中的条件都会导致查询挂起。此外,如果我只有2-5条件(没有objectID),它似乎运行得同样快。
我需要查询2来处理所有的条件。有什么想法吗?
谢谢,
~P
编辑:如果不存在,那么第二个查询就会挂起,但如果存在,则没有问题。
编辑2: --我在actionID上只有一个索引,在本例中,我知道这并不是很有帮助。我目前也没有能力创建任何其他索引(将其插入到过保护性的db安全性)。
我在db方面非常糟糕--但是当我从两个不同查询的“显示的估计执行计划”中浏览聚集索引扫描时,我看到的只是一个稍微不同的谓词,它看起来与我的谓词相同--可能不是正确的执行计划.
编辑3:执行计划--除了缺少条件的2之外,它们看起来很相似。此外,如果有结果,我的第二个查询似乎不会在任何时间内运行。如果没有结果,它将永远运行(有一个值相同的记录,除了对象是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-20 03:24:55
结果显示一个或多个行已损坏,所以当数据库扫描到那些行时,它会冻结/循环,或者其他什么。谢谢大家的帮助。
发布于 2010-08-19 19:45:26
你有actionTypeID和response_required的索引吗?比较两个查询之间的执行计划
若要查看执行计划的文本版本,请在查询之前运行以下命令
SET SHOWPLAN_TEXT ON
GO在以后运行时关闭它
SET SHOWPLAN_TEXT OFF
GO发布于 2010-08-19 19:47:47
打开执行计划显示并检查management是否有什么建议。在这些列上创建索引。
如果这没有帮助,请创建create语句并在这里发布,以检查数据类型和索引。
https://stackoverflow.com/questions/3525604
复制相似问题