zoukankan      html  css  js  c++  java
  • SQL中使用WITH AS提高性能

     

    代码
    WITH paths(path, EmployeeID) 
    AS (
    -- This section provides the value for the root of the hierarchy
    SELECT hierarchyid::GetRoot() AS OrgNode, EmployeeID 
    FROM #Children AS C 
    WHERE ManagerID IS NULL 

    UNION ALL 
    -- This section provides values for all nodes except the root
    SELECT 
    CAST(p.path.ToString() + CAST(C.Num AS varchar(30)) + '/' AS hierarchyid), 
    C.EmployeeID
    FROM #Children AS C 
    JOIN paths AS p 
       
    ON C.ManagerID = P.EmployeeID 
    )

    select * from Paths

     

     

    1. 案例起因

      公司门店应用程式每天都要出一份报表,用来统计任何商品当天的期初库存数量、入库数量、出库数量

      及当天的期末库存数量。运行半年以后,这份报表运行越来越慢,到现在,每次运行该报表显示当天数据时需要近20秒的时间。于是研发人员找到我,希望我看看,是不是能够使该报表运行的时间更短。

      该报表就是一段SQL语句,主要由三部分组成,第一部分是计算每个商品的期初数量,第二部分是计算每个商品的当天发生(包括入库和出库的)数量,第三部分是计算每个商品的期末数量,也就是当天的余额。每个部分使用UNION ALL连接起来。

      我看到该报表,第一个感觉就是这段SQL里的每个部分都要对表进行扫描,明显成本过高。应该能够使用WITH AS进行改写。

    2. WITH AS的含义

      WITH AS短语,也叫做子查询部分(subquery factoring),能够让您做很多事情,定义一个SQL片断,该SQL片断会被整个SQL语句所用到。有的时候,是为了让SQL语句的可读性更高些,也有可能是在UNION ALL的不同部分,作为提供数据的部分。

      特别对于UNION ALL比较有用。因为UNION ALL的每个部分可能相同,但是假如每个部分都去执行一遍的话,则成本太高,所以能够使用WITH AS短语,则只要执行一遍即可。假如WITH AS短语所定义的表名被调用两次以上,则优化器会自动将WITH AS短语所获取的数据放入一个TEMP表里,假如只是被调用一次,则不会。而提示materialize则是强制将WITH AS短语里的数据放入一个全局临时表里。很多查询通过这种方法都能够提高速度。

    3. 案例说明

      首先介绍该SQL所涉及到的主要的表的结构。该表表名为fin,用来存放每天每个商品的发生数连同该商

      品的余额数。其表结构为如下所示(这里我只选取了和我们要讨论的SQL相关的部分表字段)。

      SQL> desc fin

      名称 是否为空? 类型

      ----------------------------------------- -------- ----------------------------

      。。。。。。

      DAY DATE

      SKU VARCHAR2(8)

      INQTY NUMBER(16,6)

      OUTQTY NUMBER(16,6)

      LASTQTY NUMBER(16,6)

      。。。。。。。。

      简单解释一下各个字段的含义:

      1) DAY:发生的日期。

      2) SKU:发生交易的商品代码。

      3) INQTY:商品入库数量。

      4) OUTQTY:商品出库数量。

      5) LASTQTY:商品的余额数量。

      该表中含有的记录数量为:

      SQL> SELECT count(*) FROM fin;

      COUNT(*)

      ----------

      4729319

  • 相关阅读:
    printcap
    browser-ua
    PHP 开发 APP 接口 学习笔记与总结
    Java实现 LeetCode 72 编辑距离
    Java实现 LeetCode 72 编辑距离
    Java实现 LeetCode 72 编辑距离
    Java实现 LeetCode 71 简化路径
    Java实现 LeetCode 71 简化路径
    Java实现 LeetCode 71 简化路径
    Java实现 LeetCode70 爬楼梯
  • 原文地址:https://www.cnblogs.com/timy/p/1615185.html
Copyright © 2011-2022 走看看