Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server SQL Server 2005 FREETEXT()性能问题_Sql Server_Performance_Tsql_Full Text Search_Freetext - Fatal编程技术网

Sql server SQL Server 2005 FREETEXT()性能问题

Sql server SQL Server 2005 FREETEXT()性能问题,sql-server,performance,tsql,full-text-search,freetext,Sql Server,Performance,Tsql,Full Text Search,Freetext,我有一个关于6-7个联接表的查询,在where中的基表的6列上有一个FREETEXT()谓词 现在,这个查询在过去的一年中运行良好(不到2秒),实际上没有发生变化(我尝试了旧版本,但问题仍然存在) 所以今天,突然之间,同样的查询需要1-1.5分钟 在检查SQL Server 2005中的执行计划、重建该表的全文索引、重新组织全文索引、从头创建索引、重新启动SQL Server服务、重新启动整个服务器之后,我不知道还有什么可以尝试的 我暂时将查询改为使用LIKE,直到我弄明白这一点(现在大约需要6

我有一个关于6-7个联接表的查询,在where中的基表的6列上有一个FREETEXT()谓词

现在,这个查询在过去的一年中运行良好(不到2秒),实际上没有发生变化(我尝试了旧版本,但问题仍然存在)

所以今天,突然之间,同样的查询需要1-1.5分钟

在检查SQL Server 2005中的执行计划、重建该表的全文索引、重新组织全文索引、从头创建索引、重新启动SQL Server服务、重新启动整个服务器之后,我不知道还有什么可以尝试的

我暂时将查询改为使用
LIKE
,直到我弄明白这一点(现在大约需要6秒钟)

当我在查询性能分析器中查看查询时,当我将“FREETEXT”查询与“LIKE”查询进行比较时,前者的读取次数是后者的350倍(4921261对13943),CPU使用量是后者的20倍(38937对1938)

所以它确实是“FREETEXT”谓词导致它如此缓慢

有人知道原因是什么吗?或者我可以做进一步的测试

[编辑]

好的,我只是再次运行查询以获取执行计划,现在再次运行需要2-5秒,没有对其进行任何更改,尽管问题昨天仍然存在。这不是由于任何外部因素造成的,因为我在上周四第一次测试这个问题时已经停止了所有访问数据库的应用程序,所以这不是由于任何其他负载造成的

好吧,我仍然会包括执行计划,尽管现在一切都恢复正常了,这可能不会有多大帮助。。。请注意,这是一个对遗留数据库的巨大查询,我无法更改(即,规范化数据或删除一些不必要的中间表)

好的,这是完整的

我可能得解释一下它到底是干什么的。基本上,它会得到招聘广告的搜索结果,其中有两种类型的广告,高级广告和普通广告。结果分页为每页25个结果,如果足够的话,最上面是10个高级结果,之后是15个普通结果

因此,有两个内部查询根据需要选择尽可能多的高级/普通查询(例如,在第10页,它获取了前100个高级查询和前150个普通查询),然后使用row_number()命令和一些数学运算将这两个查询交错。然后,组合按rownumber排序,并返回查询。在另一个地方使用它,只需获取当前页面所需的25个广告

哦,整个查询是在一个巨大的遗留Coldfusion文件中构建的,由于它一直运行良好,到目前为止,我还不敢尝试/更改大部分内容。。。切勿触摸正在运行的系统等;)只是一些小事情,比如改变中心where子句的部分

该文件还生成了基本相同的其他查询,但没有高级/非高级的区别以及此查询的许多其他变体,因此我始终不确定对其中一个的更改会如何更改其他查询


好吧,由于问题没有再次出现,我给了马丁奖金,因为他是迄今为止最有帮助的人,我不希望奖金无谓地过期。感谢大家的努力,如果这种情况再次发生,我将尝试您的建议:)

此问题可能是由于全文查询返回的结果数的基数估计不正确导致联接操作的策略不正确而导致的

如果您将其分为两个步骤,您如何发现性能

一个新步骤用全文查询的结果填充临时表或表变量,第二个步骤更改现有查询以引用临时表

(注意:您可能希望在查看(A)返回多个结果的自由文本搜索项(B)仅返回少数结果的搜索项的查询计划时,尝试使用和不使用
选项(重新编译)
进行此联接。)

编辑在没有令人不快的查询的情况下,很难准确地澄清,但我的意思是不去做

SELECT <col-list>
FROM --Some 6 table Join
WHERE FREETEXT(...);
选择
FROM--大约6个表联接
其中FREETEXT(…);
它的性能如何

DECLARE @Table TABLE
(
<pk-col-list>
)
INSERT INTO @Table
SELECT PK
FROM YourTable
WHERE FREETEXT(...)

SELECT <col-list>
FROM --Some 6 table Join including onto @Table
OPTION(RECOMPILE)
DECLARE@Table
(
)
插入@Table
选择主键
从你的桌子上
其中FREETEXT(…)
挑选
FROM——大约6个表连接到@table
选项(重新编译)

通常当我们遇到这个问题时,这是因为表碎片和有关索引的陈旧统计信息

下次,尝试在重建/重新索引后执行


有关更多信息,请参阅。

您可以发布执行计划吗?问题可能与Martin提出的思路一致,在这种情况下,使用FORCE-ORDER对查询进行重新排序可能会有所帮助。我假设您使用的是以前有问题的同一个FreeText搜索词,并且数据中没有任何变化(例如归档过程)会突然导致FreeText部分的匹配记录数一夜之间减少?此外,如果您确实设法使问题再次发生,您可以使用Management Studio中的“包含实际执行计划”选项,并将其另存为*.sqlplan(XML格式)?没有存档进程,但某些项的状态设置为3到4,这意味着处于非活动状态(查询仅过滤出状态=3个),并有添加项目的自动导入。因此,这可能是因为目前约有1200个活动条目,而过去几天约有1300个活动条目。但不会从数据库中删除行,如果这是您所说的archiver的意思的话(为了提高性能,我曾经想实现一个archiver,但管理层反对它……想象一下,用户在一个表中提交了9年的内容,大部分是非活动的;)当然XML没有问题。到目前为止,每当我在stackoverflow答案中看到一个执行计划时,它都是纯文本的,所以我想这就是