请教下带有“IN”的SQL查询语句索引问题

SELECTPriceFROMproduct_price_infoWHEREIDIN(SELECTSourceIDFROMmix_infoWHEREDestination... SELECT
Price
FROM
product_price_info
WHERE ID IN
(SELECT
SourceID
FROM
mix_info
WHERE DestinationID = '1000'
AND SourceTable = 'product_price_info')
语句如上。两张表都是百万级别的,select出的数据都是只有几条。请教一下如何建立索引能得到比较高效的查询效率。现在基本查询都在10S左右
展开
 我来答
swings2010
推荐于2017-09-11 · TA获得超过966个赞
知道答主
回答量:381
采纳率:0%
帮助的人:291万
展开全部

改为:

SELECT 
  ppi.Price
FROM
  product_price_info ppi ,mix_info mi
where ppi.id = mi.SourceID
and mi.DestinationID = '1000' 
AND mi.SourceTable = 'product_price_info'

在ppi.id, mi.sourceId, mi.destinationId, mi.sourceTable上建立btree索引即可。

如果当前环境是OLAP,并且distinct mi.SourceTable的键值不多的情况下,可以考虑使用bitmap索引;

如果对表mix_info所有查询的条件固定,可以考虑将其三个条件按顺序建立组合索引;

注意控制两表中索引数量;

如果ppi.price在表中columnid比较大,且有其他对该表的查询有price的条件过滤,可以考虑将该列也建立索引,避免TABLE ACCESS BY INDEX操作;

如果还需要继续做相应优化,请提供执行计划。


如果当前版本是11g,请忽视exist比in更快的理论。

micro0369
2014-06-19 · TA获得超过1.2万个赞
知道大有可为答主
回答量:9250
采纳率:85%
帮助的人:4076万
展开全部
两个关联的列(product_price_info的ID,mix_info的SourceID)肯定要建索引;

另外,DestinationID 和 SourceTable 也要建上索引。

另外,这个查询完全可以改成 exists的啊,

更进一步,应该改成 不用子查询的。
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
frogley
2014-06-19 · TA获得超过1854个赞
知道小有建树答主
回答量:1008
采纳率:50%
帮助的人:1084万
展开全部
在mix_info表的SourceTable和DestinationID上建立联合索引,并include SourceID;在product_price_info的ID上建立索引,并include Price。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
helly84
2014-06-19 · TA获得超过329个赞
知道小有建树答主
回答量:737
采纳率:77%
帮助的人:329万
展开全部
别用这个
换。exists 肯定快。。
SELECT
Price
FROM
product_price_info
WHERE exists
(SELECT
1
FROM
mix_info
WHERE DestinationID = '1000'
AND SourceTable = 'product_price_info'
and SourceID = ID )
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
为自己加油lili
2014-06-19 · 超过93用户采纳过TA的回答
知道小有建树答主
回答量:318
采纳率:78%
帮助的人:86.1万
展开全部
用left join或者right join呢
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
收起 更多回答(3)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式