【发布时间】: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