2012-07-18 66 views
1

我有一个包含ConChainNum,Control和TransDate的索引,并且我只重建了索引。我与工作表有100多万条记录和下面的查询不返回任何结果:如何正确索引多个字段以获得更快的结果

select * from sbt_pos_sales 
where conchainnum = 810 and 
     control = 852013688 and 
     transdate = 20120712 

鉴于我与where子句中的三个字段专门做出一个索引,我真的希望几乎立即结果,但花了大约半分钟的时间告诉我那里没有结果。

有人可以向我解释为什么这个指数没有使它比这更快,如果我能以某种方式做它不同,使其更快?

执行计划:

<?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.1.1" Build="10.0.5500.0" xmlns="http://schemas.microsoft.com/sqlserver/2004/07/showplan"> 
    <BatchSequence> 
    <Batch> 
     <Statements> 
     <StmtSimple StatementCompId="1" StatementEstRows="20.2265" StatementId="1" StatementOptmLevel="FULL" StatementSubTreeCost="348.687" StatementText="SELECT * FROM [ngdwdb]..[sbt_pos_sales] WHERE [conchainnum][email protected] AND [control][email protected] AND [transdate][email protected]" StatementType="SELECT" QueryHash="0x11B117D9A8C6DF58" QueryPlanHash="0xBA3EFC04623601F6"> 
      <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="8" MemoryGrant="5504" CachedPlanSize="48" CompileTime="95" CompileCPU="4" CompileMemory="368"> 
      <RelOp AvgRowSize="193" EstimateCPU="0.0655713" EstimateIO="0" EstimateRebinds="0" EstimateRewinds="0" EstimateRows="7330.87" LogicalOp="Gather Streams" NodeId="1" Parallel="true" PhysicalOp="Parallelism" EstimatedTotalSubtreeCost="348.686"> 
       <OutputList> 
       <ColumnReference Database="[NGDWDB]" Schema="[dbo]" Table="[SBT_POS_SALES]" Column="RowIdent" /> 
       <ColumnReference Database="[NGDWDB]" Schema="[dbo]" Table="[SBT_POS_SALES]" Column="ConChainNum" /> 
       <ColumnReference Database="[NGDWDB]" Schema="[dbo]" Table="[SBT_POS_SALES]" Column="Control" /> 
       <ColumnReference Database="[NGDWDB]" Schema="[dbo]" Table="[SBT_POS_SALES]" Column="TransDate" /> 
       <ColumnReference Database="[NGDWDB]" Schema="[dbo]" Table="[SBT_POS_SALES]" Column="ControlGS" /> 
       <ColumnReference Database="[NGDWDB]" Schema="[dbo]" Table="[SBT_POS_SALES]" Column="UPC_UCP" /> 
       <ColumnReference Database="[NGDWDB]" Schema="[dbo]" Table="[SBT_POS_SALES]" Column="DateSold" /> 
       <ColumnReference Database="[NGDWDB]" Schema="[dbo]" Table="[SBT_POS_SALES]" Column="Price_UCP" /> 
       <ColumnReference Database="[NGDWDB]" Schema="[dbo]" Table="[SBT_POS_SALES]" Column="Store" /> 
       <ColumnReference Database="[NGDWDB]" Schema="[dbo]" Table="[SBT_POS_SALES]" Column="QtySold" /> 
       <ColumnReference Database="[NGDWDB]" Schema="[dbo]" Table="[SBT_POS_SALES]" Column="FileName" /> 
       <ColumnReference Database="[NGDWDB]" Schema="[dbo]" Table="[SBT_POS_SALES]" Column="IssueCode" /> 
       <ColumnReference Database="[NGDWDB]" Schema="[dbo]" Table="[SBT_POS_SALES]" Column="DealerNum" /> 
       </OutputList> 
       <RunTimeInformation> 
       <RunTimeCountersPerThread Thread="0" ActualRows="0" ActualEndOfScans="1" ActualExecutions="1" /> 
       </RunTimeInformation> 
       <Parallelism> 
       <RelOp AvgRowSize="193" EstimateCPU="0.00766076" EstimateIO="0" EstimateRebinds="0" EstimateRewinds="0" EstimateRows="7330.87" LogicalOp="Inner Join" NodeId="2" Parallel="true" PhysicalOp="Nested Loops" EstimatedTotalSubtreeCost="348.621"> 
        <OutputList> 
        <ColumnReference Database="[NGDWDB]" Schema="[dbo]" Table="[SBT_POS_SALES]" Column="RowIdent" /> 
        <ColumnReference Database="[NGDWDB]" Schema="[dbo]" Table="[SBT_POS_SALES]" Column="ConChainNum" /> 
        <ColumnReference Database="[NGDWDB]" Schema="[dbo]" Table="[SBT_POS_SALES]" Column="Control" /> 
        <ColumnReference Database="[NGDWDB]" Schema="[dbo]" Table="[SBT_POS_SALES]" Column="TransDate" /> 
        <ColumnReference Database="[NGDWDB]" Schema="[dbo]" Table="[SBT_POS_SALES]" Column="ControlGS" /> 
        <ColumnReference Database="[NGDWDB]" Schema="[dbo]" Table="[SBT_POS_SALES]" Column="UPC_UCP" /> 
        <ColumnReference Database="[NGDWDB]" Schema="[dbo]" Table="[SBT_POS_SALES]" Column="DateSold" /> 
        <ColumnReference Database="[NGDWDB]" Schema="[dbo]" Table="[SBT_POS_SALES]" Column="Price_UCP" /> 
        <ColumnReference Database="[NGDWDB]" Schema="[dbo]" Table="[SBT_POS_SALES]" Column="Store" /> 
        <ColumnReference Database="[NGDWDB]" Schema="[dbo]" Table="[SBT_POS_SALES]" Column="QtySold" /> 
        <ColumnReference Database="[NGDWDB]" Schema="[dbo]" Table="[SBT_POS_SALES]" Column="FileName" /> 
        <ColumnReference Database="[NGDWDB]" Schema="[dbo]" Table="[SBT_POS_SALES]" Column="IssueCode" /> 
        <ColumnReference Database="[NGDWDB]" Schema="[dbo]" Table="[SBT_POS_SALES]" Column="DealerNum" /> 
        </OutputList> 
        <RunTimeInformation> 
        <RunTimeCountersPerThread Thread="6" ActualRows="0" ActualEndOfScans="1" ActualExecutions="1" /> 
        <RunTimeCountersPerThread Thread="2" ActualRows="0" ActualEndOfScans="1" ActualExecutions="1" /> 
        <RunTimeCountersPerThread Thread="3" ActualRows="0" ActualEndOfScans="1" ActualExecutions="1" /> 
        <RunTimeCountersPerThread Thread="7" ActualRows="0" ActualEndOfScans="1" ActualExecutions="1" /> 
        <RunTimeCountersPerThread Thread="5" ActualRows="0" ActualEndOfScans="1" ActualExecutions="1" /> 
        <RunTimeCountersPerThread Thread="4" ActualRows="0" ActualEndOfScans="1" ActualExecutions="1" /> 
        <RunTimeCountersPerThread Thread="8" ActualRows="0" ActualEndOfScans="1" ActualExecutions="1" /> 
        <RunTimeCountersPerThread Thread="1" ActualRows="0" ActualEndOfScans="1" ActualExecutions="1" /> 
        <RunTimeCountersPerThread Thread="0" ActualRows="0" ActualEndOfScans="0" ActualExecutions="0" /> 
        </RunTimeInformation> 
        <NestedLoops Optimized="true" WithUnorderedPrefetch="true"> 
        <OuterReferences> 
         <ColumnReference Column="Bmk1000" /> 
         <ColumnReference Column="Expr1009" /> 
        </OuterReferences> 
        <RelOp AvgRowSize="58" EstimateCPU="14.9196" EstimateIO="0" EstimateRebinds="0" EstimateRewinds="0" EstimateRows="7330.87" LogicalOp="Compute Scalar" NodeId="5" Parallel="true" PhysicalOp="Compute Scalar" EstimatedTotalSubtreeCost="324.579"> 
         <OutputList> 
         <ColumnReference Column="Bmk1000" /> 
         <ColumnReference Database="[NGDWDB]" Schema="[dbo]" Table="[SBT_POS_SALES]" Column="ConChainNum" /> 
         <ColumnReference Database="[NGDWDB]" Schema="[dbo]" Table="[SBT_POS_SALES]" Column="Control" /> 
         <ColumnReference Database="[NGDWDB]" Schema="[dbo]" Table="[SBT_POS_SALES]" Column="TransDate" /> 
         <ColumnReference Column="Expr1008" /> 
         </OutputList> 
         <ComputeScalar> 
         <DefinedValues> 
          <DefinedValue> 
          <ColumnReference Column="Expr1008" /> 
          <ScalarOperator ScalarString="BmkToPage([Bmk1000])"> 
           <Intrinsic FunctionName="BmkToPage"> 
           <ScalarOperator> 
            <Identifier> 
            <ColumnReference Column="Bmk1000" /> 
            </Identifier> 
           </ScalarOperator> 
           </Intrinsic> 
          </ScalarOperator> 
          </DefinedValue> 
         </DefinedValues> 
         <RelOp AvgRowSize="58" EstimateCPU="15.196" EstimateIO="294.463" EstimateRebinds="0" EstimateRewinds="0" EstimateRows="7330.87" LogicalOp="Index Seek" NodeId="6" Parallel="true" PhysicalOp="Index Seek" EstimatedTotalSubtreeCost="309.659" TableCardinality="107302000"> 
          <OutputList> 
          <ColumnReference Column="Bmk1000" /> 
          <ColumnReference Database="[NGDWDB]" Schema="[dbo]" Table="[SBT_POS_SALES]" Column="ConChainNum" /> 
          <ColumnReference Database="[NGDWDB]" Schema="[dbo]" Table="[SBT_POS_SALES]" Column="Control" /> 
          <ColumnReference Database="[NGDWDB]" Schema="[dbo]" Table="[SBT_POS_SALES]" Column="TransDate" /> 
          </OutputList> 
          <RunTimeInformation> 
          <RunTimeCountersPerThread Thread="6" ActualRows="0" ActualEndOfScans="1" ActualExecutions="1" /> 
          <RunTimeCountersPerThread Thread="3" ActualRows="0" ActualEndOfScans="1" ActualExecutions="1" /> 
          <RunTimeCountersPerThread Thread="2" ActualRows="0" ActualEndOfScans="1" ActualExecutions="1" /> 
          <RunTimeCountersPerThread Thread="7" ActualRows="0" ActualEndOfScans="1" ActualExecutions="1" /> 
          <RunTimeCountersPerThread Thread="8" ActualRows="0" ActualEndOfScans="1" ActualExecutions="1" /> 
          <RunTimeCountersPerThread Thread="5" ActualRows="0" ActualEndOfScans="1" ActualExecutions="1" /> 
          <RunTimeCountersPerThread Thread="1" ActualRows="0" ActualEndOfScans="1" ActualExecutions="1" /> 
          <RunTimeCountersPerThread Thread="4" ActualRows="0" ActualEndOfScans="1" ActualExecutions="1" /> 
          <RunTimeCountersPerThread Thread="0" ActualRows="0" ActualEndOfScans="0" ActualExecutions="0" /> 
          </RunTimeInformation> 
          <IndexScan Ordered="true" ScanDirection="FORWARD" ForcedIndex="false" ForceSeek="false" NoExpandHint="false"> 
          <DefinedValues> 
           <DefinedValue> 
           <ColumnReference Column="Bmk1000" /> 
           </DefinedValue> 
           <DefinedValue> 
           <ColumnReference Database="[NGDWDB]" Schema="[dbo]" Table="[SBT_POS_SALES]" Column="ConChainNum" /> 
           </DefinedValue> 
           <DefinedValue> 
           <ColumnReference Database="[NGDWDB]" Schema="[dbo]" Table="[SBT_POS_SALES]" Column="Control" /> 
           </DefinedValue> 
           <DefinedValue> 
           <ColumnReference Database="[NGDWDB]" Schema="[dbo]" Table="[SBT_POS_SALES]" Column="TransDate" /> 
           </DefinedValue> 
          </DefinedValues> 
          <Object Database="[NGDWDB]" Schema="[dbo]" Table="[SBT_POS_SALES]" Index="[idxLoad]" IndexKind="NonClustered" /> 
          <SeekPredicates> 
           <SeekPredicateNew> 
           <SeekKeys> 
            <Prefix ScanType="EQ"> 
            <RangeColumns> 
             <ColumnReference Database="[NGDWDB]" Schema="[dbo]" Table="[SBT_POS_SALES]" Column="ConChainNum" /> 
            </RangeColumns> 
            <RangeExpressions> 
             <ScalarOperator ScalarString="(810)"> 
             <Const ConstValue="(810)" /> 
             </ScalarOperator> 
            </RangeExpressions> 
            </Prefix> 
           </SeekKeys> 
           </SeekPredicateNew> 
          </SeekPredicates> 
          <Predicate> 
           <ScalarOperator ScalarString="CONVERT_IMPLICIT(int,[NGDWDB].[dbo].[SBT_POS_SALES].[Control],0)=(852013688) AND CONVERT_IMPLICIT(int,[NGDWDB].[dbo].[SBT_POS_SALES].[TransDate],0)=(20120712)"> 
           <Logical Operation="AND"> 
            <ScalarOperator> 
            <Compare CompareOp="EQ"> 
             <ScalarOperator> 
             <Convert DataType="int" Style="0" Implicit="true"> 
              <ScalarOperator> 
              <Identifier> 
               <ColumnReference Database="[NGDWDB]" Schema="[dbo]" Table="[SBT_POS_SALES]" Column="Control" /> 
              </Identifier> 
              </ScalarOperator> 
             </Convert> 
             </ScalarOperator> 
             <ScalarOperator> 
             <Const ConstValue="(852013688)" /> 
             </ScalarOperator> 
            </Compare> 
            </ScalarOperator> 
            <ScalarOperator> 
            <Compare CompareOp="EQ"> 
             <ScalarOperator> 
             <Convert DataType="int" Style="0" Implicit="true"> 
              <ScalarOperator> 
              <Identifier> 
               <ColumnReference Database="[NGDWDB]" Schema="[dbo]" Table="[SBT_POS_SALES]" Column="TransDate" /> 
              </Identifier> 
              </ScalarOperator> 
             </Convert> 
             </ScalarOperator> 
             <ScalarOperator> 
             <Const ConstValue="(20120712)" /> 
             </ScalarOperator> 
            </Compare> 
            </ScalarOperator> 
           </Logical> 
           </ScalarOperator> 
          </Predicate> 
          </IndexScan> 
         </RelOp> 
         </ComputeScalar> 
        </RelOp> 
        <RelOp AvgRowSize="136" EstimateCPU="0.0001581" EstimateIO="0.003125" EstimateRebinds="7329.87" EstimateRewinds="0" EstimateRows="1" LogicalOp="RID Lookup" NodeId="11" Parallel="true" PhysicalOp="RID Lookup" EstimatedTotalSubtreeCost="24.0341" TableCardinality="107302000"> 
         <OutputList> 
         <ColumnReference Database="[NGDWDB]" Schema="[dbo]" Table="[SBT_POS_SALES]" Column="RowIdent" /> 
         <ColumnReference Database="[NGDWDB]" Schema="[dbo]" Table="[SBT_POS_SALES]" Column="ControlGS" /> 
         <ColumnReference Database="[NGDWDB]" Schema="[dbo]" Table="[SBT_POS_SALES]" Column="UPC_UCP" /> 
         <ColumnReference Database="[NGDWDB]" Schema="[dbo]" Table="[SBT_POS_SALES]" Column="DateSold" /> 
         <ColumnReference Database="[NGDWDB]" Schema="[dbo]" Table="[SBT_POS_SALES]" Column="Price_UCP" /> 
         <ColumnReference Database="[NGDWDB]" Schema="[dbo]" Table="[SBT_POS_SALES]" Column="Store" /> 
         <ColumnReference Database="[NGDWDB]" Schema="[dbo]" Table="[SBT_POS_SALES]" Column="QtySold" /> 
         <ColumnReference Database="[NGDWDB]" Schema="[dbo]" Table="[SBT_POS_SALES]" Column="FileName" /> 
         <ColumnReference Database="[NGDWDB]" Schema="[dbo]" Table="[SBT_POS_SALES]" Column="IssueCode" /> 
         <ColumnReference Database="[NGDWDB]" Schema="[dbo]" Table="[SBT_POS_SALES]" Column="DealerNum" /> 
         </OutputList> 
         <RunTimeInformation> 
         <RunTimeCountersPerThread Thread="6" ActualRows="0" ActualEndOfScans="0" ActualExecutions="0" /> 
         <RunTimeCountersPerThread Thread="2" ActualRows="0" ActualEndOfScans="0" ActualExecutions="0" /> 
         <RunTimeCountersPerThread Thread="3" ActualRows="0" ActualEndOfScans="0" ActualExecutions="0" /> 
         <RunTimeCountersPerThread Thread="7" ActualRows="0" ActualEndOfScans="0" ActualExecutions="0" /> 
         <RunTimeCountersPerThread Thread="5" ActualRows="0" ActualEndOfScans="0" ActualExecutions="0" /> 
         <RunTimeCountersPerThread Thread="4" ActualRows="0" ActualEndOfScans="0" ActualExecutions="0" /> 
         <RunTimeCountersPerThread Thread="8" ActualRows="0" ActualEndOfScans="0" ActualExecutions="0" /> 
         <RunTimeCountersPerThread Thread="1" ActualRows="0" ActualEndOfScans="0" ActualExecutions="0" /> 
         <RunTimeCountersPerThread Thread="0" ActualRows="0" ActualEndOfScans="0" ActualExecutions="0" /> 
         </RunTimeInformation> 
         <IndexScan Lookup="true" Ordered="true" ScanDirection="FORWARD" ForcedIndex="false" ForceSeek="false" NoExpandHint="false"> 
         <DefinedValues> 
          <DefinedValue> 
          <ColumnReference Database="[NGDWDB]" Schema="[dbo]" Table="[SBT_POS_SALES]" Column="RowIdent" /> 
          </DefinedValue> 
          <DefinedValue> 
          <ColumnReference Database="[NGDWDB]" Schema="[dbo]" Table="[SBT_POS_SALES]" Column="ControlGS" /> 
          </DefinedValue> 
          <DefinedValue> 
          <ColumnReference Database="[NGDWDB]" Schema="[dbo]" Table="[SBT_POS_SALES]" Column="UPC_UCP" /> 
          </DefinedValue> 
          <DefinedValue> 
          <ColumnReference Database="[NGDWDB]" Schema="[dbo]" Table="[SBT_POS_SALES]" Column="DateSold" /> 
          </DefinedValue> 
          <DefinedValue> 
          <ColumnReference Database="[NGDWDB]" Schema="[dbo]" Table="[SBT_POS_SALES]" Column="Price_UCP" /> 
          </DefinedValue> 
          <DefinedValue> 
          <ColumnReference Database="[NGDWDB]" Schema="[dbo]" Table="[SBT_POS_SALES]" Column="Store" /> 
          </DefinedValue> 
          <DefinedValue> 
          <ColumnReference Database="[NGDWDB]" Schema="[dbo]" Table="[SBT_POS_SALES]" Column="QtySold" /> 
          </DefinedValue> 
          <DefinedValue> 
          <ColumnReference Database="[NGDWDB]" Schema="[dbo]" Table="[SBT_POS_SALES]" Column="FileName" /> 
          </DefinedValue> 
          <DefinedValue> 
          <ColumnReference Database="[NGDWDB]" Schema="[dbo]" Table="[SBT_POS_SALES]" Column="IssueCode" /> 
          </DefinedValue> 
          <DefinedValue> 
          <ColumnReference Database="[NGDWDB]" Schema="[dbo]" Table="[SBT_POS_SALES]" Column="DealerNum" /> 
          </DefinedValue> 
         </DefinedValues> 
         <Object Database="[NGDWDB]" Schema="[dbo]" Table="[SBT_POS_SALES]" TableReferenceId="-1" IndexKind="Heap" /> 
         <SeekPredicates> 
          <SeekPredicateNew> 
          <SeekKeys> 
           <Prefix ScanType="EQ"> 
           <RangeColumns> 
            <ColumnReference Column="Bmk1000" /> 
           </RangeColumns> 
           <RangeExpressions> 
            <ScalarOperator ScalarString="[Bmk1000]"> 
            <Identifier> 
             <ColumnReference Column="Bmk1000" /> 
            </Identifier> 
            </ScalarOperator> 
           </RangeExpressions> 
           </Prefix> 
          </SeekKeys> 
          </SeekPredicateNew> 
         </SeekPredicates> 
         </IndexScan> 
        </RelOp> 
        </NestedLoops> 
       </RelOp> 
       </Parallelism> 
      </RelOp> 
      <ParameterList> 
       <ColumnReference Column="@3" ParameterCompiledValue="(20120712)" ParameterRuntimeValue="(20120712)" /> 
       <ColumnReference Column="@2" ParameterCompiledValue="(852013688)" ParameterRuntimeValue="(852013688)" /> 
       <ColumnReference Column="@1" ParameterCompiledValue="(810)" ParameterRuntimeValue="(810)" /> 
      </ParameterList> 
      </QueryPlan> 
     </StmtSimple> 
     </Statements> 
    </Batch> 
    </BatchSequence> 
