考虑有点重的数据库

hin*_*531 1 performance sql-server sql-server-2012 query-performance

环境信息

  • 操作系统:Windows Server 2012 R2(64 位)
  • 内存:16.00GB
  • CPU : Intel(R) Xeon(R) CPU E5-2609 @ 2.40GHz
  • SQL:Windows SQL Server 2012 标准版

简要数据库数据信息

  • 10多张表中,其中一张有varbinary(max)类型的列
  • 该表有超过1m的记录,每列都有缩略图数据,大约占20k

简表规格

  • 表名:注册缩略图
  • 列名:UserId、ThumbData、已创建、已更新
  • 列类型:int、varbinarymax、datetime、datetime
  • 已用空间信息:行:1,034,300 | 保留:34,092,160 KB | 数据:34,054,872 KB | 索引大小:31040 KB | 未使用:6248 KB

询问

SELECT * FROM RegisteredThumbnail WHERE UserId = 512315
Run Code Online (Sandbox Code Playgroud)

此查询需要大约 6:45 分钟才能获取预期的行。

为了克服这个问题,索引是我唯一的选择吗?

通过将二进制数据替换为图像 url 作为字符串数据来更改图像数据的存储方式会有很大帮助吗?

由于这是当前的操作系统,因此更改列并不是一个好主意。

任何想法将不胜感激。

尚未配置索引。

geo*_*tnz 7

该表应该在 上有一个聚集索引UserId。如果每个用户的缩略图不超过一个,则聚集索引可以作为主键。

由于您说您在 SQLServer 2012 标准版上有一个当前正在运行的系统,因此无法在线构建索引。您可以等待低活动期来创建索引,或者创建一个新表,将数据迁移到其中,然后切换到使用新表。

理想情况下,该表应如下所示:

CREATE TABLE RegisteredThumbnail
(
    UserId       INT            NOT NULL,
    ThumbData    VARBINARY(MAX) NOT NULL,
    Created      DATETIME2(7)   NOT NULL,
    Updated      DATETIME2(7)   NULL,

    CONSTRAINT PK_RegisteredThumbnail PRIMARY KEY CLUSTERED (UserId ASC)
)
Run Code Online (Sandbox Code Playgroud)

由于您无法重新创建表,这是您需要创建的索引:

CREATE INDEX IX_RegisteredThumbnail_UserId
ON RegisteredThumbnail(UserID ASC)
Run Code Online (Sandbox Code Playgroud)

由于您使用的是 2012 标准版,这将是一个“离线”操作——它会在构建索引时阻止此表上的活动。鉴于它只有一百万行,构建它应该不会花费太长时间,但是它确实必须扫描表才能执行此操作,因此您将受到它读取数据的速度的限制。