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没有帮助。