请教下带有“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左右 展开
Price
FROM
product_price_info
WHERE ID IN
(SELECT
SourceID
FROM
mix_info
WHERE DestinationID = '1000'
AND SourceTable = 'product_price_info')
语句如上。两张表都是百万级别的,select出的数据都是只有几条。请教一下如何建立索引能得到比较高效的查询效率。现在基本查询都在10S左右 展开
5个回答
展开全部
改为:
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更快的理论。
展开全部
两个关联的列(product_price_info的ID,mix_info的SourceID)肯定要建索引;
另外,DestinationID 和 SourceTable 也要建上索引。
另外,这个查询完全可以改成 exists的啊,
更进一步,应该改成 不用子查询的。
另外,DestinationID 和 SourceTable 也要建上索引。
另外,这个查询完全可以改成 exists的啊,
更进一步,应该改成 不用子查询的。
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
在mix_info表的SourceTable和DestinationID上建立联合索引,并include SourceID;在product_price_info的ID上建立索引,并include Price。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
别用这个
换。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 )
换。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 )
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
用left join或者right join呢
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询