我写了一个查询
left join 和full join 只要10秒左右
inner join 和right join 却要3分钟。
一般情况下是什么原因造成差别这么大呢?我没有说表结构,我想这种问题大虾们应该遇到过。
如果这不是正常现象,我在后面补充上表结构。(结构描述以前有点麻烦)
left join 和full join 只要10秒左右
inner join 和right join 却要3分钟。
一般情况下是什么原因造成差别这么大呢?我没有说表结构,我想这种问题大虾们应该遇到过。
如果这不是正常现象,我在后面补充上表结构。(结构描述以前有点麻烦)
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)输出最终结果
可是我测试了好多遍 还是这样:
执行完full join 只要11秒
然后
DBCC DROPCLEANBUFFERS
DBCC FREEPROCCACHE
然后把full改成inner再执行。结果要2分40秒不过我是从两个数据库做join的
一个是K3数据库,另外一个是ERP系统
可能是这个原因吗?我这里没数据,明天到公司再确认一下。没搞定在把表结构和SQL语句写出来,请大家分析
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时间差的很多
的最后一个字段笔误,也是金额列 FAmount
POS数据库里面的 销售表单据编码:BillCode有索引所以K3表作为左表搜索POS能利用BillCode索引?
也就是
条件FSourceBillNO = BillCode 能利用索引
条件BillCode = FSourceBillNO 不能利用索引