我有一系统,系统中有许多MS SQL的存储过程,其SQL语句实在需要动动手术,敬请各位谋划谋划、指点指点。以下就是一段典型代码:CREATE PROCEDURE Proc_Cal_XX_Fee
@Garden varchar (5),
@Year smallint,
@Month tinyint
AS
begin
--更新某某费用
Update tbl_A Set yfje=A.dtf From
(Select yzxx.hzbh, (dtf*ISNULL(ftxs,0)) AS dtf From yzxx, dtf, dtft, zfxx Where yzxx.lh=dtf.lh AND nf=@Year AND yf=@Month
AND dtf.xqbh=@Garden AND yzxx.xqbh=@Garden AND yzxx.hzbh=zfxx.hzbh AND dtft.lc=zfxx.lc AND yzxx.lh=dtft.lh) A,
(Select sfxmid From SFXM Where mc like '%某某费用%') B
Where tbl_A.hzbh=A.hzbh AND tbl_A.sfxmid=B.sfxmid
AND nf=@Year AND yf=@Month
end其中涉及各表的大致结构如下:
tbl_A (hzbh, nf, yf, sfxmid, yfje, ...) //此表保存用户各月各项费用数据
yzxx(hzbh, xm, xb, lh, ....) //用户的姓名,楼层等
zfxx(hzbh, lh, lc, ...) //各房的面积、楼层等
dtft(lh, lc, ftxs, ...) //此表保存各楼层的分摊系数
dtf(lh, nf, yf, dtf, ...) //此表保存每月费用
SFXM(sfxmid, mc, ...) //此表保存各项费用编号与名称等此类存储过程关联的表过多,作笛卡儿积后所需空间必定不小。
请问高手如何做优化,以提高速度。
@Garden varchar (5),
@Year smallint,
@Month tinyint
AS
begin
--更新某某费用
Update tbl_A Set yfje=A.dtf From
(Select yzxx.hzbh, (dtf*ISNULL(ftxs,0)) AS dtf From yzxx, dtf, dtft, zfxx Where yzxx.lh=dtf.lh AND nf=@Year AND yf=@Month
AND dtf.xqbh=@Garden AND yzxx.xqbh=@Garden AND yzxx.hzbh=zfxx.hzbh AND dtft.lc=zfxx.lc AND yzxx.lh=dtft.lh) A,
(Select sfxmid From SFXM Where mc like '%某某费用%') B
Where tbl_A.hzbh=A.hzbh AND tbl_A.sfxmid=B.sfxmid
AND nf=@Year AND yf=@Month
end其中涉及各表的大致结构如下:
tbl_A (hzbh, nf, yf, sfxmid, yfje, ...) //此表保存用户各月各项费用数据
yzxx(hzbh, xm, xb, lh, ....) //用户的姓名,楼层等
zfxx(hzbh, lh, lc, ...) //各房的面积、楼层等
dtft(lh, lc, ftxs, ...) //此表保存各楼层的分摊系数
dtf(lh, nf, yf, dtf, ...) //此表保存每月费用
SFXM(sfxmid, mc, ...) //此表保存各项费用编号与名称等此类存储过程关联的表过多,作笛卡儿积后所需空间必定不小。
请问高手如何做优化,以提高速度。
解决方案 »
- 关于chart自身坐标与屏幕坐标的问题 急~(刚才的发错版块了 不好意思)
- Delphi 学精了,之后?
- 关于TQuery的编辑状态的问题。
- delphi 的右移操作符是什么呀?
- 有哪位高手知道BDE中数据库的默认用户名和密码吗?
- 做了一个半月的C#,和老板说了辞职,回来散分
- Response对象中的WWWWAuthenticate属性所设置的字符串都有什么?什么意义?谁能给个列表,给个网址也行啊,现在急着用,感谢。
- 我的IE 的主页设置被人改了,并且不能在修改(按钮是灰的),怎样用其他方法改,分不够再给
- 如何制作横着的报表。~~~~~~~~~~~急!!!!!!!!!!!!
- 怎样才能知道,网页的大小,不是下载保存,而是直接获取网页的属性,小弟是菜鸟,请高手相助
- 为什么我安装的控件在面板上看不到?
- DSpack控件为何无法安装?请高手指点迷津!
做个视图用来查询,再用UPDATE更新
一。尽量避免用*号 ,控制传输的数据不是太大。
二。像SFXM(sfxmid, mc, ...) //此表保存各项费用编号与名称等
编号尽量用INT,而不用VARCHAR,这样查询起来更快
三。90/10规则,把你的主要时间放在重要的10上面而不是90上面