做事变通

2023-11-13

author:skate
time:2010/05/21


 

做事变通


昨天同事找我,说bi系统的有一个递归树形查询的sql非常慢,已经让使用人员无法忍受

 

sql如下:

 

SELECT SYS_CONNECT_BY_PATH(BB.FULL_NAME, '/') PATH, BB.*
  FROM (WITH AA AS (SELECT TRUNC(W.END_TIME, 'mm') END_TIME,
                           O.MERCHANT_ID,
                           SUM(O.MONEY) MONEY,
                           SUM(O.BONUS) BOUNS
                      FROM BI_ORDERJOINTOGETHER O, BI_WARE W
                     WHERE O.WARE_ID = W.ID
                       AND O.STATE = 4
                     GROUP BY TRUNC(W.END_TIME, 'mm'), O.MERCHANT_ID)
         SELECT OG.ORG_ID,
                OG.FULL_NAME,
                OG.PARENT_ID,
                TO_CHAR(AA.END_TIME, 'yyyy-mm'),
                NVL(AA.MONEY, 0) MONEY,
                NVL(AA.BOUNS, 0)
           FROM BI_ORGANIZATION OG, AA
          WHERE AA.MERCHANT_ID(+) = OG.ORG_ID) BB
          START WITH BB.PARENT_ID IS NULL
         CONNECT BY PRIOR BB.ORG_ID = BB.PARENT_ID

 

在分析这个sql之后,发现sql慢的原因是start with的树形递归和函数SYS_CONNECT_BY_PATH,其实主要是
start with,因为他每一level都要遍历所有的节点所以速度非常慢,想半天没有想到什么好的方法来优化
这个sql,但这个还是业务需要的,怎么办呢?

 

我又从头理顺下了思路,这个是一个bi系统,为业务部门和决策者提供服务,bi系统里的数据比生产数据晚
一天,目前这个sql很慢,又很难优化,那如何为前端用户提供优质的服务呢?为什么不把这个sql的数据事先
准备好,然后平时就直接查询准备好的数据,这样就省去计算排序的时间了,就可以大大提高性能。经过测试
发现,速度发生几个数量级的变化.

 

通过这个case,可以总结一个经验,条条大路通罗马,有的时候退一步思考会得到意想不到的效果,做人做事都是
一样的,不要钻死角

 

 

-----end----

 

 

 

 

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