</ShowPlanXML> 
+0

有几件事可能会放慢速度。 1.有多少列*返回? 2,你总是使用全部3列吗?你也可能需要分开索引。你看过预计的执行计划吗? – Limey 2012-07-18 16:57:07

+0

需要更多信息。您的索引是否包含其他列或仅包含这三个列?索引是否聚集?如果没有,是否有聚集索引?你有没有检查过(如果可以,你能发布)执行计划吗? – mwigdahl 2012-07-18 16:57:19

+0

@Limey 1.十三,但为什么在这种情况下,因为没有行返回?是的。我正在研究执行计划。 – 2012-07-18 17:03:56

回答

1

而不是保持填补了意见,我会正式将此作为一个答案......

根据你的执行计划,我建议上添加一个聚集索引桌子。很难100%确定发生了什么,但RID查找是一个问题。

当没有与该表关联的集群密钥时,会发生RID查找。在非聚簇索引中,聚簇键在非聚簇索引中被复制(如果存在),可以在找到索引条目后加速所需的任何行访问。在一个堆(非聚簇索引的表)中,你没有该聚簇键,所以你必须在堆中查找它。

这就是为什么您的执行计划中有一个INNER JOIN,即使SQL中没有JOIN也是如此。将聚类应用于表中的主键应该消除这种连接,并使用简单的索引查找。

