日期:2014-05-18  浏览次数:20472 次

一个 存储过程优化问题,百万条记录,大家帮忙看看
有表  
  TRecRecord(code(char(10)),   bstype(char(2)),StepVolume(float),StepVal(float),StepVolume(int),   StepVal(int)   ,thedatetime   (datetime)   )
  百万条记录,可能达到上千万
其中   code   ,   thedatetime   做了索引
code   ,   thedatetime     确定唯一记录

如下一个存储过程,   对code   的某一天进行统计  
得到   最大,总数等,   现在统计功能很慢,   大家帮我分析一下看有没办法提高性能

ALTER                       proc   pro_RecCount
--@Code   int,
@Code   char(10),
@bstype   char(2),
@NewPrice   float,
@thedatetime   datetime
AS  

declare  
@MaxVol   bigint,
@MaxStep   float,
@RecCount   int,
@TotalVol   bigint,
@TotalStep   float

select   @MaxVol=max(StepVolume)   ,@MaxStep=max(StepVal)   ,   @RecCount=count(Code)   ,   @TotalVol=sum(StepVolume)   ,   @TotalStep=   sum(StepVal)
from   TRecRecord  
where   Code   =   @Code   and   bstype=   @bstype   and     convert(char(25),thedatetime,112)   =     convert(char(25),@thedatetime,112)


------解决方案--------------------
http://community.csdn.net/Expert/topic/5498/5498967.xml?temp=2.766055E-02

------解决方案--------------------
SQL语句优化的原则:
==================
1、使用索引来更快地遍历表。
缺省情况下建立的索引是非群集索引,但有时它并不是最佳的。在非群集索引
下,数据在物理上随机存放在数据页上。合理的索引设计要建立在
对各种查询的分析和预测上。一般来说:①.有大量重复值、且经常有范围查询
(between, > , < ,> =, < =)和order by、group by发生的列,可考
虑建立群集索引;②.经常同时存取多列,且每列都含有重复值可考虑建立组合索引
;③.组合索引要尽量使关键查询形成索引覆盖,其前导列一定
是使用最频繁的列。索引虽有助于提高性能但不是索引越多越好,恰好相反过多的索
引会导致系统低效。用户在表中每加进一个索引,维护索引集
合就要做相应的更新工作。
2、IS NULL 与 IS NOT NULL
不能用null作索引,任何包含null值的列都将不会被包含在索引中。即使索引有
多列这样的情况下,只要这些列中有一列含有null,该列就会从
索引中排除。也就是说如果某列存在空值,即使对该列建索引也不会提高性能。任何
在where子句中使用is null或is not null的语句优化器是不允
许使用索引的。
3、IN和EXISTS
EXISTS要远比IN的效率高。里面关系到full table scan和range scan。几乎将所
有的IN操作符子查询改写为使用EXISTS的子查询。
4、在海量查询时尽量少用格式转换。
5、当在SQL SERVER 2000中,如果存储过程只有一个参数,并且是OUTPUT类型的,必
须在调用这个存储过程的时候给这个参数一个初始的值,否则
会出现调用错误。
6、ORDER BY和GROPU BY
使用ORDER BY和GROUP BY短语,任何一种索引都有助于SELECT的性能提高。注意
如果索引列里面有NULL值,Optimizer将无法优化。
7、任何对列的操作都将导致表扫描,它包括数据库函数、计算表达式等等,查询时
要尽可能将操作移至等号右边。
8、IN、OR子句常会使用工作表,使索引失效。如果不产生大量重复值,可以考虑把
子句拆开。拆开的子句中应该包含索引。
9、SET SHOWPLAN_ALL ON 查看执行方案。DBCC检查数据库数据完整性。
DBCC(DataBase Consistency Checker)是一组用于验证 SQL Server 数据
库完整性的程序。
10、慎用游标
在某些必须使用游标的场合,可考虑将符合条件的数据行转入临时表中,再对临
时表定义游标进行操作,这样可使性能得到明显提高。
总结:所谓优化即WHERE子句利用了索引,不可优化即发生了表扫描或额外开销。经
验显示,SQL Server性能的最大改进得益于逻辑的数据库设计、
索引设计和查询设计方面。反过来说,最大的性能问题常常是由其中这些相同方面中
的不足引起的。其实SQL优化的实质就是在结果正确的前提下,
用优化器可以识别的语句,充份利用索引,减少表扫描的I/O次数,尽量避免表搜索
的发生。其实SQL的性能优化是一个复杂的过程,上述这些只是
在应用层次的一种体现,深入研究还会涉及数据库层的资源配置、网络层的流量控制
以及操作系统层的总体设计。
------解决方案--------------------
convert(char(25),thedatetime,112) = convert(char(25),@thedatetime,112)
这是不是可以用CAST