【问题标题】:Filestream column in the WHERE clause locks the serverWHERE 子句中的 Filestream 列锁定服务器
【发布时间】:2012-02-15 19:31:14
【问题描述】:

我在 SQL Server 2008 r2 上的现有数据库中实现了文件流。

现在我有一个非常紧迫的问题,因为我的网站现在实际上已经关闭:

使用这样一个非常简单的表格:

CREATE TABLE [dbo].[Table1](
    [Id] [int] IDENTITY(1,1),
    [rowguid] [uniqueidentifier] ROWGUIDCOL  NOT NULL,
    [Image] [varbinary](max) FILESTREAM NULL,
 CONSTRAINT [PK_Table1] 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],
 CONSTRAINT [Table1RowguidUnique] UNIQUE NONCLUSTERED 
(
    [rowguid] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, 
    ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]
ALTER TABLE [dbo].[Table1] ADD  CONSTRAINT [DF_table1_rowguid]  DEFAULT (newid()) FOR [rowguid]
GO
ALTER TABLE dbo.Table1
SET ( FILESTREAM_ON = fsfg_LiveWebsite )
GO

如果我跑:

select * from Table1 where Id = 1

它运行得非常快并给出正确的结果。 如果我在 where 子句中使用“Varbinary(max) FILESTREAM”字段运行任何内容,则整个表将被锁定。 例如,这两个查询中的任何一个:

select Id from Table1 where Id = 1 and [Image] is null
select Id from Table1 where Id = 1 and [Image] = convert(varbinary(max), 'a')

这可能是什么?

有任何建议请尽快回复!

谢谢

【问题讨论】:

  • 如果您在sys.dm_os_waiting_tasks 被阻止时查看它,等待类型和资源是什么?
  • 在您的网站上实施之前您是否对此进行了测试?另外,我建议您更新问题的术语 - 那是 VARBINARY 列,而不是文件流列。
  • @MartinSmith 如果我在执行时再次查询,dm_os_waiting_tasks 和等待类型会不断变化。这些是他们假设的值:PREEMPTIVE_OS_GETFILESIZE,0/PREEMPTIVE_OS_FILEOPS,0/PREEMPTIVE_OS_CREATEFILE,2/(no results)/PREEMPTIVE_OS_CLOSEHANDLE,0
  • 在执行SELECT * 时应该能够访问列以输出其值对我来说没有任何意义,但在通过它进行过滤时则不能。这绝对正确吗?另外,执行计划如何比较以及上面@AaronBertrand 的评论呢?您似乎在表定义中没有提及FILESTREAM。你能澄清一下吗?
  • 我怀疑第一个(快速)查询实际上是 select Id 而不是 select *...

标签: sql sql-server sql-server-2008 sql-server-2008-r2 filestream


【解决方案1】:

首先,如果您要查询 VARBINARY 列,您需要启用并使用全文搜索。

参考文章。

【讨论】:

  • 在我实现文件流之前它工作正常。我唯一需要的 where 子句是“is null”。我不需要全文搜索提供的任何其他功能。我也总是指定一个唯一的 id,所以它只需要检查一个 varbinary(max)。从我阅读您的文章来看,并没有说启用全文搜索是必要的,或者它会改善我的情况。
  • 你验证过执行计划了吗?我相信 - 在没有设置您的环境的情况下 - 正在发生扫描,因为 VARBINARY 没有被索引,因此使唯一 ID 无关紧要。所以现在扫描在文件系统上。
  • 估计的执行计划没有显示任何有趣的东西(它说 100% 的工作是为了 Pk_Table1。要找到正确的 Id)。然而,这个问题似乎已经自行解决了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-06-02
  • 1970-01-01
  • 1970-01-01
  • 2023-03-27
  • 1970-01-01
  • 2021-05-27
  • 1970-01-01
相关资源
最近更新 更多