SQL 语句优化问题
发布网友
发布时间:2022-04-21 06:34
我来回答
共6个回答
热心网友
时间:2022-04-30 05:37
事实上,这样的担心是不必要的。SQL
SERVER中有一个“查询分析优化器”,它可以计算出WHERE子句中的搜索条件并确定哪个索引能缩小表扫描的搜索空间,也就是说,它能实现自动优化。
虽然查询优化器可以根据WHERE子句自动的进行查询优化,但仍然有必要了解一下“查询优化器”的工作原理,如非这样,有时查询优化器就会不按照您的本意进行快速查询。
在查询分析阶段,查询优化器查看查询的每个阶段并决定*需要扫描的数据量是否有用。如果一个阶段可以被用作一个扫描参数(SARG),那么就称之为可优化的,并且可以利用索引快速获得所需数据。
SARG的定义:用于*搜索的一个操作,因为它通常是指一个特定的匹配,一个值得范围内的匹配或者两个以上条件的AND连接。形式如下:
列名
操作符
<常数
或
变量>或<常数
或
变量>
操作符列名
列名可以出现在操作符的一边,而常数或变量出现在操作符的另一边。如:
Name=’张三’价格>5000
5000<价格
Name=’张三’
and
价格>5000
如果一个表达式不能满足SARG的形式,那它就无法*搜索的范围了,也就是SQL
SERVER必须对每一行都判断它是否满足WHERE子句中的所有条件。所以一个索引对于不满足SARG形式的表达式来说是无用的。
常见的SARG判别经验:
Like语句是否属于SARG取决于所使用的通配符的类型
如:name
like
‘张%’,这就属于SARG
而:name
like
‘%张’,就不属于SARG。
原因是通配符%在字符串的开通使得索引无法使用。
or
会引起全表扫描。
Name
=
’张三’
AND
价格>5000,符合SARG,
Name
=
’张三’
OR
价格>5000,不符合SARG。
原因是使用or会引起全表扫描。
非操作符、函数引起的不满足SARG形式的语句。
不满足SARG形式的语句最典型的情况就是包括非操作符的语句,如:NOT、!=、<>、!<、!>、NOT
EXISTS、NOT
IN、NOT
LIKE等,另外还有函数。下面就是几个不满足SARG形式的例子:
ABS(价格)<5000
Name
like
‘%三’
有些表达式,如:WHERE
价格*2>5000
SQL
SERVER也会认为是SARG,SQL
SERVER会将此式转化为:价格>5000/2
但不推荐这样使用,因为有时SQL
SERVER不能保证这种转化与原始表达式是完全等价的。
热心网友
时间:2022-04-30 06:55
这个java help bind或者是内存溢出
我估计是 调用数据库的应用程序 内存溢出了
因为如果你对数据库执行一个SQL语句。
数据库一条一条的把查询结果,传给调用者,自身不会缓存全部的查询结果的。
但是 客户端就不一样了。
通常就是把数据拿到以后,存储起来,然后显示给终端用户。
那么多的数据,全部缓存在客户端, 内存溢出是难免的了。
建议是作分页处理。
热心网友
时间:2022-04-30 08:30
你的问题~~~~
数据量大的话就会出错。。。
优化语句 是不会减少数据量的。。。
只会提高执行效率而已,建议增加修改,*条件
热心网友
时间:2022-04-30 10:21
问题出在这里!
group by A.truebillno,B.outpid,B.outpname,A.totalfee,A.feetime,A.feeman
order by A.feetime asc;
group by后面跟这么多的,查询速度慢很正常!
建议group by 后面加一到两个(其中有一个主键),然后在做下关联查询;
热心网友
时间:2022-04-30 12:29
单独看你的这个SQL,group by没用起到任何作用,可以不做分组;
实在不行的话,你可以创建一个中间表来保存这些数据,然后查询时只要查询中间表就行了;
希望可以帮助你
热心网友
时间:2022-04-30 14:54
一下子取回22万条数据没有任何意义,谁能一下子看得了那么多?
建议少取一些,或者把结果分页,每次只看一页。