首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用某些标准的where子句,server 2005似乎要花费很长时间。

使用某些标准的where子句,server 2005似乎要花费很长时间。
EN

Stack Overflow用户
提问于 2010-08-19 19:43:34
回答 4查看 150关注 0票数 0

这是我的表模式

代码语言:javascript
复制
[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:

代码语言:javascript
复制
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:

代码语言:javascript
复制
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的记录。

代码语言:javascript
复制
  |--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记录)上运行的第二个查询一样,运行得很好。我不知道这两个数据库之间的区别,对我如何解决这个问题有什么想法吗?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-08-20 03:24:55

结果显示一个或多个行已损坏,所以当数据库扫描到那些行时,它会冻结/循环,或者其他什么。谢谢大家的帮助。

票数 0
EN

Stack Overflow用户

发布于 2010-08-19 19:45:26

你有actionTypeID和response_required的索引吗?比较两个查询之间的执行计划

若要查看执行计划的文本版本,请在查询之前运行以下命令

代码语言:javascript
复制
SET SHOWPLAN_TEXT ON
GO

在以后运行时关闭它

代码语言:javascript
复制
SET SHOWPLAN_TEXT OFF
GO
票数 1
EN

Stack Overflow用户

发布于 2010-08-19 19:47:47

打开执行计划显示并检查management是否有什么建议。在这些列上创建索引。

如果这没有帮助,请创建create语句并在这里发布,以检查数据类型和索引。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3525604

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档