SELECT *
FROM commodity_info,commodity
WHERE ( commodity_info.COM_ID = commodity.COM_ID )
and (
(commodity.com_code like '%b000002%')
or
(
commodity_info.com_id in (select commodity_info.down_comid from commodity,commodity_info where commodity.com_id=commodity_info.com_id and commodity.com_code like '%b000002%')
)
)
SELECT *
FROM commodity_info,commodity
WHERE ( commodity_info.COM_ID = commodity.COM_ID )
and (
(commodity.com_code like '%b000002%')
or
(
commodity.com_id in (select commodity_info.down_comid from commodity,commodity_info where commodity.com_id=commodity_info.com_id and commodity.com_code like '%b000002%')
)
)这两条语句的区别是 or后表名不同,其他的地方都一样。
他们的执行效果差别很大,第一条,两分钟,第二条,1秒钟。
查看执行计划后发现,第一条是没有使用索引IX_COM_COMCODE,而是使用的聚集索引PK_COMMODITY。
那位高手能帮忙解释一下为什么?
FROM commodity_info,commodity
WHERE ( commodity_info.COM_ID = commodity.COM_ID )
and (
(commodity.com_code like '%b000002%')
or
(
commodity_info.com_id in (select commodity_info.down_comid from commodity,commodity_info where commodity.com_id=commodity_info.com_id and commodity.com_code like '%b000002%')
)
)
SELECT *
FROM commodity_info,commodity
WHERE ( commodity_info.COM_ID = commodity.COM_ID )
and (
(commodity.com_code like '%b000002%')
or
(
commodity.com_id in (select commodity_info.down_comid from commodity,commodity_info where commodity.com_id=commodity_info.com_id and commodity.com_code like '%b000002%')
)
)这两条语句的区别是 or后表名不同,其他的地方都一样。
他们的执行效果差别很大,第一条,两分钟,第二条,1秒钟。
查看执行计划后发现,第一条是没有使用索引IX_COM_COMCODE,而是使用的聚集索引PK_COMMODITY。
那位高手能帮忙解释一下为什么?
所以下边的条件,用commodity_info.COM_ID 和commodity.COM_ID是一样的。
commodity中com_id是主键,com_code有索引,非聚集非唯一的。
commodity_info中com_id和mod_id是主键,com_id是commodity的外键。
com_id是什么个情况?commodity.com_id 又是什么个情况。
从执行计划来看第一个是两个表join 在串联 后面的or条件第二个是对表commodity赛选之后 和commodity_info 进行join这样的话第二个当然是大优了
简直就是一朵奇葩
FROM commodity_info,commodity
WHERE ( commodity_info.COM_ID = commodity.COM_ID )
and commodity.com_code like '%b000002%'的结果是一样的啊
SELECT *
FROM commodity_info
INNER JOIN commodity
WHERE commodity_info.COM_ID = commodity.COM_ID
AND commodity.com_code like '%b000002%'
你写的是ANSI SQL-89的写法,只支持内连接,交叉连接
我写的是ANSI SQL-92的写法,支持内连接,外连接,交叉连接
所以就IN中的条件和(commodity.com_code like '%b000002%') 一块处理啦,
然后再和commodity_info 进行inner join呀?因为第一条语句的条件,既有commodity表的字段,也有commodity_info表的字段,
所以,首先,commodity和commodity_info两个表合并,取出commodity_info.com_id和commodity.com_code,然后再对应下边这两个字段的条件进行处理吗??
图片右边显示不全,不知道怎么回事
SELECT * FROM commodity_info,commodity
WHERE ( commodity_info.COM_ID = commodity.COM_ID )
and ((commodity.com_code like '%b000002%')
or(exists(select 1 from commodity a,commodity_info b
where a.com_id=b.com_id
and a.com_code like '%b000002%'
and b.down_comid=commodity_info.com_id)))--------------------------------------------------------------
SELECT * FROM commodity_info,commodity
WHERE ( commodity_info.COM_ID = commodity.COM_ID )
and ((commodity.com_code like '%b000002%')
or(exists(select 1 from commodity a,commodity_info b
where a.com_id=b.com_id
and a.com_code like '%b000002%'
and b.down_comid=commodity.com_id))
改成exists后,执行速度和执行计划和原来一样,下班了,先回家
还有为什么它不使用索引IX_COM_COMCODE?
顶一下
commodity中com_id是主键,com_code有索引,非聚集非唯一的。
commodity_info中com_id和mod_id是主键,com_id是commodity的外键,down_comid,表示该COM_ID的下级COM_ID,大包装商品的对应的小包装商品。