none
为什么这样走索引呢? RRS feed

  • 问题

  • 一个表包含八九个栏位,其中有facility,site,packing_item_no,packing_no,creator等。

    创建索引:

    create index packing_ind   on W_D_PACKING_DETAIL(packing_no,packing_item_no) include (creator)

    select facility,packing_item_no,creator from W_D_PACKING_DETAIL where packing_no='310000139701121036' and packing_item_no='3110703B'

    这样的执行计划是index seek加Rid Lookup。

    但是为什么

    select facility,packing_item_no from W_D_PACKING_DETAIL where packing_no='310000139701121036'

    的执行计划就是table scan了?

    满足这个条件的记录数才80笔。全表有3000多笔。

    select packing_item_no ,facility,creator from W_D_PACKING_DETAIL where packing_no='310000139701121036'

    也是全表扫描。


    If you haven't all the things you want,be grateful for the things you don't have that you didn't want.


    • 已编辑 Wison-Ho 2011年6月23日 7:03
    2011年6月23日 6:52

答案

  • 1. 应该是数据量太少了,同时数据的差异性不高,可以更新一下这个表的统计再测试看看

    2. 如果一定想让它走索引,可以让它强制走索引select XXX from table (index=IX_test) where xxxx=''

    3. 你到哪个工厂了啊?这显然是工厂的表....

    2011年6月23日 7:01
  • No difference for this query, keep in mind that no single index works for any query.
    2011年6月23日 14:33

全部回复

  • 1. 应该是数据量太少了,同时数据的差异性不高,可以更新一下这个表的统计再测试看看

    2. 如果一定想让它走索引,可以让它强制走索引select XXX from table (index=IX_test) where xxxx=''

    3. 你到哪个工厂了啊?这显然是工厂的表....

    2011年6月23日 7:01
  • 1. 应该是数据量太少了,同时数据的差异性不高,可以更新一下这个表的统计再测试看看

    2. 如果一定想让它走索引,可以让它强制走索引select XXX from table (index=IX_test) where xxxx=''

    3. 你到哪个工厂了啊?这显然是工厂的表....


    确实是数据量太少了。数据量一多起来,后两句的执行计划都是index seek+Rid Lookup了
    If you haven't all the things you want,be grateful for the things you don't have that you didn't want.
    2011年6月23日 7:16
  • 我现在测试,这个表包含40W笔数据。

    create index packing_ind   on W_D_PACKING_DETAIL_NEW(packing_no,packing_item_no)

    select packing_no ,creator from W_D_PACKING_DETAIL_NEW where packing_item_no='3110703B'这个语句走的就是Index Scan。

     

    select facility,packing_item_no ,creator from W_D_PACKING_DETAIL_NEW where packing_item_no='3110703B'但是这个却多了二步,Key Lookup和Nested Loop。

    这是为什么呢?

    select facility from W_D_PACKING_DETAIL_NEW where packing_item_no='3110703B'这也是index scan和Key Lookup加Nested Loop

     


    If you haven't all the things you want,be grateful for the things you don't have that you didn't want.

     


    • 已编辑 Wison-Ho 2011年6月23日 7:44
    2011年6月23日 7:24
  • select facility from W_D_PACKING_DETAIL_NEW where packing_item_no='3110703B' and packing_no='310000139701121022'

    上面这个走的是index seek+KeyLookup+Nested Loop

    select creator from W_D_PACKING_DETAIL_NEW where packing_item_no='3110703B' and packing_no='310000139701121022'

    下面这个走的是index seek。

    奇怪?


    If you haven't all the things you want,be grateful for the things you don't have that you didn't want.
    2011年6月23日 7:41
  • 还有一个问题:

    仅仅在packing_no上建立索引,大小为10M。

    在packing_no上建立索引并且include(packing_item_no),大小为14M。

    在packing_no,packing_item_no上建立索引,大小也为14M。

    而且我在后两种索引执行

    select creator from W_D_PACKING_DETAIL_NEW where packing_no='310000139701121022' and packing_item_no='3110702C'

    的执行计划都是一样的。

    那到底后两种索引有什么分别呢?

    而且执行select creator from W_D_PACKING_DETAIL_NEW where packing_item_no='3110702C'的执行计划也一样


    If you haven't all the things you want,be grateful for the things you don't have that you didn't want.

    2011年6月23日 8:03
  • 我现在测试,这个表包含40W笔数据。

    create index packing_ind   on W_D_PACKING_DETAIL_NEW(packing_no,packing_item_no)

    select packing_no ,creator from W_D_PACKING_DETAIL_NEW where packing_item_no='3110703B'这个语句走的就是Index Scan。

     

    select facility,packing_item_no ,creator from W_D_PACKING_DETAIL_NEW where packing_item_no='3110703B'但是这个却多了二步,Key Lookup和Nested Loop。

    这是为什么呢?

    select facility from W_D_PACKING_DETAIL_NEW where packing_item_no='3110703B'这也是index scan和Key Lookup加Nested Loop

     


    If you haven't all the things you want,be grateful for the things you don't have that you didn't want.

     



    Because facility is not part of index, sql has to get it from data pages.
    2011年6月23日 14:26
  • select facility from W_D_PACKING_DETAIL_NEW where packing_item_no='3110703B' and packing_no='310000139701121022'

    上面这个走的是index seek+KeyLookup+Nested Loop

    select creator from W_D_PACKING_DETAIL_NEW where packing_item_no='3110703B' and packing_no='310000139701121022'

    下面这个走的是index seek。

    奇怪?


    If you haven't all the things you want,be grateful for the things you don't have that you didn't want.
    Same reason as above.
    2011年6月23日 14:27
  • No difference for this query, keep in mind that no single index works for any query.
    2011年6月23日 14:33