【问题标题】:SQL Server speedSQL Server 速度
【发布时间】:2009-08-14 19:40:33
【问题描述】:

我之前发布过一个关于我使用 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]

查询:

SELECT *
FROM Audit
WHERE PID = 158
AND Page = 2
AND ObjectID = 93

查询只返回 26 条记录,有趣的是,如果我添加“TOP 26”,查询将在不到一秒的时间内执行,如果我将其更改为“TOP 27”,则需要一分钟。即使我将查询更改为 SELECT ID,也没关系。

感谢任何帮助

【问题讨论】:

    标签: sql-server performance


    【解决方案1】:

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

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

    展示计划会很快向您展示问题。

    【讨论】:

    • 关于为什么 TOP 27 需要更长时间的信息。我没想到。
    【解决方案2】:

    为 PID、Page 和 ObjectID 字段添加索引。

    【讨论】:

      【解决方案3】:

      为什么不为 Page 和 Object ID 列添加一个覆盖索引,然后就这样结束了?

      【讨论】:

      • 是的,对不起 :) 您应该索引 where 子句中出现的任何内容。我没有列出 PID,因为我把它误读为 ID,它是主键并且已经有一个索引。
      【解决方案4】:

      我认为您必须为要搜索的列添加非唯一索引。索引肯定会减少搜索时间。在 SELECT 查询中请求单列或多列不会有任何区别。需要通过索引来减少单独比较行所需的时间。

      【讨论】:

        【解决方案5】:

        这 26 行可能在表的开头附近,当您扫描时您会发现它们很快并中止其余的扫描,当您查找不存在的第 27 行时,您会扫描整个表,这很慢!

        在查找此类问题时,请从查询管理工作室尝试以下操作:

        运行:_SET SHOWPLAN_ALL ON_
        然后运行你的查询,寻找“SCAN”这个词,它们很可能是你的查询运行缓慢的地方,找出为什么没有使用索引。

        在这种情况下,您需要添加一个索引。我通常根据查询数据的方式添加索引,如果您始终拥有以下三个中的一个:PID、页面和对象 ID,请先添加该列的索引,如果您有时具有该值,则将另一列添加到该索引也。等等

        【讨论】:

          猜你喜欢
          • 2012-06-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-04-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多