在过去,我在查询varbinary(max)列时注意到了糟糕的性能.可以理解,但在检查它是否为空时似乎也会发生,我希望引擎会改为采取一些快捷方式.
select top 100 * from Files where Content is null
我怀疑它很慢,因为它是
>需要将整个二进制文件拉出来,并且
>它没有索引(varbinary不能成为普通索引的一部分)
This question似乎不同意我这里缓慢的前提,但我似乎一次又一次地遇到二进制字段的性能问题.
我想到的一个可能的解决方案是创建一个被索引的计算列:
alter table Files add ContentLength as ISNULL(DATALENGTH(Content),0) persisted CREATE NONCLUSTERED INDEX [IX_Files_ContentLength] ON [dbo].[Files] ( [ContentLength] ASC ) select top 100 * from Files where ContentLength = 0
这是一个有效的策略吗?当涉及二进制字段时,有哪些其他方法可以有效地进行查询?
解决方法
我认为它很慢,因为varbinary列不是(也不能)索引的.因此,您使用计算(和索引)列的方法是有效的.
但是,我会使用ISNULL(DATALENGTH(Content),– 1),以便您可以区分长度0和NULL.或者只使用DATALENGTH(内容).我的意思是,Microsoft SQL Server不是Oracle,其中空字符串与NULL相同.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。