zoukankan      html  css  js  c++  java
  • 优化案例--改写IN条件为INNER JOIN

    --======================================
    --原始语句
    SET STATISTICS IO ON
    SELECT COUNT(DISTINCT parent_commender_id) AS COUNT
    FROM t_commend_day_total_info c WITH(NOLOCK) 
    WHERE 1 = 1 
    AND c.product_id IN  (1,2,4,5,6,7,8,9)
    AND parent_commender_id IN (
    SELECT id 
    FROM t_commender_user_property 
    WHERE status=4) 
    AND parent_commender_id IN (
    SELECT id 
    FROM t_commender_user_property 
    WHERE cooperation_way=0)
    AND c.datetime >= 20140103
    AND c.datetime <= 20140103
    /*
    (1 行受影响)
    表 'Worktable'。扫描计数 1,逻辑读取 883 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
    表 't_commender_user_property'。扫描计数 2,逻辑读取 38 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
    表 't_commend_day_total_info'。扫描计数 200,逻辑读取 398042 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
    */
    /*

    --===================================
    --由于满足以下条件中一个或多个
    --1.条件IN中外部数据与子查询数据是一对一的关系
    --2.对查询结果排重
    --因此可以将IN条件改写为INNDE JOIN
    --===================================

    --==================================
    --改写后语句
    SET STATISTICS IO ON
    SELECT COUNT(DISTINCT parent_commender_id) AS COUNT
    FROM t_commend_day_total_info c WITH(NOLOCK) 
    INNER JOIN t_commender_user_property T1 
    ON T1.id=parent_commender_id
    WHERE T1.status=4 AND T1.cooperation_way=0
    AND c.product_id IN  (1,2,4,5,6,7,8,9)
    AND c.datetime >= 20140103
    AND c.datetime <= 20140103
    /*
    表 't_commender_user_property'。扫描计数 1,逻辑读取 19 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
    表 'Worktable'。扫描计数 0,逻辑读取 0 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
    表 't_commend_day_total_info'。扫描计数 1,逻辑读取 2082 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
    */
    /*

    在将IN条件改成INNER JOIN 时,一定要考虑数据是一对一还还是一对多以及多对一的关系, 如果是一对多的关系,需要对查询结果集排重。

    如果除IN条件外的条件可以过滤掉大部分数据,则考虑使用IN 如果需要依赖IN条件来过滤大部分数据,则考虑使用INNER JOIN 在改写语句前需检查统计是否过期,预估执行行数和实际执行行数之间差距。

  • 相关阅读:
    LeeCode-Spiral Matrix II
    HDU1281(二分图最大匹配,棋盘建图,找关键点)
    HDU1083(二分图最大匹配vector实现)
    HDU2444(判断是否为二分图,求最大匹配)
    HDU1166(线段树单点更新区间查询)
    HDU1045(二分图经典建模)
    POJ1220(大数进制转换)
    POJ3466(01背包变形)
    POJ3180(有向图强连通分量结点数>=2的个数)
    POJ1236 (强连通分量缩点求入度为0和出度为0的分量个数)
  • 原文地址:https://www.cnblogs.com/TeyGao/p/3524178.html
Copyright © 2011-2022 走看看