Sql server 2005似乎永远带有某些标准where子句

时间:2010-08-19 19:43:35

标签: sql-server-2005

这是我的表架构

[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记录)上运行我的第二个查询运行正常。我不知道两个数据库之间的区别,是否有任何关于如何解决这个问题的想法?

4 个答案:

答案 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)

原来一个或多个行被破坏了,所以当数据库扫描到那些行时它会冻结/循环,或者某些东西。谢谢大家的帮助。