我这样做尽可能简单,但有时查询需要3秒以上。我正在使用这样的基本参数化查询:
SELECT TextStuff FROM MyInfo WITH (NOLOCK) WHERE MyInfoID=@MyInfoID
有更快的方法吗?如果我将ntext
列转换为nvarchar(MAX)
列,会提高性能吗?
答案 0 :(得分:2)
我会反对一些政治风,并说...
如果您不需要16位Unicode功能,请使用 varchar(MAX)而不是 ntext 。使用varchar(MAX)而不是nvarchar(MAX)会将文本字段的存储和传输时间减半。
如果您严重受网络IO约束(例如:您的“文本字段”在兆字节范围内),您可以考虑使用数据压缩:将文本的压缩版本存储在varbinary(MAX)字段中,而不是文本。因此,通过网络的结果的混洗全部被压缩。在.NET中压缩/解压缩文本相对简单,CPU周期通常很便宜。
(SQL Server 2008的新“压缩”功能在这里确实无济于事......线路上的流量将是相同的。)
答案 1 :(得分:1)
是的,由于描述和分析数据的存储方式不同,您可能会因nvarchar max而获得性能提升here
转移到NVARCHAR MAX的另一个优点是比ntext具有更大的灵活性,而且ntext被弃用而不支持NVARCHAR MAX
与合适的指数相比,绩效的可能改善应该是最小的
修改强> 在谈论执行时间的差异时,这可能是由于高速缓存的执行计划重用/数据被缓存。如果您要尝试通过更改索引或更改数据类型来优化此操作,请确保公平地比较性能以确保不会产生偏差结果。 您可以通过清除执行计划缓存和数据缓存来执行此操作,但不建议在生产服务器上执行此操作:
DBCC DROPCLEANBUFFERS -- Clear data from cache
DBCC FREEPROCCACHE -- Clear plan cache
答案 2 :(得分:0)
您是否对查询进行了分析或分析,以确保文本/ ntext检索是问题?例如,可能是导致表扫描的错误索引。