尽管目前的计划显示它现在占用了89%的时间,但我敢打赌,通过表格中的聚集索引,您可以将其简化为简单(且更快)的索引查找。

编辑:

让我看看你的执行计划XML后,修改这个。虽然集群关键点应该仍然有帮助,但真正的问题是索引中的数据类型。在索引查找我展示

CONVERT_IMPLICIT(int,[NGDWDB].[dbo].[SBT_POS_SALES].[Control],0)=(852013688) AND CONVERT_IMPLICIT(int,[NGDWDB].[dbo].[SBT_POS_SALES].[TransDate],0)=(20120712)

,这是告诉我,控制和TransDate是不相同的数据类型,你是在你的查询提供。如果你解决这个问题,不需要转换,你很可能会在查询中看到巨大的加速。

+0

谢谢。如果你知道答案,这里有一个侧面的问题:如果我在这个表中做了一个批量插入(我明白忽略了这些索引),那么对于我每次做一个或者定期重建索引都很重要也许一周一次,如果我每天大约30k行进行一次大容量插入)? – 2012-07-18 17:54:23

+1

另外一个选择是只选择索引中包含的列 - 这将消除对任何“RID查找”的需要(或者一旦聚集索引就位时就进行“查询”) – 2012-07-18 17:58:50

+0

啊哈,转换是最大的罪魁祸首,做“选择1”而不是*也有帮助。现在我有了我期待的直接结果。多谢你们! – 2012-07-18 18:11:43

相关问题