我有一个可供用户使用的产品目录(接近1000种产品)。这些产品属于类别和子类别,有颜色,价格等。我希望用户能够根据某些标准过滤此目录的结果。这个过滤条件中的一些是关键词(即找到一支蓝色笔)。但是,当我加入一个大表来搜索此查询时,特别是我的colors表时,我遇到了性能问题。这是我的疑问:
DECLARE @keyword nvarchar(100)
SET @keyword = 'bag'
SELECT DISTINCT
SP.pk_storeProductID,
dbo.getMaxPrice(SP.pk_storeProductID) AS maxPrice
FROM
tblProduct P
INNER JOIN
tblStoreProduct SP ON P.pk_productID = SP.fk_productID
INNER JOIN
tblProductDescription PD ON P.pk_productID = PD.fk_productID
INNER JOIN
tblProductSubCategory PSC ON SP.pk_storeProductID = PSC.fk_productID
INNER JOIN
tblSubCategory SC ON PSC.fk_subCategoryID = SC.pk_subCategoryID
INNER JOIN
tblCategory C ON SC.fk_categoryID = C.pk_categoryID
LEFT OUTER JOIN
tblProductImprint PI ON P.pk_productID = PI.fk_productID
LEFT OUTER JOIN
tblProductColor PC ON P.pk_productID = PC.fk_productID
LEFT OUTER JOIN
tblColor COL ON PC.fk_colorID = COL.pk_colorID
WHERE
P.blnActive = 1
AND SP.blnStoreActive = 1
AND SC.blnActive = 1
AND C.blnActive = 1
AND C.blnLocked = 0
AND SP.fk_storeID = 74
AND 1 = CASE WHEN CONTAINS(P.productNumber, @keyword) THEN 1
WHEN CONTAINS(P.productName, @keyword) THEN 1
WHEN CONTAINS(PD.productDesc, @keyword) THEN 1
WHEN CONTAINS(PD.keywords, @keyword) THEN 1
ELSE 0
END
当我加入tblColor时,查询似乎显着陷入困境。我的系统处理产品颜色的方式是通过三个表:产品表,产品颜色表(只是产品ID和颜色ID的两个外键),以及仅用于颜色的表(具有颜色的主键和颜色的名称)。该表中有13,144行。我需要加入这个表,以便根据用户输入搜索关键字的颜色名称(这在上面的查询中没有显示)。此外,产品可能没有与之相关的颜色,但我不想将其排除在结果之外,因此我在颜色表上进行左外连接。
有更有效的方法吗?就像现在一样,简单的搜索最多可能需要4分钟才能返回结果,罪魁祸首似乎总是那个颜色表。我对所有这些表都有适当的索引,并在产品,产品描述和颜色表上有全文索引。
非常感谢任何帮助!