Please start any new threads on our new 
    site at https://forums.sqlteam.com.  We've got lots of great SQL Server
    experts to answer whatever question you can come up with. 
    
        
            
                
                    
                        
                            
                                | Author | 
                                
                                 Topic  | 
                             
                            
                                    | 
                                         ferrethouse 
                                        Constraint Violating Yak Guru 
                                         
                                        
                                        352 Posts  | 
                                        
                                        
                                            
                                            
                                             Posted - 2014-12-11 : 10:53:55
                                            
  | 
                                             
                                            
                                            I'm getting poor performance with the query below due to an index scan on a subscription table index since it is joining on 2 different tables. The activity table does have a courseid but apparently it is not 100% reliable thus the need to join with the lesson table. The query takes over 15 seconds and it won't seek on the index I've created. Any solutions?select count(*) from Activity                     where exists                     (                          select null from Activity a                          INNER JOIN Lessons l on l.LessonID = a.LessonID                          INNER JOIN Subscription s ON l.CourseId = s.CourseId AND a.StudentsID = s.StudentsID                          INNER JOIN Courses c ON a.CourseId = c.CourseId                          where ClientID = 1008 AND c.Type IN (0,1,2) AND Activity.ActivityID = a.ActivityID                     )  | 
                                             
                                         
                                     | 
                             
       
                            
                       
                          
                            
                                    | 
                                     gbritton 
                                    Master Smack Fu Yak Hacker 
                                     
                                    
                                    2780 Posts  | 
                                    
                                      
                                        
                                          
                                           
                                            Posted - 2014-12-11 : 12:08:01
                                          
  | 
                                         
                                        
                                          | It's not because "it is joining on 2 different tables", it's because the join columns are the columns in the where clause are not covered.  Or it could be that the subscription table is really small and SQL figured that was easiest.  | 
                                         
                                        
                                            | 
                                         
                                       
                                     | 
                                   
                            
                       
                          
                            
                                    | 
                                     tkizer 
                                    Almighty SQL Goddess 
                                     
                                    
                                    38200 Posts  | 
                                    
                                      
                                        
                                          
                                           
                                            Posted - 2014-12-11 : 12:31:49
                                          
  | 
                                         
                                        
                                          | We've got stored procedures with 10+ joins in them and no issue with performance. Like gbritton said, it is not because of the joins.Show us the showplan xml for it and the indexes on those tables. You likely need to add a covering index.Tara KizerSQL Server MVP since 2007http://weblogs.sqlteam.com/tarad/  | 
                                         
                                        
                                            | 
                                         
                                       
                                     | 
                                   
                            
                       
                          
                            
                                    | 
                                     ferrethouse 
                                    Constraint Violating Yak Guru 
                                     
                                    
                                    352 Posts  | 
                                    
                                      
                                        
                                          
                                           
                                            Posted - 2014-12-11 : 18:59:44
                                          
  | 
                                         
                                        
                                          quote: Originally posted by tkizer We've got stored procedures with 10+ joins in them and no issue with performance. Like gbritton said, it is not because of the joins.
  To clarify, I wasn't referring to the number of inner joins but the fact that one of the inner joins is "ON" two separate tables which causes an index scan...INNER JOIN Subscription s ON l.CourseId = s.CourseId AND a.StudentsID = s.StudentsIDIf I change this line to...INNER JOIN Subscription s ON a.CourseId = s.CourseId AND a.StudentsID = s.StudentsIDThe query is very fast because it does a seek on the index. Sadly, the courseid from the activity table is not reliable.The subscription table has 30 million records in it.Here is the plan...<?xml version="1.0" encoding="utf-16"?><ShowPlanXML xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" Version="1.2" Build="12.0.2000.8" xmlns="http://schemas.microsoft.com/sqlserver/2004/07/showplan">  <BatchSequence>    <Batch>      <Statements>        <StmtSimple StatementCompId="1" StatementEstRows="1" StatementId="1" StatementOptmLevel="FULL" CardinalityEstimationModelVersion="120" StatementSubTreeCost="250.728" StatementText="select count(*) from Activity#xD;#xA;                     where exists#xD;#xA;                     (#xD;#xA;                          select null from Activity a#xD;#xA;                          INNER JOIN Lessons l on l.LessonID = a.LessonID#xD;#xA;                          INNER JOIN Subscription s ON l.CourseId = s.CourseId AND a.StudentsID = s.StudentsID#xD;#xA;                          INNER JOIN Courses c ON a.CourseId = c.CourseId#xD;#xA;                          where ClientID = 1008 AND c.Type IN (0,1,2) AND Activity.ActivityID = a.ActivityID#xD;#xA;                     )" StatementType="SELECT" QueryHash="0x1A9F9DD06D0894B0" QueryPlanHash="0xB72AF803A8D6264D" RetrievedFromCache="false">          <StatementSetOptions ANSI_NULLS="true" ANSI_PADDING="true" ANSI_WARNINGS="true" ARITHABORT="true" CONCAT_NULL_YIELDS_NULL="true" NUMERIC_ROUNDABORT="false" QUOTED_IDENTIFIER="true" />          <QueryPlan DegreeOfParallelism="1" MemoryGrant="86376" CachedPlanSize="104" CompileTime="66" CompileCPU="63" CompileMemory="1752">            <MemoryGrantInfo SerialRequiredMemory="3072" SerialDesiredMemory="86376" RequiredMemory="3072" DesiredMemory="86376" RequestedMemory="86376" GrantWaitTime="0" GrantedMemory="86376" MaxUsedMemory="2904" />            <OptimizerHardwareDependentProperties EstimatedAvailableMemoryGrant="393206" EstimatedPagesCached="98301" EstimatedAvailableDegreeOfParallelism="2" />            <RelOp AvgRowSize="11" EstimateCPU="0.00251754" EstimateIO="0" EstimateRebinds="0" EstimateRewinds="0" EstimatedExecutionMode="Row" EstimateRows="1" LogicalOp="Compute Scalar" NodeId="0" Parallel="false" PhysicalOp="Compute Scalar" EstimatedTotalSubtreeCost="250.728">              <OutputList>                <ColumnReference Column="Expr1007" />              </OutputList>              <ComputeScalar>                <DefinedValues>                  <DefinedValue>                    <ColumnReference Column="Expr1007" />                    <ScalarOperator ScalarString="CONVERT_IMPLICIT(int,[Expr1012],0)">                      <Convert DataType="int" Style="0" Implicit="true">                        <ScalarOperator>                          <Identifier>                            <ColumnReference Column="Expr1012" />                          </Identifier>                        </ScalarOperator>                      </Convert>                    </ScalarOperator>                  </DefinedValue>                </DefinedValues>                <RelOp AvgRowSize="11" EstimateCPU="0.00251754" EstimateIO="0" EstimateRebinds="0" EstimateRewinds="0" EstimatedExecutionMode="Row" EstimateRows="1" LogicalOp="Aggregate" NodeId="1" Parallel="false" PhysicalOp="Stream Aggregate" EstimatedTotalSubtreeCost="250.728">                  <OutputList>                    <ColumnReference Column="Expr1012" />                  </OutputList>                  <RunTimeInformation>                    <RunTimeCountersPerThread Thread="0" ActualRows="1" ActualEndOfScans="1" ActualExecutions="1" />                  </RunTimeInformation>                  <StreamAggregate>                    <DefinedValues>                      <DefinedValue>                        <ColumnReference Column="Expr1012" />                        <ScalarOperator ScalarString="Count(*)">                          <Aggregate AggType="countstar" Distinct="false" />                        </ScalarOperator>                      </DefinedValue>                    </DefinedValues>                    <RelOp AvgRowSize="9" EstimateCPU="0.0810578" EstimateIO="0" EstimateRebinds="0" EstimateRewinds="0" EstimatedExecutionMode="Row" EstimateRows="4195.07" LogicalOp="Aggregate" NodeId="2" Parallel="false" PhysicalOp="Hash Match" EstimatedTotalSubtreeCost="250.726">                      <OutputList />                      <MemoryFractions Input="0.0071065" Output="1" />                      <RunTimeInformation>                        <RunTimeCountersPerThread Thread="0" ActualRows="1807" ActualEndOfScans="1" ActualExecutions="1" />                      </RunTimeInformation>                      <Hash>                        <DefinedValues />                        <HashKeysBuild>                          <ColumnReference Database="[Absorb_20141202]" Schema="[dbo]" Table="[Activity]" Column="ActivityID" />                        </HashKeysBuild>                        <RelOp AvgRowSize="11" EstimateCPU="0.0175354" EstimateIO="0" EstimateRebinds="0" EstimateRewinds="0" EstimatedExecutionMode="Row" EstimateRows="4195.07" LogicalOp="Inner Join" NodeId="3" Parallel="false" PhysicalOp="Nested Loops" EstimatedTotalSubtreeCost="250.645">                          <OutputList>                            <ColumnReference Database="[Absorb_20141202]" Schema="[dbo]" Table="[Activity]" Column="ActivityID" />                          </OutputList>                          <RunTimeInformation>                            <RunTimeCountersPerThread Thread="0" ActualRows="1807" ActualEndOfScans="1" ActualExecutions="1" />                          </RunTimeInformation>                          <NestedLoops Optimized="true" WithUnorderedPrefetch="true">                            <OuterReferences>                              <ColumnReference Database="[Absorb_20141202]" Schema="[dbo]" Table="[Activity]" Alias="[a]" Column="ActivityID" />                              <ColumnReference Column="Expr1011" />                            </OuterReferences>                            <RelOp AvgRowSize="11" EstimateCPU="59.942" EstimateIO="1.31272" EstimateRebinds="0" EstimateRewinds="0" EstimatedExecutionMode="Row" EstimateRows="4195.07" LogicalOp="Inner Join" NodeId="6" Parallel="false" PhysicalOp="Merge Join" EstimatedTotalSubtreeCost="236.863">                              <OutputList>                                <ColumnReference Database="[Absorb_20141202]" Schema="[dbo]" Table="[Activity]" Alias="[a]" Column="ActivityID" />                              </OutputList>                              <RunTimeInformation>                                <RunTimeCountersPerThread Thread="0" ActualRows="1807" ActualEndOfScans="1" ActualExecutions="1" />                              </RunTimeInformation>                              <Merge ManyToMany="true">                                <InnerSideJoinColumns>                                  <ColumnReference Database="[Absorb_20141202]" Schema="[dbo]" Table="[Subscription]" Alias="[s]" Column="StudentsID" />                                  <ColumnReference Database="[Absorb_20141202]" Schema="[dbo]" Table="[Subscription]" Alias="[s]" Column="CourseID" />                                </InnerSideJoinColumns>                                <OuterSideJoinColumns>                                  <ColumnReference Database="[Absorb_20141202]" Schema="[dbo]" Table="[Activity]" Alias="[a]" Column="StudentsID" />                                  <ColumnReference Database="[Absorb_20141202]" Schema="[dbo]" Table="[Lessons]" Alias="[l]" Column="CourseID" />                                </OuterSideJoinColumns>                                <Residual>                                  <ScalarOperator ScalarString="[Absorb_20141202].[dbo].[Lessons].[CourseID] as [l].[CourseID]=[Absorb_20141202].[dbo].[Subscription].[CourseID] as [s].[CourseID] AND [Absorb_20141202].[dbo].[Activity].[StudentsID] as [a].[StudentsID]=[Absorb_20141202].[dbo].[Subscription].[StudentsID] as [s].[StudentsID]">                                    <Logical Operation="AND">                                      <ScalarOperator>                                        <Compare CompareOp="EQ">                                          <ScalarOperator>                                            <Identifier>                                              <ColumnReference Database="[Absorb_20141202]" Schema="[dbo]" Table="[Lessons]" Alias="[l]" Column="CourseID" />                                            </Identifier>                                          </ScalarOperator>                                          <ScalarOperator>                                            <Identifier>                                              <ColumnReference Database="[Absorb_20141202]" Schema="[dbo]" Table="[Subscription]" Alias="[s]" Column="CourseID" />                                            </Identifier>                                          </ScalarOperator>                                        </Compare>                                      </ScalarOperator>                                      <ScalarOperator>                                        <Compare CompareOp="EQ">                                          <ScalarOperator>                                            <Identifier>                                              <ColumnReference Database="[Absorb_20141202]" Schema="[dbo]" Table="[Activity]" Alias="[a]" Column="StudentsID" />                                            </Identifier>                                          </ScalarOperator>                                          <ScalarOperator>                                            <Identifier>                                              <ColumnReference Database="[Absorb_20141202]" Schema="[dbo]" Table="[Subscription]" Alias="[s]" Column="StudentsID" />                                            </Identifier>                                          </ScalarOperator>                                        </Compare>                                      </ScalarOperator>                                    </Logical>                                  </ScalarOperator>                                </Residual>                                <RelOp AvgRowSize="19" EstimateCPU="24.9562" EstimateIO="0.0112613" EstimateRebinds="0" EstimateRewinds="0" EstimatedExecutionMode="Row" EstimateRows="298914" LogicalOp="Sort" NodeId="7" Parallel="false" PhysicalOp="Sort" EstimatedTotalSubtreeCost="38.9902">                                  <OutputList>                                    <ColumnReference Database="[Absorb_20141202]" Schema="[dbo]" Table="[Activity]" Alias="[a]" Column="ActivityID" />                                    <ColumnReference Database="[Absorb_20141202]" Schema="[dbo]" Table="[Activity]" Alias="[a]" Column="StudentsID" />                                    <ColumnReference Database="[Absorb_20141202]" Schema="[dbo]" Table="[Lessons]" Alias="[l]" Column="CourseID" />                                  </OutputList>                                  <MemoryFractions Input="0.262518" Output="0.987708" />                                  <RunTimeInformation>                                    <RunTimeCountersPerThread Thread="0" ActualRebinds="1" ActualRewinds="0" ActualRows="1813" ActualEndOfScans="1" ActualExecutions="1" />                                  </RunTimeInformation>                                  <Sort Distinct="false">                                    <OrderBy>                                      <OrderByColumn Ascending="true">                                        <ColumnReference Database="[Absorb_20141202]" Schema="[dbo]" Table="[Activity]" Alias="[a]" Column="StudentsID" />                                      </OrderByColumn>                                      <OrderByColumn Ascending="true">                                        <ColumnReference Database="[Absorb_20141202]" Schema="[dbo]" Table="[Lessons]" Alias="[l]" Column="CourseID" />                                      </OrderByColumn>                                    </OrderBy>                                    <RelOp AvgRowSize="19" EstimateCPU="9.04467" EstimateIO="0" EstimateRebinds="0" EstimateRewinds="0" EstimatedExecutionMode="Row" EstimateRows="298914" LogicalOp="Inner Join" NodeId="8" Parallel="false" PhysicalOp="Hash Match" EstimatedTotalSubtreeCost="14.0227">                                      <OutputList>                                        <ColumnReference Database="[Absorb_20141202]" Schema="[dbo]" Table="[Activity]" Alias="[a]" Column="ActivityID" />                                        <ColumnReference Database="[Absorb_20141202]" Schema="[dbo]" Table="[Activity]" Alias="[a]" Column="StudentsID" />                                        <ColumnReference Database="[Absorb_20141202]" Schema="[dbo]" Table="[Lessons]" Alias="[l]" Column="CourseID" />                                      </OutputList>                                      <MemoryFractions Input="0.999473" Output="0.737482" />                                      <RunTimeInformation>                                        <RunTimeCountersPerThread Thread="0" ActualRows="1813" ActualEndOfScans="1" ActualExecutions="1" />                                      </RunTimeInformation>                                      <Hash>                                        <DefinedValues />                                        <HashKeysBuild>                                          <ColumnReference Database="[Absorb_20141202]" Schema="[dbo]" Table="[Activity]" Alias="[a]" Column="LessonID" />                                        </HashKeysBuild>                                        <HashKeysProbe>                                          <ColumnReference Database="[Absorb_20141202]" Schema="[dbo]" Table="[Lessons]" Alias="[l]" Column="LessonID" />                                        </HashKeysProbe>                                        <ProbeResidual>                                          <ScalarOperator ScalarString="[Absorb_20141202].[dbo].[Lessons].[LessonID] as [l].[LessonID]=[Absorb_20141202].[dbo].[Activity].[LessonID] as [a].[LessonID]">                                            <Compare CompareOp="EQ">                                              <ScalarOperator>                                                <Identifier>                                                  <ColumnReference Database="[Absorb_20141202]" Schema="[dbo]" Table="[Lessons]" Alias="[l]" Column="LessonID" />                                                </Identifier>                                              </ScalarOperator>                                              <ScalarOperator>                                                <Identifier>                                                  <ColumnReference Database="[Absorb_20141202]" Schema="[dbo]" Table="[Activity]" Alias="[a]" Column="LessonID" />                                                </Identifier>                                              </ScalarOperator>                                            </Compare>                                          </ScalarOperator>                                        </ProbeResidual>                                        <RelOp AvgRowSize="19" EstimateCPU="1.27644" EstimateIO="0" EstimateRebinds="0" EstimateRewinds="0" EstimatedExecutionMode="Row" EstimateRows="305369" LogicalOp="Inner Join" NodeId="9" Parallel="false" PhysicalOp="Nested Loops" EstimatedTotalSubtreeCost="3.20098">                                          <OutputList>                                            <ColumnReference Database="[Absorb_20141202]" Schema="[dbo]" Table="[Activity]" Alias="[a]" Column="ActivityID" />                                            <ColumnReference Database="[Absorb_20141202]" Schema="[dbo]" Table="[Activity]" Alias="[a]" Column="StudentsID" />                                            <ColumnReference Database="[Absorb_20141202]" Schema="[dbo]" Table="[Activity]" Alias="[a]" Column="LessonID" />                                          </OutputList>                                          <RunTimeInformation>                                            <RunTimeCountersPerThread Thread="0" ActualRows="1890" ActualEndOfScans="1" ActualExecutions="1" />                                          </RunTimeInformation>                                          <NestedLoops Optimized="true" WithUnorderedPrefetch="true">                                            <OuterReferences>                                              <ColumnReference Database="[Absorb_20141202]" Schema="[dbo]" Table="[Courses]" Alias="[c]" Column="CourseID" />                                              <ColumnReference Column="Expr1010" />                                            </OuterReferences>                                            <RelOp AvgRowSize="15" EstimateCPU="0.000325066" EstimateIO="0.00430291" EstimateRebinds="0" EstimateRewinds="0" EstimatedExecutionMode="Row" EstimateRows="123.675" LogicalOp="Index Seek" NodeId="12" Parallel="false" PhysicalOp="Index Seek" EstimatedTotalSubtreeCost="0.00462797" TableCardinality="278361">                                              <OutputList>                                                <ColumnReference Database="[Absorb_20141202]" Schema="[dbo]" Table="[Courses]" Alias="[c]" Column="CourseID" />                                              </OutputList>                                              <RunTimeInformation>                                                <RunTimeCountersPerThread Thread="0" ActualRows="67" ActualEndOfScans="1" ActualExecutions="1" />                                              </RunTimeInformation>                                              <IndexScan Ordered="true" ScanDirection="FORWARD" ForcedIndex="false" ForceSeek="false" ForceScan="false" NoExpandHint="false" Storage="RowStore">                                                <DefinedValues>                                                  <DefinedValue>                                                    <ColumnReference Database="[Absorb_20141202]" Schema="[dbo]" Table="[Courses]" Alias="[c]" Column="CourseID" />                                                  </DefinedValue>                                                </DefinedValues>                                                <Object Database="[Absorb_20141202]" Schema="[dbo]" Table="[Courses]" Index="[_dta_index_Courses_9_919010355__K2_K49_K13_K3_K1_K6]" Alias="[c]" IndexKind="NonClustered" Storage="RowStore" />                                                <SeekPredicates>                                                  <SeekPredicateNew>                                                    <SeekKeys>                                                      <Prefix ScanType="EQ">                                                        <RangeColumns>                                                          <ColumnReference Database="[Absorb_20141202]" Schema="[dbo]" Table="[Courses]" Alias="[c]" Column="ClientID" />                                                        </RangeColumns>                                                        <RangeExpressions>                                                          <ScalarOperator ScalarString="(1008)">                                                            <Const ConstValue="(1008)" />                                                          </ScalarOperator>                                                        </RangeExpressions>                                                      </Prefix>                                                    </SeekKeys>                                                  </SeekPredicateNew>                                                </SeekPredicates>                                                <Predicate>                                                  <ScalarOperator ScalarString="[Absorb_20141202].[dbo].[Courses].[Type] as [c].[Type]=(0) OR [Absorb_20141202].[dbo].[Courses].[Type] as [c].[Type]=(1) OR [Absorb_20141202].[dbo].[Courses].[Type] as [c].[Type]=(2)">                                                    <Logical Operation="OR">                                                      <ScalarOperator>                                                        <Compare CompareOp="EQ">                                                          <ScalarOperator>                                                            <Identifier>                                                              <ColumnReference Database="[Absorb_20141202]" Schema="[dbo]" Table="[Courses]" Alias="[c]" Column="Type" />                                                            </Identifier>                                                          </ScalarOperator>                                                          <ScalarOperator>                                                            <Const ConstValue="(0)" />                                                          </ScalarOperator>                                                        </Compare>                                                      </ScalarOperator>                                                      <ScalarOperator>                                                        <Compare CompareOp="EQ">                                                          <ScalarOperator>                                                            <Identifier>                                                              <ColumnReference Database="[Absorb_20141202]" Schema="[dbo]" Table="[Courses]" Alias="[c]" Column="Type" />                                                            </Identifier>                                                          </ScalarOperator>                                                          <ScalarOperator>                                                            <Const ConstValue="(1)" />                                                          </ScalarOperator>                                                        </Compare>                                                      </ScalarOperator>                                                      <ScalarOperator>                                                        <Compare CompareOp="EQ">                                                          <ScalarOperator>                                                            <Identifier>                                                              <ColumnReference Database="[Absorb_20141202]" Schema="[dbo]" Table="[Courses]" Alias="[c]" Column="Type" />                                                            </Identifier>                                                          </ScalarOperator>                                                          <ScalarOperator>                                                            <Const ConstValue="(2)" />                                                          </ScalarOperator>                                                        </Compare>                                                      </ScalarOperator>                                                    </Logical>                                                  </ScalarOperator>                                                </Predicate>                                              </IndexScan>                                            </RelOp>                                            <RelOp AvgRowSize="19" EstimateCPU="0.00287304" EstimateIO="0.0127546" EstimateRebinds="122.675" EstimateRewinds="0" EstimatedExecutionMode="Row" EstimateRows="2469.13" LogicalOp="Index Seek" NodeId="13" Parallel="false" PhysicalOp="Index Seek" EstimatedTotalSubtreeCost="1.91973" TableCardinality="69965100">                                              <OutputList>                                                <ColumnReference Database="[Absorb_20141202]" Schema="[dbo]" Table="[Activity]" Alias="[a]" Column="ActivityID" />                                                <ColumnReference Database="[Absorb_20141202]" Schema="[dbo]" Table="[Activity]" Alias="[a]" Column="StudentsID" />                                                <ColumnReference Database="[Absorb_20141202]" Schema="[dbo]" Table="[Activity]" Alias="[a]" Column="LessonID" />                                              </OutputList>                                              <RunTimeInformation>                                                <RunTimeCountersPerThread Thread="0" ActualRows="1890" ActualEndOfScans="67" ActualExecutions="67" />                                              </RunTimeInformation>                                              <IndexScan Ordered="true" ScanDirection="FORWARD" ForcedIndex="false" ForceSeek="false" ForceScan="false" NoExpandHint="false" Storage="RowStore">                                                <DefinedValues>                                                  <DefinedValue>                                                    <ColumnReference Database="[Absorb_20141202]" Schema="[dbo]" Table="[Activity]" Alias="[a]" Column="ActivityID" />                                                  </DefinedValue>                                                  <DefinedValue>                                                    <ColumnReference Database="[Absorb_20141202]" Schema="[dbo]" Table="[Activity]" Alias="[a]" Column="StudentsID" />                                                  </DefinedValue>                                                  <DefinedValue>                                                    <ColumnReference Database="[Absorb_20141202]" Schema="[dbo]" Table="[Activity]" Alias="[a]" Column="LessonID" />                                                  </DefinedValue>                                                </DefinedValues>                                                <Object Database="[Absorb_20141202]" Schema="[dbo]" Table="[Activity]" Index="[cds_new2_Activity_CourseID_ActivityFinished_incl]" Alias="[a]" IndexKind="NonClustered" Storage="RowStore" />                                                <SeekPredicates>                                                  <SeekPredicateNew>                                                    <SeekKeys>                                                      <Prefix ScanType="EQ">                                                        <RangeColumns>                                                          <ColumnReference Database="[Absorb_20141202]" Schema="[dbo]" Table="[Activity]" Alias="[a]" Column="CourseID" />                                                        </RangeColumns>                                                        <RangeExpressions>                                                          <ScalarOperator ScalarString="[Absorb_20141202].[dbo].[Courses].[CourseID] as [c].[CourseID]">                                                            <Identifier>                                                              <ColumnReference Database="[Absorb_20141202]" Schema="[dbo]" Table="[Courses]" Alias="[c]" Column="CourseID" />                                                            </Identifier>                                                          </ScalarOperator>                                                        </RangeExpressions>                                                      </Prefix>                                                    </SeekKeys>                                                  </SeekPredicateNew>                                                </SeekPredicates>                                              </IndexScan>                                            </RelOp>                                          </NestedLoops>                                        </RelOp>                                        <RelOp AvgRowSize="15" EstimateCPU="0.472459" EstimateIO="1.30461" EstimateRebinds="0" EstimateRewinds="0" EstimatedExecutionMode="Row" EstimateRows="429365" LogicalOp="Index Scan" NodeId="14" Parallel="false" PhysicalOp="Index Scan" EstimatedTotalSubtreeCost="1.77706" TableCardinality="429365">                                          <OutputList>                                            <ColumnReference Database="[Absorb_20141202]" Schema="[dbo]" Table="[Lessons]" Alias="[l]" Column="LessonID" />                                            <ColumnReference Database="[Absorb_20141202]" Schema="[dbo]" Table="[Lessons]" Alias="[l]" Column="CourseID" />                                          </OutputList>                                          <RunTimeInformation>                                            <RunTimeCountersPerThread Thread="0" ActualRows="429365" ActualEndOfScans="1" ActualExecutions="1" />                                          </RunTimeInformation>                                          <IndexScan Ordered="false" ForcedIndex="false" ForceSeek="false" ForceScan="false" NoExpandHint="false" Storage="RowStore">                                            <DefinedValues>                                              <DefinedValue>                                                <ColumnReference Database="[Absorb_20141202]" Schema="[dbo]" Table="[Lessons]" Alias="[l]" Column="LessonID" />                                              </DefinedValue>                                              <DefinedValue>                                                <ColumnReference Database="[Absorb_20141202]" Schema="[dbo]" Table="[Lessons]" Alias="[l]" Column="CourseID" />                                              </DefinedValue>                                            </DefinedValues>                                            <Object Database="[Absorb_20141202]" Schema="[dbo]" Table="[Lessons]" Index="[missing_index_8_7_Lessons]" Alias="[l]" IndexKind="NonClustered" Storage="RowStore" />                                          </IndexScan>                                        </RelOp>                                      </Hash>                                    </RelOp>                                  </Sort>                                </RelOp>                                <RelOp AvgRowSize="15" EstimateCPU="30.9393" EstimateIO="105.679" EstimateRebinds="0" EstimateRewinds="0" EstimatedExecutionMode="Row" EstimateRows="28126500" LogicalOp="Index Scan" NodeId="16" Parallel="false" PhysicalOp="Index Scan" EstimatedTotalSubtreeCost="136.618" TableCardinality="28126500">                                  <OutputList>                                    <ColumnReference Database="[Absorb_20141202]" Schema="[dbo]" Table="[Subscription]" Alias="[s]" Column="StudentsID" />                                    <ColumnReference Database="[Absorb_20141202]" Schema="[dbo]" Table="[Subscription]" Alias="[s]" Column="CourseID" />                                  </OutputList>                                  <RunTimeInformation>                                    <RunTimeCountersPerThread Thread="0" ActualRows="28094477" ActualEndOfScans="0" ActualExecutions="1" />                                  </RunTimeInformation>                                  <IndexScan Ordered="true" ScanDirection="FORWARD" ForcedIndex="false" ForceSeek="false" ForceScan="false" NoExpandHint="false" Storage="RowStore">                                    <DefinedValues>                                      <DefinedValue>                                        <ColumnReference Database="[Absorb_20141202]" Schema="[dbo]" Table="[Subscription]" Alias="[s]" Column="StudentsID" />                                      </DefinedValue>                                      <DefinedValue>                                        <ColumnReference Database="[Absorb_20141202]" Schema="[dbo]" Table="[Subscription]" Alias="[s]" Column="CourseID" />                                      </DefinedValue>                                    </DefinedValues>                                    <Object Database="[Absorb_20141202]" Schema="[dbo]" Table="[Subscription]" Index="[cds_Subscription_StudentsID_CourseID_LessonID_Absent]" Alias="[s]" IndexKind="NonClustered" Storage="RowStore" />                                  </IndexScan>                                </RelOp>                              </Merge>                            </RelOp>                            <RelOp AvgRowSize="11" EstimateCPU="0.0001581" EstimateIO="0.003125" EstimateRebinds="4194.07" EstimateRewinds="0" EstimatedExecutionMode="Row" EstimateRows="1" LogicalOp="Clustered Index Seek" NodeId="18" Parallel="false" PhysicalOp="Clustered Index Seek" EstimatedTotalSubtreeCost="13.7641" TableCardinality="69965100">                              <OutputList>                                <ColumnReference Database="[Absorb_20141202]" Schema="[dbo]" Table="[Activity]" Column="ActivityID" />                              </OutputList>                              <RunTimeInformation>                                <RunTimeCountersPerThread Thread="0" ActualRows="1807" ActualEndOfScans="0" ActualExecutions="1807" />                              </RunTimeInformation>                              <IndexScan Ordered="true" ScanDirection="FORWARD" ForcedIndex="false" ForceSeek="false" ForceScan="false" NoExpandHint="false" Storage="RowStore">                                <DefinedValues>                                  <DefinedValue>                                    <ColumnReference Database="[Absorb_20141202]" Schema="[dbo]" Table="[Activity]" Column="ActivityID" />                                  </DefinedValue>                                </DefinedValues>                                <Object Database="[Absorb_20141202]" Schema="[dbo]" Table="[Activity]" Index="[PK_activity]" IndexKind="Clustered" Storage="RowStore" />                                <SeekPredicates>                                  <SeekPredicateNew>                                    <SeekKeys>                                      <Prefix ScanType="EQ">                                        <RangeColumns>                                          <ColumnReference Database="[Absorb_20141202]" Schema="[dbo]" Table="[Activity]" Column="ActivityID" />                                        </RangeColumns>                                        <RangeExpressions>                                          <ScalarOperator ScalarString="[Absorb_20141202].[dbo].[Activity].[ActivityID] as [a].[ActivityID]">                                            <Identifier>                                              <ColumnReference Database="[Absorb_20141202]" Schema="[dbo]" Table="[Activity]" Alias="[a]" Column="ActivityID" />                                            </Identifier>                                          </ScalarOperator>                                        </RangeExpressions>                                      </Prefix>                                    </SeekKeys>                                  </SeekPredicateNew>                                </SeekPredicates>                              </IndexScan>                            </RelOp>                          </NestedLoops>                        </RelOp>                      </Hash>                    </RelOp>                  </StreamAggregate>                </RelOp>              </ComputeScalar>            </RelOp>          </QueryPlan>        </StmtSimple>      </Statements>    </Batch>  </BatchSequence></ShowPlanXML>   | 
                                         
                                        
                                            | 
                                         
                                       
                                     | 
                                   
                            
                       
                          
                            
                                    | 
                                     tkizer 
                                    Almighty SQL Goddess 
                                     
                                    
                                    38200 Posts  | 
                                    
                                      
                                        
                                          
                                           
                                            Posted - 2014-12-11 : 19:18:43
                                          
  | 
                                         
                                        
                                          | Your stats are out-of-date on Activity and Lessons tables. Actual vs Estimated is way off for those two.Try updating stats on those two. You should get a new plan. Repost the plan xml.For the Courses table, can't you use: INNER JOIN Courses c ON s.CourseId = c.CourseId?Tara KizerSQL Server MVP since 2007http://weblogs.sqlteam.com/tarad/  | 
                                         
                                        
                                            | 
                                         
                                       
                                     | 
                                   
                            
                       
                          
                            
                                    | 
                                     ferrethouse 
                                    Constraint Violating Yak Guru 
                                     
                                    
                                    352 Posts  | 
                                    
                                      
                                        
                                          
                                           
                                            Posted - 2014-12-12 : 11:16:37
                                          
  | 
                                         
                                        
                                          quote: For the Courses table, can't you use: INNER JOIN Courses c ON s.CourseId = c.CourseId?
  This change made a huge difference. It blows my mind how you knew to do that.  | 
                                         
                                        
                                            | 
                                         
                                       
                                     | 
                                   
                            
                       
                          
                            
                                    | 
                                     tkizer 
                                    Almighty SQL Goddess 
                                     
                                    
                                    38200 Posts  | 
                                    
                                      
                                        
                                          
                                           
                                            Posted - 2014-12-12 : 12:51:26
                                          
  | 
                                         
                                        
                                          I analyzed the execution plan using SQL Sentry's free Plan Explorer and looked at the indexes in use. The Subscriptions table's index in use for a different part had CourseId in it, so the idea was to grab the data from that index rather than needing to find the data in another index. Tara KizerSQL Server MVP since 2007http://weblogs.sqlteam.com/tarad/  | 
                                         
                                        
                                            | 
                                         
                                       
                                     | 
                                   
                            
                            
                                | 
                                    
                                      
                                     
                                    
                                 | 
                             
                         
                     | 
                 
             
         |   
     
     
            
              
	     |  
		
			
     
          
		 |