我在我们的数据库中存储图像时遇到了一些问题。我们目前有大约 40 万条记录,但我预计这会很快增加到数百万条。目前我已经遇到了性能问题,所以这是一个主要问题。在决定使用 SQL Server 存储图像之前,我做了一些研究,我读到的所有内容都表明它能够做到这一点。
我将表格设计得非常简单,包含 3 列...
- Id(主键,唯一标识符,不为空)
- ImageHash(唯一标识符,不为空)
- BinaryImage (varbinary(max), not null)
逻辑是我在我的应用程序代码中生成 ImageHash。图像哈希用于在插入之前进行查找,以查看二进制图像是否已存在于数据库中。其余时间我只是直接使用 Id 查询表。
我正在使用 .NET Entity Framework 来执行我的数据访问。Id 列是在插入时生成的,不确定这是否是最佳实践。
这是我的表的创建脚本。我为 ImageHash 创建了一个索引,但是我对 SQL Server 索引并不是很了解。
CREATE TABLE [dbo].[ImageContent](
[Id] [uniqueidentifier] ROWGUIDCOL NOT NULL,
[ImageHash] [uniqueidentifier] NOT NULL,
[BinaryImage] [varbinary](max) NOT NULL,
CONSTRAINT [PK_ImageData] PRIMARY KEY CLUSTERED
(
[Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = ON, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 80) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
ALTER TABLE [dbo].[ImageContent] ADD CONSTRAINT [DF_ImageData_Id] DEFAULT (newid()) FOR [Id]
还有索引......
CREATE NONCLUSTERED INDEX [ImageHash_Index] ON [dbo].[ImageContent]
(
[ImageHash] ASC
)
INCLUDE ( [Id]) WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
我已经重建了所有索引,但这并没有解决问题。我一直在玩 SQL Server Profiler,并且我确定了导致问题的 SQL 插入(从实体框架生成)。这是带有二进制文件的语句,但我已将其中的大部分内容截断为......这是在 30 秒后超时......
exec sp_executesql N'declare @generated_keys table([Id] uniqueidentifier)
insert [dbo].[ImageContent]([ImageHash], [BinaryImage])
output inserted.[Id] into @generated_keys
values (@0, @1)
select t.[Id]
from @generated_keys as g join [dbo].[ImageContent] as t on g.[Id] = t.[Id]
where @@ROWCOUNT > 0',N'@0 uniqueidentifier,@1 varbinary(max) ',@0='DF76D1FF-5C05-58E0-0933-1ADBCC6345A8',@1=0xFFD8FFE1214545786966000049492A00080000000D00000103...
所以我的问题是...
- 任何人都可以看到我的设置方式存在一些重大问题吗?
- 您有什么建议可以帮助我提高性能吗?
- SQL Server 是否能够以这种方式存储数百万张图像?
在此先感谢您的时间!