我有一个查询,涉及6-7个联接表,在where子句中基础表的6列上使用FREETEXT()谓词。过去一年里,这个查询工作得很好(不到2秒),并且实际上一直没有改变过(我尝试了旧版本,问题仍然存在)。但是今天,同样的查询突然需要大约1-1.5分钟的时间。
在检查SQL Server 2005中的执行计划、重建该表的FULLTEXT索引、重新组织FULLTEXT索引、从头创建索引、重新启动SQL Server服务和整个服务器之后,我不知道还能尝试什么。
我暂时将查询切换为使用LIKE,直到我解决这个问题(现在需要大约6秒)。
当我在查询性能分析器中查看查询时,将“FREETEXT”查询与“LIKE”查询进行比较时,前者的读取次数是后者的350倍(4921261 vs. 13943),CPU使用率是后者的20倍(38937 vs. 1938)。
所以确实是“FREETEXT”谓词导致它变得如此缓慢。
因此,有两个内部查询会选择所需数量的高级/普通广告(例如,在第10页上,它会获取前100个高级广告和前150个普通广告),然后这两个查询与 row_number() 命令和一些数学运算相间。然后根据行号对组合进行排序,并返回查询结果。嗯,它还在另一个地方用于仅获取当前页面所需的25个广告。
哦,整个查询都是在一个巨大的遗留 Coldfusion 文件中构建的,由于一直运行良好,我到目前为止还没有敢大规模更改...永远不要碰已经运行良好的系统等。只是像更改中心 where 子句的一些小东西。
该文件还生成其他查询,这些查询基本上都是相同的,但没有高级/非高级区别,而且还有很多其他变体的这个查询,因此我从未确信对其中之一的更改可能会如何影响其他查询...
在检查SQL Server 2005中的执行计划、重建该表的FULLTEXT索引、重新组织FULLTEXT索引、从头创建索引、重新启动SQL Server服务和整个服务器之后,我不知道还能尝试什么。
我暂时将查询切换为使用LIKE,直到我解决这个问题(现在需要大约6秒)。
当我在查询性能分析器中查看查询时,将“FREETEXT”查询与“LIKE”查询进行比较时,前者的读取次数是后者的350倍(4921261 vs. 13943),CPU使用率是后者的20倍(38937 vs. 1938)。
所以确实是“FREETEXT”谓词导致它变得如此缓慢。
有人知道问题的原因吗?或者我还可以做哪些进一步的测试?
[编辑]
好的,我刚刚再次运行查询以获取执行计划,现在它又需要2-5秒才能完成,尽管没有对其进行任何更改,但昨天仍存在问题。并且这不是由于任何外部因素引起的,因为我在上周四首次测试问题时停止了所有访问数据库的应用程序,所以这不是由于任何其他负载引起的。
好的,我仍将包括执行计划,尽管现在一切都正常可能帮助不大...请注意,这是针对我无法更改的旧数据库的巨大查询(即规范数据或摆脱一些不必要的中间表)
好的,这里是完整的查询
我可能需要解释一下它究竟是做什么的。基本上,它会获取工作广告的搜索结果,其中有两种类型的广告,高级广告和普通广告。结果分页为每页25个结果,前面有10个高级广告,然后是15个普通广告(如果有足够的话)。因此,有两个内部查询会选择所需数量的高级/普通广告(例如,在第10页上,它会获取前100个高级广告和前150个普通广告),然后这两个查询与 row_number() 命令和一些数学运算相间。然后根据行号对组合进行排序,并返回查询结果。嗯,它还在另一个地方用于仅获取当前页面所需的25个广告。
哦,整个查询都是在一个巨大的遗留 Coldfusion 文件中构建的,由于一直运行良好,我到目前为止还没有敢大规模更改...永远不要碰已经运行良好的系统等。只是像更改中心 where 子句的一些小东西。
该文件还生成其他查询,这些查询基本上都是相同的,但没有高级/非高级区别,而且还有很多其他变体的这个查询,因此我从未确信对其中之一的更改可能会如何影响其他查询...
好的,由于问题没有再次出现,我授予马丁赏金,因为他到目前为止是最有帮助的,我不想白白浪费赏金。感谢其他人的努力,如果问题再次发生,我会尝试你们的建议 :)