做事变通 的相关文章

  • 如何使用一个命令删除 SQL 数据库中的所有索引?

    那么 如何通过一条命令删除 SQL 数据库中的所有索引呢 我有这个命令可以获取所有 20 个左右的 drop 语句 但是如何从这个 结果集 运行所有这些 drop 语句呢 select from vw drop idnex 给我相同列表的另
  • SQL Server 中的 FIFO 查询

    我正在构建一个库存管理应用程序c with SQL server 我想做一个FIFO从我的表查询 我以可变价格购买了相同的产品 之后我卖掉了其中一些 我想根据 先进先出 进行查询BatchDate柱子 所以我想通过PurchasePrice
  • 更改表添加列并在同一条件 IF 语句中更新新列

    我正在尝试添加列并在同一 if 语句中更新它 BEGIN TRAN IF NOT EXISTS SELECT 1 FROM sys columns WHERE Name N Code AND Object ID Object ID N Te
  • 计算2个日期之间每个日期的记录数

    我必须创建一个查询来返回多轴图表的结果 我需要计算为 2 个日期之间的每个日期创建的 ID 数量 我试过这个 DECLARE StartDate datetime2 7 11 1 2020 EndDate datetime2 7 2 22
  • 查看Jasper报告执行的SQL

    运行 Jasper 报表 其中 SQL 嵌入到报表文件 jrxml 中 时 是否可以看到执行的 SQL 理想情况下 我还想查看替换每个 P 占位符的值 Cheers Don JasperReports 使用 Jakarta Commons
  • MySQL NOT IN 来自同一个表中的另一列

    我想运行 mysql 查询来选择表中的所有行films其中的值title该列不存在于另一列的所有值中的任何位置 collection 这是我的表格的简化版本 其中包含内容 mysql gt select from films id titl
  • 消息 203,级别 16,状态 2,不是有效标识符

    我收到以下错误 消息 203 级别 16 状态 2 过程 getQuestion 第 18 行名称 select top 1 from tlb Question inner join tlb options on tlb options q
  • 如何将今天的日期返回到 Oracle 中的变量

    我想做这个 DECLARE today as smalldatetime SELECT today GetDate 但我需要一个oracle翻译 甲骨文使用SYSDATE 还有 ANSI 标准CURRENT TIMESTAMP 除其他外 S
  • 使用 DISTINCT 进行查询需要很长时间

    我正在使用 Microsoft Access 2003 我的项目中的一个表单需要很长时间才能向用户显示 这是适用的查询 SELECT DISTINCT tb KonzeptDaten DFCC tb KonzeptDaten OBD Cod
  • 在 plpgsql 函数中使用 quote_ident()

    我是创建 plpgsql 函数的新手 我需要一些有关在函数内部执行的动态命令上使用 quote ident 甚至 quote literal 的说明 希望有人能给我一个关于它们如何在函数内部工作的具体解释 TIA 这是一个例子 EXECUT
  • 从表中选择行,其中另一个表中具有相同 id 的行在另一列中具有特定值

    在 MySQL 中 如果我们有两个表 comments key value 1 foo 2 bar 3 foobar 4 barfoo and meta comment key value 1 1 2 1 3 2 4 1 我想得到来自以下人
  • 基本的多对多sql选择查询

    我认为这应该很容易 但它却在逃避我 我的帐户和帐户组之间存在多对多关系 一个帐户可以位于零个或多个组中 因此我使用标准连接表 Accounts ID BankName AcctNumber Balance AccountGroups ID
  • 默认情况下在sql日期时间列中插入null/空值

    如何在 SQL Server 中创建一个表 默认日期时间为空 而不是1900 01 01 00 00 00 000我得到了 我的意思是 如果没有插入值 则默认值应该为 null 空等 如果没有插入值 默认值应该是null empty 在表定
  • WPF - 路径几何...有没有办法绑定数据属性?

    我有一个ControlTemplate作为 气泡 弹出窗口AdornerLayer给定的控制 它工作正常 但我需要能够计算它应该显示的位置 中间 底部 代替
  • 替换字符串中的多个字符,而不使用任何嵌套替换函数

    我的表中存储了一个方程 我一次获取一个方程 并希望将所有运算符替换为任何其他字符 输入字符串 N 100 6858 6858 N 100 0 2 N 35 运算符或模式 替换字符 输出字符串 N 100 6858 6858 N 100 0
  • 处理ON INSERT触发器时,innodb表如何锁定?

    我有两个 innodb 表 articles id title sum votes 1 art 1 5 2 art 2 8 3 art 3 35 votes id article id vote 1 1 1 2 1 2 3 1 2 4 2
  • 重建数据库中的所有索引

    我有一个非常大的 SQL Server 2008 R2 数据库 1 5TB 并将在同一个表中的列之间复制一些数据 我被告知该架构有大量索引 并且想知道是否有默认查询或脚本可以重建所有索引 是否也被建议同时更新统计数据 30 个表中的每一个都
  • 限制分页页数

    objConnect mysql connect localhost root or die mysql error objDB mysql select db Test strSQL SELECT FROM UserAddedRecord
  • MySQL 正在将我的时间戳值转换为 0000-00-00

    我是 PHP 新手 目前仍在学习中 我认为我的注册表有问题 username password email全部成功插入MySQL registered and last seen不要 我以为我正在使用getTimestamp 错了 但它呼应
  • Oracle SQL-根据记录的日期与历史记录标记记录

    这是我在论坛上的第一篇文章 通常我能够找到我需要的东西 但说实话 我不太确定如何针对该问题提出正确的问题 因此 如果论坛上已经有答案而我错过了 请接受我的歉意 我通过 Benthic Software 在 Oracle 数据库中运行以下代码

