如何使用子查询创建GI?基于指定SQL语句的需求咨询
基于子查询实现目标数据筛选及索引创建
原SQL功能说明
你给出的SQL语句用于关联Mtable和OTable,提取每个OrderId对应的OTable中OpId最小的关联记录。核心是通过相关子查询获取每个订单的最小操作ID,再匹配主表数据:
Select * from Mtable M, OTable O where M.OrderId=O.OrderId and O.OpId in (Select Min(OpId) from OTable OA where OA.OrderId=O.OrderId)
优化后的子查询写法
如果想让逻辑更清晰,可通过子查询预计算每个OrderId的最小OpId,再通过JOIN关联,避免相关子查询的重复计算:
SELECT M.*, O.* FROM Mtable M INNER JOIN OTable O ON M.OrderId = O.OrderId INNER JOIN ( -- 子查询预计算每个OrderId的最小OpId SELECT OrderId, MIN(OpId) AS min_op_id FROM OTable GROUP BY OrderId ) OA ON O.OrderId = OA.OrderId AND O.OpId = OA.min_op_id
创建适配查询的索引(GI)
如果这里的GI指用于提升查询性能的全局索引,可给OTable创建复合索引,覆盖子查询和关联所需字段:
CREATE INDEX idx_otable_order_opid ON OTable(OrderId, OpId);
该索引能让数据库快速分组计算最小OpId,同时加速主查询中OrderId与OpId的匹配过程。
内容的提问来源于stack exchange,提问作者user2803805
相关产品推荐
相关产品推荐

