SQL Server速度

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,也没关系.

任何帮助表示赞赏

Ken*_*ite 6

您有ID索引,但您的查询正在使用其他列.因此,您可能正在进行全表扫描.更改为SELECT ID没有区别,因为它不在WHERE子句中的任何位置.

当你要求TOP 26时它很快,因为它没有任何ORDER BY子句,一旦找到26行就可以退出.将其更改为TOP 27意味着,一旦找到前26个(根据您的帖子,所有匹配),它就无法退出; 它必须继续搜索,直到找到第27个匹配行或到达数据末尾.

一个SHOW PLAN会很快向你展示这个问题.