
楼主测一下结果集是否正确
declare @lFAD01 int
set @lFAD01 = 605
SELECT
case aVBL04 when 2 then '门诊挂号' else '门诊收费' end 业务类别
, bAAO02 支付类型
, aVBL14 支付方式
, SUM(case aVBL05 when 4 then aVBL13 else 0 END) 退费
, SUM(case aVBL05 when 4 then 0 else aVBL13 END) 收费
, SUM(aVBL13) 实收
FROM V_VBL_Full a
JOIN AAO1 b ON aVBL15 = bAAO01
JOIN vaa1 c ON cvaa01 = avaa01
WHERE VBL17 = @lFAD01 and aVBL04 >= 2 and aVBL04 <= 3
and not exists(select 1 from IAS1 where IAS1VAK01=aVAK01)
AND NOT EXISTS(SELECT 1 FROM V_VBL_Full AS a1 WHERE (a1VBL01=aVBL01 OR aVBL01A=a1VBL01) AND EXISTS(SELECT 1 FROM IAS1 WHERE VAK01=a1VAK01))
GROUP BY case aVBL04 when 2 then '门诊挂号' else '门诊收费' END,bAAO02,aVBL14
你最好买一本专门讲ORACLE性能优化的书,好好看看\x0d\1、调整数据库服务器的性能\x0d\Oracle数据库服务器是整个系统的核心,它的性能高低直接影响整个系统的性能,为了调整Oracle数据库服务器的性能,主要从以下几个方面考虑: \x0d\11、调整 *** 作系统以适合Oracle数据库服务器运行\x0d\Oracle数据库服务器很大程度上依赖于运行服务器的 *** 作系统,如果 *** 作系统不能提供最好性能,那么无论如何调整,Oracle数据库服务器也无法发挥其应有的性能。 \x0d\111、为Oracle数据库服务器规划系统资源 \x0d\据已有计算机可用资源, 规划分配给Oracle服务器资源原则是:尽可能使Oracle服务器使用资源最大化,特别在Client/Server中尽量让服务器上所有资源都来运行Oracle服务。 \x0d\112、调整计算机系统中的内存配置 \x0d\多数 *** 作系统都用虚存来模拟计算机上更大的内存,它实际上是硬盘上的一定的磁盘空间。当实际的内存空间不能满足应用软件的要求时, *** 作系统就将用这部分的磁盘空间对内存中的信息进行页面替换,这将引起大量的磁盘I/O *** 作,使整个服务器的性能下降。为了避免过多地使用虚存,应加大计算机的内存。 \x0d\113、为Oracle数据库服务器设置 *** 作系统进程优先级 \x0d\不要在 *** 作系统中调整Oracle进程的优先级,因为在Oracle数据库系统中,所有的后台和前台数据库服务器进程执行的是同等重要的工作,需要同等的优先级。所以在安装时,让所有的数据库服务器进程都使用缺省的优先级运行。 \x0d\12、调整内存分配\x0d\Oracle数据库服务器保留3个基本的内存高速缓存,分别对应3种不同类型的数据:库高速缓存,字典高速缓存和缓冲区高速缓存。库高速缓存和字典高速缓存一起构成共享池,共享池再加上缓冲区高速缓存便构成了系统全程区(SGA)。SGA是对数据库数据进行快速访问的一个系统全程区,若SGA本身需要频繁地进行释放、分配,则不能达到快速访问数据的目的,因此应把SGA放在主存中,不要放在虚拟内存中。内存的调整主要是指调整组成SGA的内存结构的大小来提高系统性能,由于Oracle数据库服务器的内存结构需求与应用密切相关,所以内存结构的调整应在磁盘I/O调整之前进行。 \x0d\121、库缓冲区的调整 \x0d\库缓冲区中包含私用和共享SQL和PL/SQL区,通过比较库缓冲区的命中率决定它的大小。要调整库缓冲区,必须首先了解该库缓冲区的活动情况,库缓冲区的活动统计信息保留在动态性能表v$librarycache数据字典中,可通过查询该表来了解其活动情况,以决定如何调整。 \x0d\ \x0d\Select sum(pins),sum(reloads) from v$librarycache; \x0d\ \x0d\Pins列给出SQL语句,PL/SQL块及被访问对象定义的总次数;Reloads列给出SQL 和PL/SQL块的隐式分析或对象定义重装载时在库程序缓冲区中发生的错误。如果sum(pins)/sum(reloads) ≈0,则库缓冲区的命中率合适;若sum(pins)/sum(reloads)>1, 则需调整初始化参数 shared_pool_size来重新调整分配给共享池的内存量。 \x0d\122、数据字典缓冲区的调整 \x0d\数据字典缓冲区包含了有关数据库的结构、用户、实体信息。数据字典的命中率,对系统性能影响极大。数据字典缓冲区的使用情况记录在动态性能表v$librarycache中,可通过查询该表来了解其活动情况,以决定如何调整。 \x0d\ \x0d\Select sum(gets),sum(getmisses) from v$rowcache; \x0d\ \x0d\Gets列是对相应项请求次数的统计;Getmisses 列是引起缓冲区出错的数据的请求次数。对于频繁访问的数据字典缓冲区,sum(getmisses)/sum(gets)回答于 2022-11-15
mysql的优化大的有两方面:
1、配置优化
配置的优化其实包含两个方面的: *** 作系统内核的优化和mysql配置文件的优化
1)系统内核的优化对专用的mysql服务器来说,无非是内存实用、连接数、超时处理、TCP处理等方面的优化,根据自己的硬件配置来进行优化,这里不多讲;
2)mysql配置的优化,一般来说包含:IO处理的常用参数、最大连接数设置、缓存使用参数的设置、慢日志的参数的设置、innodb相关参数的设置等,如果有主从关系在设置主从同步的相关参数即可,网上的相关配置文件很多,大同小异,常用的设置大多修改这些差不多就够用了。
2、sql语句的优化
1、 尽量稍作计算
Mysql的作用是用来存取数据的,不是做计算的,做计算的话可以用其他方法去实现,mysql做计算是很耗资源的。
2尽量少 join
MySQL 的优势在于简单,但这在某些方面其实也是其劣势。MySQL 优化器效率高,但是由于其统计信息的量有限,优化器工作过程出现偏差的可能性也就更多。对于复杂的多表 Join,一方面由于其优化器受限,再者在 Join 这方面所下的功夫还不够,所以性能表现离 Oracle 等关系型数据库前辈还是有一定距离。但如果是简单的单表查询,这一差距就会极小甚至在有些场景下要优于这些数据库前辈。
3尽量少排序
排序 *** 作会消耗较多的 CPU 资源,所以减少排序可以在缓存命中率高等 IO 能力足够的场景下会较大影响 SQL的响应时间。
对于MySQL来说,减少排序有多种办法,比如:
通过利用索引来排序的方式进行优化
减少参与排序的记录条数
非必要不对数据进行排序
现状:查询条件中in条件包含了400+门店的条件 且是返回全表字段,需要排序+分页查询
优化:(前提,做数据归档)
1将大量门店查询拆分成 50个门店一次查询 ,且只查询主键id,通过分次查询将查询到的数据汇总(此时数据可能会有上万 但只包含主键id)
2根据分页条件去其中符合条件的主键id (此时安分页筛选出来的数据一般10-30个)
3根据筛选出的主键id通过in条件查询符合条件的数据返回
1 tfax_number 和 tdtelephone 都应该有索引,不然怎么弄都慢的
2 换用存在语法代替in语法,楼上有说的
3 不觉得连接语法会比存在语法快很多,lz可以试一下。
4 试试以下变通会不会快一点
SELECT SUM(CNT) FROM (select (select count() as cnt from receivefax t where tfax_number = tdtelephone) AS CNT from tmp_duanxin_ljx_20100402 td );
我试了一下这样比存在语法要快一倍,连接语法和存在语法的速度差别不大
你是说TD表中可能有重复的吗?如果这样的话,我这个查询应该是没有压缩重复的,连接查询也没有压缩,存在和in查询都是忽略了TD中的重复的。至于t中的重复,都是肯定没有压缩的
查询优化是很复杂的,和具体的表的设计情况、表中数据的重复情况等等也有很大关系的,你自己用多种方法试一试吧,如果是oracle 在PL/SQL中执行完了,按F5进去可以看具体的执行情况,其它的一般也带查询分析器之类的,只有这样才能真正看出你的SQL语句的执行效率的
以上就是关于sql IN语句如何优化全部的内容,包括:sql IN语句如何优化、oracle数据库的性能优化有哪些方法、mysql数据库如何优化,优化了哪些功能等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)