SQL 语句优化问题

[复制链接]
查看11 | 回复5 | 2020-6-4 05:04:03 | 显示全部楼层 |阅读模式
最近写一个项目,写的SQL语句并不复杂,结果涉及2张表的关联。如下:
selectA.truebillno truebillno, B.outpid outpid,B.outpname outpname,A.totalfee totalfee,A.feetime feetime,A.feeman feeman
from HDW_InHis_OutpBill A inner join dbo.HDW_InHis_OutpFormula_M B on A.truebillno = B.truebillno
where 1=1
and A.feetime>= '2010-06-01 00:00:00'and A.feetime<= '2010-08-24 23:59:59'
group byA.truebillno,B.outpid,B.outpname,A.totalfee,A.feetime,A.feeman
order by A.feetime asc;
这个语句在数据库中查询的结果有22万条记录,但是在项目中运行时会报 java help bind或者是内存溢出的错误。但是如果查询的结果记录只有十几万条的时候没有任何问题。也就是说数据量大的话就会出错。所以想寻求优化这个语句的方法,希望大家帮帮忙,谢谢了!!!
分页处理肯定是有的,但是分页之前也要把数据量的数目查出来,这样还是一样会出现这些错误。

回复

使用道具 举报

千问 | 2020-6-4 05:04:03 | 显示全部楼层
事实上,这样的担心是不必要的。SQLSERVER中有一个“查询分析优化器”,它可以计算出WHERE子句中的搜索条件并确定哪个索引能缩小表扫描的搜索空间,也就是说,它能实现自动优化。虽然查询优化器可以根据WHERE子句自动的进行查询优化,但仍然有必要了解一下“查询优化器”的工作原理,如非这样,有时查询优化器就会不按照您的本意进行快速查询。在查询分析阶段,查询优化器查看查询的每个阶段并决定限制需要扫描的数据量是否有用。如果一个阶段可以被用作一个扫描参数(SARG),那么就称之为可优化的,并且可以利用索引快速获得所需数据。SARG的定义:用于限制搜索的一个操作,因为它通常是指一个特定的匹配,一个值得范围内的匹配或者两个以上条件的AND连接。形
回复

使用道具 举报

千问 | 2020-6-4 05:04:03 | 显示全部楼层
这个java help bind或者是内存溢出我估计是 调用数据库的应用程序 内存溢出了因为如果你对数据库执行一个SQL语句。数据库一条一条的把查询结果,传给调用者,自身不会缓存全部的查询结果的。但是 客户端就不一样了。通常就是把数据拿到以后,存储起来,然后显示给终端用户。那么多的数据,全部缓存在客户端, 内存溢出是难
回复

使用道具 举报

千问 | 2020-6-4 05:04:03 | 显示全部楼层
你的问题~~~~数据量大的话就会出错。。。优化语句 是不会减少数据量的。。。只会提高执行效率而已,建议增加修改,限制条件
回复

使用道具 举报

千问 | 2020-6-4 05:04:03 | 显示全部楼层
问题出在这里!group byA.truebillno,B.outpid,B.outpname,A.totalfee,A.feetime,A.feeman
order by A.feetime asc;group by后面跟这么多的,查询速度慢很正常!建议group by后面加一到两个(其中有一个主键),然后在做下关联查询;
回复

使用道具 举报

千问 | 2020-6-4 05:04:03 | 显示全部楼层
单独看你的这个SQL,group by没用起到任何作用,可以不做分组;实在不行的话,你可以创建一个中间表来保存这些数据,然后查询时只要查询中间表就行了;希望可以帮助你
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行