2014-06-20 35 views
0

查询1运行速度快和不同执行计划使用并行执行计划为不同的参数值

SELECT c.[Date] 
FROM Table1 c 
left join Table2 bec on bec.Col1ID = c.Col1ID and bec.Active = 1 
WHERE c.Active = 1 
AND (c.Col2ID not in (3,4,5,6,7,8,9,10) or c.Col2ID is null) 
and (c.[Date] >= '06/12/2014 02:30:00.000 PM') 

查询2需要更长的时间,并使用正常(串行)执行计划

SELECT c.[Date] 
FROM Table1 c 
left join Table2 bec on bec.Col1ID = c.Col1ID and bec.Active = 1 
WHERE c.Active = 1 
AND (c.Col2ID not in (3,4,5,6,7,8,9,10) or c.Col2ID is null) 
and (c.[Date] >= '06/15/2014 02:30:00.000 PM') 

问题:

  1. Query2正在尝试获取Query1的子集数据,因此Query2应该更快。
  2. 这两个查询只有参数值不同,为什么完全不同的执行计划。

信息有关服务器:这是在SQL Server中运行2008

表结构如下:上表1 非群集上(活动,日期)

TABLE Table1(
     Col1Id [int] IDENTITY(1,1) NOT NULL, 
     Col2Id [int] NULL, 
     Col3 [int] NOT NULL, 
     Col4 [int] NULL, 
     Active [bit] NOT NULL 
     [Date] [datetime] NOT NULL) 

指数

TABLE Table2(
     [Col] [int] NOT NULL, 
     Col1ID [int] NOT NULL, 
     [Col2] [int] NOT NULL, 
     [Col3] [datetime] NOT NULL, 
     [Col4] [int] NOT NULL, 
     [Col5] [datetime] NULL, 
     [Col6] [int] NULL, 
     [Active] [bit] NULL) 

表2上的索引 非集群活动包括(Col,Col1Id)(Col,Col1ID)

对此的任何帮助是值得欢迎的。

+0

您的表格结构将会很有帮助。也是你的索引。 –

+0

我刚刚更新了这个问题,Query1在Parallel中运行并且在Serial中运行Query2。请让我知道是否仍然需要表结构。 – singsuyash

+0

是的。这样我们就不能复制它。 –

回答

1

尝试向Table1索引添加包含的列,并在Table2上创建一个新的索引。另外,请确保统计数据是最新的。

CREATE INDEX idx_Table1_Active_Date ON dbo.Table1 (Active, Date) INCLUDE (Col1Id, Col2Id); 
CREATE INDEX idx_Table2_Col1ID_Active ON dbo.Table2 (Col1ID, Active); 
相关问题