我写了一个查询
left join 和full join 只要10秒左右
inner join 和right join 却要3分钟。
一般情况下是什么原因造成差别这么大呢?我没有说表结构,我想这种问题大虾们应该遇到过。
如果这不是正常现象,我在后面补充上表结构。(结构描述以前有点麻烦)

解决方案 »

  1.   

    你把两个语句都写上,然后一起看一下执行计划,应该是INNER JOIN 的最快,LEFT 和RIGHT看左右表的数据量,FULL最慢
      

  2.   

    没遇到过这种情况,一般来说都是inner join最快的
      

  3.   

    这个确实不正常因为在正常的查询下 inner join最快 lfet join 和right join次之 full join 最慢比如
    select  
      a.id,b.id
    from
      a inner join b 
    on 
      a.id=b.id执行顺序是这样的
    (1)逐行扫描表A中的每条记录.
    (2)对于表A的没条记录,扫描表B的每条记录.
    (3)扫描B中的每一条记录时,判断ON中的条件是否满足
    (4)如果满足,则将表A和表B的当前扫描行添加到输出结果中
    (5)如果不满足,则丢弃表B的每一行
    (6)继续扫描B的下一行,重复(3)-(6)步直到扫描完表B的所有记录
    (7)继续扫描A的下一行,重复(2)-(7)步直到扫描完表A的所有记录
    (8)输出最终结果
      
      

  4.   


    可是我测试了好多遍 还是这样:
    执行完full join 只要11秒  
    然后
    DBCC DROPCLEANBUFFERS 
    DBCC FREEPROCCACHE 
    然后把full改成inner再执行。结果要2分40秒不过我是从两个数据库做join的
    一个是K3数据库,另外一个是ERP系统
    可能是这个原因吗?我这里没数据,明天到公司再确认一下。没搞定在把表结构和SQL语句写出来,请大家分析
      

  5.   

    不知道是不是我ON里面用了SubString函数的原因。
    SubString(varchar(50),1,1)=SubString(varchar(255),1,1)
    SubString(varchar(255),1,1)=SubString(varchar(50),1,1)
    判断这两个等式的效率不一样。业务数据库:pos
    有一张销售记录表:tPosRetailM  11万条数据。
    Keyid    BillCode       Money
    1     DCD0001000000001  100
    2     DCD0001000000002  200
    3     DCD0001000000003  230
    4     DCD0001000000004  500一张退货表:tPosRetailBackM  几百条数据
    Keyid BillCode         Money
    1     BCD0001000000001  100
    2     BCD0001000000002  300
    两个BillCode 类型都是varchar(50)这两个表的记录全部抛转到K3数据库t_RP_NewReceiveBill表里面
    FBillID FSourceBillId  FSourceBillNO   FFASCSourceBillNo
    1           1            DCD0001000000001  100
    2           2            DCD0001000000002  200
    3           3            DCD0001000000003  230
    4           4            DCD0001000000004  500
    5           1            BCD0001000000001  100
    6           2            BCD0001000000002  300
    FSourceBillNO 的类型为  varchar(255)K3这张表 除了FSourceBillNO外没有其他字段能看出记录的来源(来自销售表还是退货表).
    做联接的时候用 k3.FSourceBillNO = pos.BillCode 由于字段太长,感觉效率慢
    就用 k3.FSourceBillID = pos.Keyid And Substring(k3.FSourceBillNO,1,1) = Substring(pos.BillCode,1,1)
    结果就造成了full 和inner时间差的很多
      

  6.   

    t_RP_NewReceiveBill
    的最后一个字段笔误,也是金额列 FAmount
      

  7.   

    刚仔细看了一下:
    POS数据库里面的 销售表单据编码:BillCode有索引所以K3表作为左表搜索POS能利用BillCode索引?
    也就是
    条件FSourceBillNO = BillCode 能利用索引
    条件BillCode = FSourceBillNO 不能利用索引