使用大表连接缓慢SQL Server搜索过滤器

时间:2016-05-26 16:39:01

标签: sql sql-server-2008 inner-join query-performance

我有一个可供用户使用的产品目录(接近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分钟才能返回结果,罪魁祸首似乎总是那个颜色表。我对所有这些表都有适当的索引,并在产品,产品描述和颜色表上有全文索引。

非常感谢任何帮助!

0 个答案:

没有答案