随机推荐

  • 移动端适配多种方案详细分析

    目录 基本概念 1 像素 2 设备独立像素 3 设备像素比 device pixel ratio 4 分辨率 5 viewport 视口 适配方案 1 百分比 2 rem 3 vh vw 4 rem vw vh 5 媒体查询 media A
  • 小程序showLoading:网络请求前显示“加载中...”,请求完成时关闭加载中

    showLoading加载中提示框显示 以及消除提示框 wx showLoading title 加载中 wx request url success res fail 添加wx hideLoading 一定要添加到complete里 co
  • centos安装配置OPEN*PN

    centos安装配置OPENVPN 安装程序 生成证书密钥 创建PKI 生成CA证书 为服务器生成证书密钥 为客户端生成证书密钥 生成Diffie hellman 参数 生成TLS认证密钥 编辑openvpn服务器配置文件 1 复制配置示例
  • ubuntu18.04取消自动锁屏

    在设置 隐私里面修改
  • Struts2+MyBatis3.1.0+Spring3.1.0整合之道二SqlSessionTemplate

    相关框架搭建在Struts2 MyBatis3 1 0 Spring3 1 0整合之道一 数据映射接口 已经讲解的非常详细 这里就不在讲述SSI框架的搭建 1 采用接口org apache ibatis session SqlSession
  • 解决UnicodeDecodeError: ‘gbk‘ codec can‘t decode byte 0x80 in position 0: illegal multibyte sequence问题

    1 解决Python报错UnicodeDecodeError gbk codec can t decode byte 0x80 in position 658 illegal multibyte with open in file r as
  • 【OpenCV4】计算对称矩阵特征值和特征向量 cv::eigen() 用法详解和代码示例(c++)

    函数原型 bool cv eigen InputArray src OutputArray eigenvalues OutputArray eigenvectors noArray 解析 src 输入矩阵 只能是 CV 32FC1 或 CV
  • guid会不会重复_详解oracle数据库唯一主键SYS_GUID()

    概述 在oracle8i以后提供了一个生成不重复的数据的一个函数sys guid 一共32位 生成的依据主要是时间和机器码 具有世界唯一性 类似于java中的UUID 都是世界唯一的 SYS GUID SYS GUID同Oracle管理员所
  • 阿里影业的稳健业绩来源:科技+内容塑造韧性,应对市场变化

    随着 阿凡达 水之道 简称 阿凡达2 预售佳绩的显现 电影业的复苏已然箭在弦上 12月7日 阿凡达2 正式开启预售 灯塔专业版数据显示 其预售开启4小时后 总票房破500万 6小时左右突破1000万 截至12月8日下午16 58 53 这个
  • 第一次竞赛-D.量子能力猫

    猫从薛定谔的箱子里成功存活并逃脱出来 这时它发现它已经掌握了量子力学的原理并拥有运用量子的能力 即便这样它还是克服不了它喜欢钻入纸箱的天性 假设现在有一排纸箱的一端从0开始依次编号 这只猫可以以如下的方式在箱子之间行动 走到相邻箱子 从第X
  • Pyqt5设置窗口的背景

    Pyqt5设置窗口的背景 一 使用setStyleSheet 函数设置窗口背景 二 使用QPalette设置窗口背景 三 通过资源文件设置窗口背景 一 使用setStyleSheet 函数设置窗口背景 在使用setStyleSheet 函数
  • JS:概述、使用方式、数据类型、运算符和流程控制语句

    什么是JS JavaScript是一门客户端轻量级脚本语言 它不需要编译 直接就可以被浏览器解析执行 每一个浏览器都有JS的解析引擎 该语言用来控制html元素 让界面有一些动态的效果 增强用户和html页面的互动 1992年 Nombas
  • 开关电源的八大损耗

    开关电源的八大损耗 沙漠的甲壳虫的博客 CSDN博客 开关电源的损耗大部分来自开关器件 MOSFET 和二极管 另外小部分损耗来自电感和电容 但是 如果使用非常廉价的电感和电容 具有较高电阻 将会导致损耗明显增大 选择IC 时 需要考虑控制
  • 国际网络专线:连接全球的数字高速公路

    国际网络专线是一种高速 可靠的网络服务 可以连接全球各地 为企业提供快速的数据传输和通信 随着全球化的发展和信息技术的不断进步 越来越多的企业需要跨越国界进行商务活动和数据传输 国际网络专线成为实现这一目标的重要途径之一 国际网络专线通过使
  • python如何输出一个数组_使用Python实现分别输出每个数组

    使用Python实现分别输出每个数组 我就废话不多说了 直接上代码吧 a 1 2 3 4 5 6 7 a b c i 0 while i print a i i 1 a 1 2 3 4 5 6 7 a b c for i in range
  • 特征值处理-机器学习

    综述 如上图所示是一个经典的机器学习问题框架图 数据清洗和特征挖掘的工作是在灰色框中框出的部分 即 数据清洗 gt 特征 标注数据生成 gt 模型学习 gt 模型应用 中的前两个步骤 灰色框中蓝色箭头对应的是离线处理部分 主要工作是 从原始
  • C/C++调用前缀

    今天写线程函数时 发现msdn中对ThreadProc的定义有要求 DWORD WINAPI ThreadProc LPVOID lpParameter 不解为什么要用WINAPI宏定义 查了后发现下面的定义 于是乎需要区别 stdcall
  • 在Google地图中显示行政区边界

    不知道从什么时候开始 在Google地图或是百度地图中用城市或者省名称搜索的时候 你会发现地图上会勾勒出搜索的行政区的轮廓来 这个功能非常人性化 比如在百度地图中搜索 广西 地图显示如下图所示 在Google地图中搜索 桂林 会定位到桂林市
  • LaTex如何设置表格列宽以及居中格式

    用LaTex写论文时 被一个表格困扰好久 不过终于找到解决方法 代码放在这里方便以后查询 begin table h caption 符号说明 centering begin tabular p 3cm lt centering p 7cm
  • 做事变通

    author skatetime 2010 05 21 做事变通 昨天同事找我 说bi系统的有一个递归树形查询的sql非常慢 已经让使用人员无法忍受 sql如下 SELECT SYS CONNECT BY PATH BB FULL NAME