none
怎樣讓下麵的語句用到索引? RRS feed

  • 问题



  • 有2個表,主鍵一樣,batchno ,sendid ,receid ,loadid ,pallet_id組成的主鍵。

    如果使用

    select b.ordnum from asnmain a(nolock),asnitem b(nolock)
      where a.batchno = b.batchno and a.sendid = b.sendid and a.receid = b.receid  and a.loadid = b.loadid and a.pallet_id = b.pallet_id

    怎樣才能使用到索引?

    If you haven't all the things you want,be grateful for the things you don't have that you didn't want.
    2009年11月27日 0:05

答案

  • Sql should use index, check it in execution plan.

    我在執行計畫中看到的是clustered index scan。。。。


    預估 cost有點高。。
    If you haven't all the things you want,be grateful for the things you don't have that you didn't want.
    Depends on number of rows returned, index scan may cost less than seek when return many rows. By the way, you didn't filter data in your query.
    2009年11月27日 2:33
  • set statistics profile on
    set statistics io on
    set statistics time on
    go

    select b.ordnum from asnmain a(nolock),asnitem b(nolock)
      where a.batchno = b.batchno and a.sendid = b.sendid and a.receid = b.receid  and a.loadid = b.loadid and a.pallet_id = b.pallet_id

    --你自己执行一下看看有没有使用索引,正常来说少数据的字段不用索引的(主键就是索引),我建议你不要多个字段组合成主键,另外分出个主键好了,如果是单个(主键)字段查询是会影响效率的
    go
    set statistics profile off
    set statistics io off
    set statistics time off
    2009年11月29日 16:42

全部回复

  • Sql should use index, check it in execution plan.
    2009年11月27日 0:17
  • Sql should use index, check it in execution plan.

    我在執行計畫中看到的是clustered index scan。。。。


    預估 cost有點高。。
    If you haven't all the things you want,be grateful for the things you don't have that you didn't want.
    2009年11月27日 0:47
  • 把非主健的條件列建作一個索引,顯示列沒在條件內的非主健列用INCLUDE
    ROY WU(吳熹)
    2009年11月27日 2:19
    版主
  • Sql should use index, check it in execution plan.

    我在執行計畫中看到的是clustered index scan。。。。


    預估 cost有點高。。
    If you haven't all the things you want,be grateful for the things you don't have that you didn't want.
    Depends on number of rows returned, index scan may cost less than seek when return many rows. By the way, you didn't filter data in your query.
    2009年11月27日 2:33
  • 放到查询分析器里面执行 ssms可以帮你智能分析 是否缺少索引 然后建立相关索引 就可以
    2009年11月27日 8:40
  • 已经使用了索引,效率又是一个问题,效率跟索引(batchno ,sendid ,receid ,loadid ,pallet_id)的顺序有关

    2009年11月28日 17:50
  • 已经使用了索引,效率又是一个问题,效率跟索引(batchno ,sendid ,receid ,loadid ,pallet_id)的顺序有关

    这个顺序就是主键的顺序。
    If you haven't all the things you want,be grateful for the things you don't have that you didn't want.
    2009年11月29日 4:56
  • set statistics profile on
    set statistics io on
    set statistics time on
    go

    select b.ordnum from asnmain a(nolock),asnitem b(nolock)
      where a.batchno = b.batchno and a.sendid = b.sendid and a.receid = b.receid  and a.loadid = b.loadid and a.pallet_id = b.pallet_id

    --你自己执行一下看看有没有使用索引,正常来说少数据的字段不用索引的(主键就是索引),我建议你不要多个字段组合成主键,另外分出个主键好了,如果是单个(主键)字段查询是会影响效率的
    go
    set statistics profile off
    set statistics io off
    set statistics time off
    2009年11月29日 16:42
  • Optimizer will choose clustered index scan in this case no matter what you do because the query doesn't have filter on other columns. 
    2009年11月29日 19:47
  • 建议你使用子查询
    第一步 选择类别较多的2个字段
    第二步 再从结果表中与表2进行关联查询 

     这样的查询 查询分析器分析起来 十分困难
    2009年11月30日 3:49