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 在改写语句前需检查统计是否过期,预估执行行数和实际执行行数之间差距。

  • 相关阅读:
    Android 之 JSON操作
    android 之 XMLPull
    DOM 之 SAX操作
    android之DOM生成与解析
    parseDouble()方法
    读取遥感图像中遇到的问题集锦
    xml学习
    linux基础
    hadoop的基本概念 伪分布式hadoop集群的安装 hdfs mapreduce的演示
    【原】自定义tableViewCell的两种方法
  • 原文地址:https://www.cnblogs.com/TeyGao/p/3524178.html
Copyright © 2011-2022 走看看