或者在WHERE语句中显着减慢了事情

时间:2013-09-11 09:29:55

标签: sql-server tsql stored-procedures

我有以下查询,查找与订单相关的客户。我在客户上有遗留ID,因此我必须检查旧ID(遗留)和客户ID,因此或者声明

SELECT  
   c.Title, 
   c.Name   
  FROM productOrder po   
      INNER JOIN Employee e ON po.BookedBy = e.ID
      CROSS APPLY (
      SELECT TOP 1 *
      FROM Customer c 
      WHERE(po.CustID = c.OldID OR po.CustID = c.CustID)    
      ) c

  GROUP BY     
  c.CustomerId, c.Title, c.FirstName, c.LastName

如果我删除OR语句,它可以在两种情况下正常运行。有一个关于客户ID和遗产的索引。

1 个答案:

答案 0 :(得分:1)

对于表customer,您需要在列oldidcustid上创建单独的索引。如果您已在custid上拥有聚集索引,那么也会在oldid上添加索引:

CREATE INDEX customer_oldid_idx ON customer(oldid);

如果没有此索引,请在此子句中搜索oldid

 WHERE (po.CustID = c.OldID OR po.CustID = c.CustID)

必须使用全表扫描,这将是超慢的。