怎么提高数据查询的速度,请兄弟们帮忙!

我接手公司的销售系统的查询报表,用户投诉速度太慢,由于数据库以前的设计有些缺陷及存储过程写得很复杂,数据量又大,速度成了一个很大的障碍,有什么好的解决方案吗?比如说代码优化,能够做些什么显见成效的工作?以下是其中的一个存储过程的代码,希望各位兄弟能够伸出援助之手,对数据库的管理我不是很熟练,请大家帮忙!
CREATE PROCEDURE wwwsales_zj
@type varchar(5), --范围,'all','area'
@detail varchar(20), --具体范围
@efrom char(10), --销售结束日期
@sea varchar(10), --季节
@nextsea varchar(10) --下季节
AS
set nocount on
declare @brn_desc varchar(30),@sty_group char(4),@sea_name varchar(20),@nextsea_name varchar(20)
select @sea_name=sea_name from sea where sea_code=@sea
select @nextsea_name=sea_name from sea where sea_code=@nextsea

select sty_code,isnull(brn_desc,'other') brn_desc
into #sty from style left join brand on sty_brn=brn_code where sty_ces=@sea
select sty_code,isnull(brn_desc,'other') brn_desc
into #styn from style left join brand on sty_brn=brn_code where sty_ces=@nextsea

if @type='all'
begin

select brn_desc,sty_code,sum(case when sa1_date<isnull(zj_7,dateadd(dd,1,@efrom)) then sa1_qty else 0 end) qty_zj0 ,
qty_zj7=sum(case when sa1_date<isnull(zj_5,'1900-01-01') then sa1_qty else 0 end),
qty_zj5 =sum(case when zj_5 is not null then sa1_qty else 0 end)
into #all1 from sad2 inner join #sty on sty_code=sa1_sty
left join sea_zj on sea_code=@sea
where sa1_date <= @efrom --销售数量
group by brn_desc,sty_code

select brn_desc,st_sty,st_qty1+st_qty2+st_qty3+st_qty4+st_qty5+st_qty6+st_qty7+st_qty8+st_qty9 qty
into #inch1
from inhead inner join stockdet on st_mcode=in_mcode and st_inno=in_no
inner join #sty on st_sty =sty_code
where in_mcode='01' and in_date<=@efrom

select brn_desc,st_sty,isnull(sum(qty),0) as inqty into #in1 from #inch1 group by brn_desc,st_sty

select brn_desc, sty_code into #no1 ---未销售的款号
from #sty left join sad2 on sty_code=sa1_sty
where sa1_sty is null

---------------------------------------------------------------

CODE太长.没法看,
给你一点建议,该SP应用许多TEMPTABLE,你可以将TEMPDB的默认路径改到一个独立的盘符,并增加空间会提高DISK I/O的速度.
---------------------------------------------------------------

优化索引吧
---------------------------------------------------------------

再试试把临时表改成表变量试试。
---------------------------------------------------------------

没有看完代码,感觉临时表的数据量不小,改表变量的方法估计收不到效果.具体的原因可以看http://expert.csdn.net/Expert/topic/1135/1135269.xml?temp=.6150324

建议:
在数据量大的临时表加合适的索引,可以在SELECT ... INTO ... FROM ... WHERE ...后加CREATE INDEX...语句,也可以改成CREATE TABLE #... CREATE INDEX... 再INSERT #... SELECT ... FROM ... WHERE ... ,估计后一个速度快一些,但程序改动量大.

另外,应该考虑leimin(黄山光明顶) 的建议.
---------------------------------------------------------------

我也来说一下,是否在你要where的字段中有为null的数据?那样也将大大降低sql的执行速度。
---------------------------------------------------------------

我的一点建议:
1:首先考虑加索引,因为,索引可以大大提高数据的检索速度。(当要执行insert,update,delete 操作时,请慎重使用。会降低速度)

2:尽量少的使用临时表,因为创建和删除表会占住相当大的一部分时间。(可以考虑将查询语句保存在字符串变量中,然后用exec(@str)执行,效果很明显!

---------------------------------------------------------------

我认为,这些问题要解决的话,应该是一个比较复杂的方案

建议楼主看一看MS SQL SERVER版中的FAQ中的关于数据库优化中的内容,这样可能对楼主有很大的帮助 !
---------------------------------------------------------------

最好的办法就是让你老板花点钱,买个几十个心的机器不就得了,烦不着这么麻烦,而且换不换机器是你老板的事。。。。多省心啊~~~

Published At
Categories with 数据库类
Tagged with
comments powered by Disqus