2013-01-23 20 views
1

我有一张名为Photos的表格。它有3000多行,包括一个名为Photo的image类型字段。Mystery:SQL查询挂起DataLength()条件

此查询运行瞬间:

Select PhotoFileName, DATALENGTH(Photo) 
From Photos 
Order by DATALENGTH(Photo) 

这个查询间歇挂起(有时需要几分钟来完成,在完成一次在此之后,立即运行)。

Select PhotoFileName, DATALENGTH(Photo) 
From Photos 
Where DATALENGTH(Photo)>0 

同样的,这个查询:

Select PhotoFileName, DATALENGTH(Photo) 
From Photos 
Where Photo is not NULL 

怎么可能被回事?

+0

执行计划是什么样的?为慢速和快速版本输出'set statistics io on'?当慢查询在'sys.dm_os_waiting_tasks'中运行任何等待类型? –

+0

当查询需要几分钟时间时,在另一个查询窗口中,从sys.dm_exec_requests中检查session_id等待的内容。 –

+0

也许你发现这个“固定”/“关闭,因为不会修复”亲吻表亲微软连接项目:[与varbinary最大写入存储过程和DATALENGTH无限期运行](http://connect.microsoft.com/SQLServer/反馈/信息/ 642077 /存储过程与 - VARBINARY-MAX-写和数据长度 - 运行 - 无限期#)。 – HABO

回答

0

我不知道为什么会看到这个问题,但我认为你可以通过添加一个computed column表来保存照片的长度,也许对新列的索引捆绑解决这个问题。

+0

实际上有一个计算列'[Photo_DataLength] AS(isnull(datalength([Photo]),(0)))PERSISTED NOT NULL'。无论标准是指“Photo_DataLength”还是“DATALENGTH(照片)”,我们都会得到相同的结果。 –

+0

@Herb你可以更具体一些:当你引用SELECT列表中的计算列,where子句或两者?计算列是否索引? –

+0

计算列未编入索引。在SELECT列表中有DATALENGTH(Photo)或Photo_DataLength没有区别 - 它在WHERE子句中导致查询挂起。 –