A. 如何提高sql语句的执行效率
1、使用ordered提示
Oracle必须花费大量的时间来剖析多表的合并,用以确定表合并的最佳顺序。SQL表达式涉及七个乃至更多的表合并,那么有时就会需要超过30分钟的时间来剖析,Ordered这个提示(hint)和其他的提示一起使用能够产生合适的合并顺序。
2、使用ordered_predicates
ordered_predicates提示在查询的WHERE子句里指定的,并被用来指定布尔判断(Booleanpredicate)被评估的顺序。在没有ordered_predicates的情况下,Oracle会使用下面这些步骤来评估SQL判断的顺序:子查询的评估先于外层WHERE子句里的Boolean条件。
所有没有内置函数或者子查询的布尔条件都按照其在WHERE子句里相反的顺序进行评估,即最后一条判断最先被评估。每个判断都带有内置函数的布尔判断都依据其预计的评估值按递增排列。
3、限制表格合并评估的数量
提高SQL剖析性能的最后一种方法是强制取代Oracle的一个参数,这个参数控制着在评估一个查询的时候,基于消耗的优化器所评估的可能合并数量。
(1)sql的sum效率扩展阅读:
1、表设计的优化,数据行的长度不要超过8020字节,如果超过这个长度的话在物理页中这条数据会占用两行从而造成存储碎片,降低查询效率。
2、语句的查询优化,保证在实现功能的基础上,尽量减少对数据库的访问次数;
3、建立高效的索引创建索引一般有以下两个目的:维护被索引列的唯一性和提供快速访问表中数据的策略。
大型数据库有两种索引即簇索引和非簇索引,一个没有簇索引的表是按堆结构存储数据,所有的数据均添加在表的尾部,而建立了簇索引的表,其数据在物理上会按照簇索引键的顺序存储。个表只允许有一个簇索引。
4、强制查询转换,有时候oracle 的优化器未必能走正确的查询路线,这个时候就需要添加一些hint 之类的来规定他的执行路线。当然了,这个未必是最好的处理方案。因为虽然现在走这个路线是对的,以为因为数据的变化到这这个HINT 变得不可取。
B. plsql 使用sum函数的效率问题
用nvl函数试试,效率高不高就不知道了
select nvl(sum(colA), 0) from tbl group by colB ;
C. sql中SUM()的效率怎样
sum()是系统函数,执行效率还可以的。
主要的是你group by proct_type这里
D. sql sum函数的用法
这个是返回的一个运算结果列,没有实际存储
E. sql中的sum(1)什么意思有什么作用
sum()函数是计算总数(值相加),count()是计算记录数(条数)。
当使用sum(1)时与count(*)相同,都是返回当前条件的记录数,但count效率会高点。
F. sql 提高多条件查询效率
可建立一个类别表:CREATE TABLE 类别表(产品编号 char(1),类别 char(20));
再与类别表查询;或在原表增加此2个字段。
另外:插入临时表(以substring(产品编号,1,1)为组)
select distict substring(产品编号,1,1), RTRIM(left(CONVERT(varchar(5), 日期, 0),2)) + ''月'' as 月份,CONVERT(varchar(100),日期,23) as 日期,单号,发货人,收货人, sum(abs(数量))as 数量 ,单价, sum(金额) as 金额 from '+ @ckgs +' where substring(产品编号,1,1) like '''+ @cpfl +''' and 单据分类 like '''+@djfl+''' and 产品名称 like '''+@cpmc+''' and 发货人 like '''+@ffr +''' and 收货人 like ''' +@sfr+''' group by 日期,单号,substring(产品编号,1,1), 发货人,收货人,单价 into temp;
再查询temp表。
G. SQL Sum统计问题
Select Truename as 姓名,GongZhong as 工种,JiNengLevel as 岗位等级,(sum(case when Year(AddTime)&'-'&Month(AddTime)='2008-10' then fensum else 0 end)-100*sum(Year(AddTime)&'-'&Month(AddTime)='2008-10' then 1 else 0 end))+100 as 10,(sum(case when Year(AddTime)&'-'&Month(AddTime)='2008-11' then fensum else 0 end)-100*sum(Year(AddTime)&'-'&Month(AddTime)='2008-10' then 1 else 0 end))+100 as 11,(sum(case when Year(AddTime)&'-'&Month(AddTime)='2008-10' then fensum else 0 end)-100*sum(Year(AddTime)&'-'&Month(AddTime)='2008-12' then 1 else 0 end))+100 as 12,sum(fensum) as '总分',sum(fensum)/count(*) as '平均' From CheckInfoUser GROUP BY Truename,GongZhong,JiNengLevel
H. MySQL 有什么方法提高SUM的性能
CREATE?TABLE?`a`?(
`id`?mediumint(8)?unsigned?NOT?NULL?AUTO_INCREMENT,`fid`?smallint(6)?unsigned?NOT?NULL?DEFAULT?'0',`cnt`?smallint(6)?unsigned?NOT?NULL?DEFAULT?'0',...
...
...
PRIMARY?KEY?(`id`),
KEY?`idx_fid`?(`fid`),
)?ENGINE=MyISAM?DEFAULT?CHARSET=utf8
表b
CREATE?TABLE?`b`?
(`fid`?smallint(6)?unsigned?NOT?NULL?AUTO_INCREMENT,`name`?char(50)?NOT?NULL?DEFAULT?'',
...
...
...
PRIMARY?KEY?(`fid`),
)?ENGINE=MyISAM?DEFAULT?CHARSET=utf8
操作SQL如下:
SELECT?COUNT(*)?AS?num1,?SUM(a.cnt)+COUNT(*)?AS?num2FROM?a,?b
WHERE?b.fid='10913'?AND?a.fid=b.fid
我们先看下执行计划:
我们可以看到扫描行数是229049行,执行时间:
太可怕了,运行set profiling=1,让我们看看时间主要消耗在哪里?
sending data花费的时间较长,那这段时间到底是做什么的呢?先看下这个吧:http://renxijun.blog.sohu.com/82906360.html意思是它在为select语句准备数据,解决办法:
建索引:
create index idx_fid_cnt on a (fid,cnt);
再看下,执行计划和执行时间:
总结:使用恰当的索引,是sql的效率倍增,类似sum的函数还有min(),max(),这些都需要在字段上建索引。
I. 一个实际的SQL语句效率的问题
--最少总金额
select
top
1
销售信息表.客户编号,sum(销售信息表.销售数量*产品信息.销售单价)
from
销售信息表,产品信息
where
销售信息表.产品编号=产品信息.产品编号
group
by
销售信息表.客户编号
order
by
sum(销售信息表.销售数量*产品信息.销售单价)
--最多总金额
select
top
1
销售信息表.客户编号,sum(销售信息表.销售数量*产品信息.销售单价)
from
销售信息表,产品信息
where
销售信息表.产品编号=产品信息.产品编号
group
by
销售信息表.客户编号
order
by
sum(销售信息表.销售数量*产品信息.销售单价)
desc
--平均销售总金额
select
销售信息表.客户编号,avg(销售信息表.销售数量*产品信息.销售单价)
from
销售信息表,产品信息
where
销售信息表.产品编号=产品信息.产品编号
group
by
销售信息表.客户编号