Dus*_*ine 0 sql-server performance
我之前使用XML列发布了有关查询速度的问题.经过一些进一步的调查后,我发现它不像以前想的那样使用XML.表模式和查询非常简单.有超过800K的行,一切都运行顺畅,但没有记录的增加,它需要几乎一分钟的运行.
桌子:
/****** Object: Table [dbo].[Audit] Script Date: 08/14/2009 09:49:01 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[Audit](
[ID] [int] IDENTITY(1,1) NOT NULL,
[PID] [int] NOT NULL,
[Page] [int] NOT NULL,
[ObjectID] [int] NOT NULL,
[Data] [nvarchar](max) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL,
[Created] [datetime] NULL,
CONSTRAINT [PK_Audit] PRIMARY KEY CLUSTERED
(
[ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
Run Code Online (Sandbox Code Playgroud)
查询:
SELECT *
FROM Audit
WHERE PID = 158
AND Page = 2
AND ObjectID = 93
Run Code Online (Sandbox Code Playgroud)
查询只返回26条记录,有趣的是,如果我添加"TOP 26",查询将在不到一秒的时间内执行,如果我将其更改为"TOP 27"则需要一分钟.即使我将查询更改为SELECT ID,也没关系.
任何帮助表示赞赏
您有ID索引,但您的查询正在使用其他列.因此,您可能正在进行全表扫描.更改为SELECT ID没有区别,因为它不在WHERE子句中的任何位置.
当你要求TOP 26时它很快,因为它没有任何ORDER BY子句,一旦找到26行就可以退出.将其更改为TOP 27意味着,一旦找到前26个(根据您的帖子,所有匹配),它就无法退出; 它必须继续搜索,直到找到第27个匹配行或到达数据末尾.
一个SHOW PLAN会很快向你展示这个问题.