SQL Server 2008查询计划警告“No Join Predicate”,查询需要很长时间

时间:2014-02-08 01:09:06

标签: sql sql-server-2008 join

这是我的SQL

select DISTINCT d.* from Device d, Company c1 
WHERE 

EXISTS ( select * from (SELECT * FROM [dbo].[Split] ('HENNEPIN COUNTY MN', ',')) as s     
        WHERE c1.CompanyName like '%' + s.items + '%' AND d.CustomerID  c1.CompanyID)
OR  
EXISTS ( select * from (SELECT * FROM [dbo].[Split] ('HENNEPIN COUNTY MN', ',')) as s     
        WHERE d.CustomerName like '%' + s.items + '%')

在排序方面,它将OR误解为笛卡尔积,你可以在这里阅读:http://www.scarydba.com/2009/09/15/no-join-predicate/

有什么方法可以避免这种情况吗?

1 个答案:

答案 0 :(得分:3)

你在说

select DISTINCT d.* from Device d, Company c1 

但您没有以任何方式加入DeviceCompany。因此,您将获得从Device配对到Company的每条记录的每条记录,并获得Device次记录的记录数量Company返回的记录数。

由于您只是从Device返回字段,因此难怪您需要DISTINCT并且难怪它花了这么长时间。

如果这是您真正想要的,您可以使用CROSS JOIN操作删除该消息:

select d.*
from   Device d
   CROSS JOIN Company c1

有关CROSS JOIN操作的更多信息,请参阅here

但我们可以加快速度。试试这个:

 ;
 WITH s AS (
    SELECT *
    FROM   [dbo].[Split] ('HENNEPIN COUNTY MN', ',') s
 )  
 SELECT  d.*
 FROM    Device d
 WHERE   EXISTS ( 
            select * 
            from   s
                JOIN Companies c1
                   ON c1.CompanyName like '%' + s.items + '%' 
           where d.CustomerID = c1.CompanyID
        )
    OR  EXISTS (
           select  *
           from    S
           where   d.CustomerName like '%' + s.items + '%'
        )

这可能会进一步改善,但鉴于我不确定这个查询试图解决什么问题,这是我现在能做的最好的事情。