日期:2014-05-17  浏览次数:20477 次

查询语句,执行计划中索引是如何选用的?
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。
那位高手能帮忙解释一下为什么?

------解决方案--------------------
探讨

引用:
表名都不一样,有什么好对比的。

因为commodity_info.COM_ID = commodity.COM_ID,
所以下边的条件,用commodity_info.COM_ID 和commodity.COM_ID是一样的。

------解决方案--------------------
commodity_info.com_id

这个是详细表?
com_id是什么个情况?

commodity.com_id 又是什么个情况。


从执行计划来看第一个是两个表join 在串联 后面的or条件

第二个是对表commodity赛选之后 和commodity_info 进行join

这样的话第二个当然是大优了

------解决方案--------------------
感觉LZ应该只是想作个测试吧,要不不可能写出这么低级的SQL语句
------解决方案--------------------
探讨
引用:

引用:
你这个和

SQL code

SELECT *
FROM commodity_info,commodity
WHERE ( commodity_info.COM_ID = commodity.COM_ID )
and commodity.com_code like '%b000002%'


的结果是一样的啊。。。
……

------解决方案--------------------
探讨
注意一下,IN中取出来的值是down_comid,抱歉,刚才讲表结构的时候,忘记这个字段啦,他表示该COM_ID的下级COM_ID,大包装商品的对应的小包装商品。