我正在尝试使用PHP sqlsrv驱动程序为MS SQL运行全文搜索。查询运行速度很慢。 5秒以上可以返回任意数量的行...
查询:
SELECT DISTINCT
MAX(i.ID) AS ID,
i.ItemLookupCode,
MAX(i.DepartmentID) AS DepartmentID,
MAX(i.CategoryID) AS CategoryID,
MAX(i.Quantity) AS Quantity,
MAX(CAST(i.Notes AS varchar(max))) AS Notes,
MAX(CONVERT(varchar(30), i.Price, 1)) AS Price,
MAX(i.SaleType) AS SaleType,
MAX(i.SaleStartDate) AS SaleStartDate,
MAX(i.SaleEndDate) AS SaleEndDate,
MAX(CONVERT(varchar(30), i.SalePrice, 1)) AS SalePrice,
MAX(i.PictureName) AS PictureName,
MAX(n.SpoofStock) AS SpoofStock,
MAX(n.PAM_Brand) AS Brand
FROM Item AS i
LEFT JOIN nitroasl_pamtable AS n
ON i.ID = n.ItemID
WHERE CONTAINS(
(i.ItemLookupCode, i.Notes, i.Description, i.ExtendedDescription),
'"displayport" AND "hdmi"')
OR CONTAINS(
(n.PAM_Brand, n.ManufacturerPartNumber, n.PAM_Keywords),
'"displayport" AND "hdmi"')
AND ( i.WebItem = 1 AND i.Price > 0 )
GROUP BY i.ItemLookupCode
ORDER BY i.ItemLookupCode ASC
思想
我是这个SQL的新手,我只是刚刚学会了全文搜索。它声称在更大的数据库和返回大型结果集时运行速度更快。但是,此查询运行速度非常慢(5秒以上可返回42行)。
我使用Server Management Studio重建了目录索引,并更新了表的统计信息。当查询运行缓慢时,建议这些事情。
最后,我在同一个FullTextCatalog
中列出了两个表。由于这种类型的搜索的一般功能让我感到厌烦,我不确定这是坏事还是好事......为什么我在同一目录中有两个表?我几乎总是在同一个查询中查询这两个表。他们一起持有我们的产品'数据
任何人都可以帮我识别:
应用程序本地托管在IIS,PHP 5.6上,使用SQL Server 2008 R2上运行的3.2 sqlsrv驱动程序(在我们的网络中的服务器上运行)。
更新1
当仅使用CONTAINS((row1,row2,etc), 'hdmi')
时,查询会更快地运行头发,但返回543行?这有什么作用?
更新2
我运行了以下一系列查询来创建我的目录和索引:
use NWCA
create fulltext catalog FullTextCatalog as default
select *
from sys.fulltext_catalogs;
CREATE FULLTEXT INDEX ON on Item(ItemLookupCode, Notes, Description, ExtendedDescription)
KEY INDEX PK_Item;
CREATE FULLTEXT INDEX ON on nitroasl_pamtable(PAM_Brand, ManufacturerPartNumber, PAM_Keywords)
KEY INDEX PK_nitroasl_pamtable;
在确定查询运行速度超慢之后,我找到了解决方案。我发现建议说重建目录会有所帮助;所以我使用SMS UI。
我还读到我可以尝试更新统计信息(请注意,我不知道这些过程是做什么的,因为我不熟悉MS SQL中的全文搜索):
UPDATE STATISTICS Item
GO
所以是的,在听到上述更新后,任何人都有任何想法或启示吗?