32位oracle_ORACLE如何优化代码将查询速度从5s提升到0.1s
#系统# #程序员#
前言
浙江客户的ERP系统,ORACLE数据库从32位升级64位,不知为何查询一下子很慢,但在32位上没有这个现像,郁闷。
没有问题不正常,否则不付款给我
实现功能
传入一个物料参数查询全局物料共用表中有那些物料同它是有共用关系。
表结构如下
键值(RKEY),物料1(INVT_PTR_1),物料2(INVT_PTR_2),物料3(INVT_PTR_3),物料4(INVT_PTR_1)
只有1063条记录
————————————————
解决思路
没有优化前的代码,有多个同一表重复链接,因此要把它分离出来实现单表查询。
老板,马上解决哈
未优化的代码
- sql.add('SELECT C.INV_PART_DESCRIPTION_C,SUM(A.QTY_BOM) QTY,C.INV_PART_NUMBER');
- sql.add('FROM DATA0026 A,DATA0017 B,DATA0017 C'); ---DATA0026(BOM明细表148057条记录),DATA0017(物料表21963)
- sql.add('WHERE A.INVENTORY_PTR=B.RKEY');
- sql.add('AND A.SOURCE_PTR=C.RKEY');
- sql.add('AND C.TTYPE<>1');
- sql.add('AND C.STATUS=1');
- sql.add('AND ((B.RKEY='+Floattostr(minv)+')');--含传入物料参数本身
- SQL.ADD('OR (B.RKEY IN (');
- SQL.ADD('SELECT B.RKEY');
- sql.add('FROM DATA0026_SHARE A,DATA0017 B'); --DATA0026_HARE(全局共用的料明细表1063条记录)
- sql.add('WHERE (A.INVT_PTR_1=B.RKEY');
- sql.add('OR A.INVT_PTR_2=B.RKEY');
- sql.add('OR A.INVT_PTR_3=B.RKEY');
- sql.add('OR A.INVT_PTR_4=B.RKEY');
- sql.add(')');
- sql.add('AND (A.INVT_PTR_1='+Floattostr(minv));--传入物料参数
- sql.add('OR A.INVT_PTR_2='+Floattostr(minv));--传入物料参数
- sql.add('OR A.INVT_PTR_3='+Floattostr(minv));-传入物料参数
- sql.add('OR A.INVT_PTR_4='+Floattostr(minv)+')');-传入物料参数
- SQL.add(')))');
- Sql.add('GROUP BY C.INV_PART_DESCRIPTION_C,C.INV_PART_NUMBER')
从前面看,工程师写的代码是否有问题,你说没有问题(32位上OK),但又觉得他有问题(64位上慢),叫DBA排查半天也不知所以然,干脆对代码动手术了。
优化后代码
1:先将共用物料的键值取出
with dmdatapublic.qrypublic do
begin
Close;
sql.clear;
sql.add('SELECT B.INVT_PTR_1,B.INVT_PTR_2,B.INVT_PTR_3,B.INVT_PTR_4');
sql.add('FROM DATA0026_SHARE B');
sql.add('WHERE B.INVT_PTR_1='+Floattostr(minv)+' OR B.INVT_PTR_2='+Floattostr(minv)+' OR B.INVT_PTR_3='+Floattostr(minv)+' OR B.INVT_PTR_4='+Floattostr(minv));
open;
minv1:=Fieldbyname('INVT_PTR_1').AsFloat;//查到变量1
minv2:=Fieldbyname('INVT_PTR_2').AsFloat;//查到变量2
minv3:=Fieldbyname('INVT_PTR_3').AsFloat;//查到变量3
minv4:=Fieldbyname('INVT_PTR_4').AsFloat;//查到变量4
close;
2:然后直接传递到
sql.add('SELECT C.INV_PART_DESCRIPTION_C,A.QTY_BOM QTY,C.INV_PART_NUMBER');
sql.add('FROM DATA0026 A,DATA0017 C');
sql.add('WHERE A.SOURCE_PTR=C.RKEY');
sql.add('AND C.TTYPE>1');
sql.add('AND ((A.INVENTORY_PTR='+Floattostr(minv)+')');
sql.add('OR (A.ALTER_INVENTORY_PTR>0 AND A.ALTER_INVENTORY_PTR='+Floattostr(minv)+')');
sql.add('OR (A.ALTER_INVENTORY_PTR_1>0 AND A.ALTER_INVENTORY_PTR_1='+Floattostr(minv)+')');
if minv1>0 then
SQL.ADD('OR (A.INVENTORY_PTR='+Floattostr(minv1)+')');
if minv2>0 then
SQL.ADD('OR (A.INVENTORY_PTR='+Floattostr(minv2)+')');
if minv3>0 then
SQL.ADD('OR (A.INVENTORY_PTR='+Floattostr(minv3)+')');
if minv4>0 then
SQL.ADD('OR (A.INVENTORY_PTR='+Floattostr(minv4)+')');
sql.add(')');
Sql.add('ORDER BY C.INV_PART_DESCRIPTION_C');
32位oracle_ORACLE如何优化代码将查询速度从5s提升到0.1s相关推荐
- 负数显示红字html语言,需要将单元格内的负数显示为红色且不带负号显示两位小数的格式代码是下面哪一种A、 0.00;[红色...
需要将单元格内的负数显示为红色且不带负号显示两位小数的格式代码是下面哪一种A. 0.00;[红色 更多相关问题 SPEC性能测试能比时钟频率更全面地反映计算机处理器.存储结构和编译器的性能.它有两种表 ...
- 32位oracle_oracle 性能调优
pool,sga,pga的配置 物理内存16G 在调整SGA前,先看下服务器操作系统是32位还是64位的,如果是32位的,则SGA最大不能超过1.7G,如果是64位的,则不能超过4G. 基本分配原则, ...
- 32位oracle_Oracle 之Hugepage
1. Hugepage基本概念 系统进程是通过虚拟地址访问内存,但是CPU必须把它转换成物理内存地址才能真正访问内存. 为了提高这个转换效率,CPU会缓存最近的"虚拟内存地址和物理内存地址& ...
- 32位处理器AM6528BACDXEA、AM6548BACDXEAF基于Arm Cortex-A53内核【工业4.0嵌入式产品应用】
AM6528BACDXEA.AM6548BACDXEAF 处理器是专为满足工业4.0嵌入式产品对处理性能的复杂需求而设计的Arm®应用处理器.AM654x和AM652x器件将四个或两个Arm® Cor ...
- Oracle物化视图优化多表查询速度
近期项目中遇到有关报表查询sql速度过慢的问题,由于sql是多个表相关联的查询结果,并且数据量过大,所以导致查询速度过慢.为此,采用物化视图来提高查询速度. 1.物化视图概述 物化视图是包括一个查询结 ...
- Bootstrap4+MySQL前后端综合实训-Day06-PM【MD5加码-生成32位md5码、ResultData.java、分页查询用户数据、添加用户按钮的实现】
[Bootstrap4前端框架+MySQL数据库]前后端综合实训[10天课程 博客汇总表 详细笔记][附:实训所有代码] 目录 MD5加码 生成32位md5码 ResultData.java 分页查询 ...
- 64位进程调用32位dll的解决方法 / 程序64位化带来的问题和思考
最近做在Windows XP X64,VS2005环境下做32位程序编译为64位程序的工作,遇到了一些64位编程中可能遇到的问题:如内联汇编(解决方法改为C/C++代码),long类型的变化,最关键的 ...
- 一句话总结Windbg 32位版本和64位版本的选择
惯了Vsiual Studio的兄弟们可能会因为先入为主的原因以为所有的调试器都应该像它那样,其实不然, 当你安装 Debugging Tools for Windows的时候,你将发现有两个系列的工 ...
- 操作系统开发系列—2.进入32位保护模式
源码如下: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 3 ...
- 16位模式/32位模式下PUSH指令探究——《x86汇编语言:从实模式到保护模式》读书笔记16...
一.Intel 32 位处理器的工作模式 如上图所示,Intel 32 位处理器有3种工作模式. (1)实模式:工作方式相当于一个8086 (2)保护模式:提供支持多任务环境的工作方式,建立保护机制 ...
最新文章
- java中bjt和utc转化_如何在Java中转换UTC和本地时区
- 黑鹰长期班.边程浪子系列教程
- java责任链模式的三种方式,分享一点面试小经验
- BZOJ 2429: [HAOI2006]聪明的猴子【最小生成树】
- HTTP协议 -- TCP/IP通信传输流
- Sharepoint2013商务智能学习笔记之Secure Store Service服务配置(二)
- 逾期了,如何消除不良记录?
- 如何解决vuepress部署出现样式问题
- loadrunner自学笔记-性能测试的注意要点
- python保存不了_新手,我的python保存不了文件
- 你不能强迫别人进步,跟别人没法强迫你进步一样
- C语言编译软件安装教程(Dev-C++版)
- TCP 协议(包含三次握手,四次挥手)
- SAP中质检检验计划导出实例
- JS实现自定义右键菜单
- ModHOMM3 使用说明
- 做职场里的“超级英雄”,需要怎样的盔甲与工具?
- 词向量介绍以及Word2Vec的pytorch实现
- Java phantomjs 网页截图
- Pohlig-Hellman算法解决DLP问题