Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 2005 SQLServer2005似乎永远不会使用某些标准where子句_Sql Server 2005 - Fatal编程技术网

Sql server 2005 SQLServer2005似乎永远不会使用某些标准where子句

Sql server 2005 SQLServer2005似乎永远不会使用某些标准where子句,sql-server-2005,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] [date

这是我的表模式

[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-5个条件(无objectID),它似乎运行得也一样快

我需要查询2来处理所有条件。有什么想法吗

谢谢

~p

Edit:如果objectID不存在,第二个查询似乎会挂起,但如果存在,则加载没有问题

编辑2:我在actionID上有一个索引,我知道这在本例中没有太大帮助。我目前也没有能力创建任何其他索引(将其填充到过度保护的db安全性)

我在db方面非常糟糕-但是当我从“显示的估计执行计划”中为两个不同的查询浏览聚集索引时,我看到的只是一个稍微不同的谓词,它看起来与我的my谓词相同-可能不是正确的执行计划

编辑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'))

edit4:在第二个数据库(有51K记录)上运行我的第二个查询似乎运行得很好。我不知道这两个数据库之间有什么区别,有什么想法吗?

你有关于actionTypeID和response\u的索引吗?比较两个查询之间的执行计划

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

SET SHOWPLAN_TEXT ON
GO
要在以后关闭它,请运行

SET SHOWPLAN_TEXT OFF
GO

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


如果这不起作用,请创建create TABLE语句并将其发布到此处,以检查数据类型和索引。

在WHERE子句、排序或与其他表的关系中要用作条件的任何字段上添加索引


此外,请尝试不使用顶部(1)。如果只需要第一个结果,您可以进行排序,但如果这是将结果限制为一行的原因,它可以隐藏查询中的错误。

结果显示一行或多行已损坏,因此当数据库扫描到这些行时,它会冻结/循环或诸如此类。谢谢大家的帮助。

您的表定义似乎已被截断,因此不清楚主键中有哪些字段,您能修复它吗?已更新,希望能有所帮助。我的数据库知识相当有限。SSMS将告诉您在哪些列上放置索引,不确定,但甚至可能是用于创建的脚本。他在他的原始帖子中显示了创建表定义。仅在actionid上使用索引,我比较了“显示估计的执行计划”,它们看起来很相似,但我可能不知道我在寻找什么。它也不能以一种易于复制和粘贴的方式显示它……有没有更好的方法来获取执行计划?在运行查询之前运行SET SHOWPLAN_TEXT ON此时无法创建索引,删除top没有帮助。