这是我的表架构
[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上有一个索引,在这种情况下,我知道这个索引并不是非常有用。我目前还没有能力创建任何其他索引(填补保护性数据库安全性)。
我对db的东西非常糟糕 - 但是当我从两个不同的查询的“显示的估计执行计划”中移动到Clustered Index扫描时,我看到的是一个稍微不同的谓词,看起来与我的谓词相同 - 可能不是正确的执行计划...
编辑3:执行计划 - 它们看起来很相似,除了缺少条件的2。此外,如果有结果,我的第二个查询似乎在没有时间运行。如果没有结果它将永远运行(除了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 :(得分:1)
你有关于actionTypeID和response_required的索引吗?比较2个查询之间的执行计划
要查看执行计划的文本版本,请在查询
之前运行以下命令SET SHOWPLAN_TEXT ON
GO
以后关闭它
SET SHOWPLAN_TEXT OFF
GO
答案 1 :(得分:1)
启用执行计划显示并检查管理工作室是否在建议。在这些列上创建索引。
如果这没有帮助,请创建CREATE TABLE语句并在此处发布以检查数据类型和索引。
答案 2 :(得分:0)
在要用于WHERE子句中的条件,排序或与其他表的关系的任何字段上添加索引。
另外,尝试没有顶部(1)。您可以排序,如果您只想要第一个结果,但它可以隐藏查询中的错误,如果这是将结果限制为1行。
答案 3 :(得分:0)
原来一个或多个行被破坏了,所以当数据库扫描到那些行时它会冻结/循环,或者某些东西。谢谢大家的帮助。