原因基本查明,但不如如何优化程序或数据库的设计:具体情况为:
1.在ASP程序中要查询两个表(cx_jijia_mx ,cx_jiesuan_cx)中的数据进行比较,统计出来JIJIA表比JIESUAN表多如来的记录,这一块做的时候设计了一个查询v_jj_js_biaoduan_mxsum,如下:
SELECT TOP 100 PERCENT a.*, b.biaoduan_no AS biaoduan,
(SELECT isnull(SUM(js_shuliang), 0)
FROM cx_jiesuan_mx
WHERE htmx_id = a.htmx_id AND js_biaoduan = b.biaoduan_no)
AS lj_js_shuliang,
(SELECT isnull(SUM(js_hejia), 0)
FROM cx_jiesuan_mx
WHERE htmx_id = a.htmx_id AND js_biaoduan = b.biaoduan_no) AS lj_js_hejia,
(SELECT isnull(SUM(jj_shuliang), 0)
FROM cx_jijia_mx
WHERE htmx_id = a.htmx_id AND jj_biaoduan = b.biaoduan_no) AS lj_jj_shuliang,
(SELECT isnull(SUM(jj_hejia), 0)
FROM cx_jijia_mx
WHERE htmx_id = a.htmx_id AND jj_biaoduan = b.biaoduan_no)
AS lj_jj_hejia
FROM dbo.cx_htmx a INNER JOIN
dbo.biaoduan b ON a.project = b.project
ORDER BY a.ht_id, a.htmx_id, b.biaoduan_no
2.在ASP文件中有以下语句:
set rs3=conn.execute("select fenlei,count(ht_id) as ht_id,htmx_id,max(htbh) as htbh,max(htdw) as htdw from v_jj_js_biaoduan_mxsum group by htmx_id,fenlei,biaoduan having max(project)='"&project&"' and biaoduan='"&biaoduan_&"' and round((sum(lj_js_hejia)-sum(lj_jj_hejia)),2)<0 ")
js=0
bd_js=0
if rs3.eof and rs3.bof then
is_jj_js_biaoduan=0
else
do while not rs3.eof
js=js+1
if ltrim(trim(rs3("fenlei")))=fenlei_ then
bd_js=bd_js+1
end if
rs3.movenext
loop
is_jj_js_biaoduan=bd_js
end if
rs3.close
set rs3=nothing
3.因为这两个查询表中的数据很相差很大,一个只有几十条,一个有三千条,致使执行第2步程序出现查询时间太长,超时。涉及到的几个表结构如下:
(1)表hetong_mx:
3 id int 4 0
0 ht_id int 4 1
0 wzmc_mx char 50 1
0 xinghao char 150 1
0 wz_dw char 10 1
0 shuliang float 8 1
0 daozhan_danjia float 8 1
0 daozhan_hejia float 8 1
0 beizhu char 100 1
(2)视图cx_jijia_mx:
SELECT jj.id AS jj_id, jj.jj_date, ht.project, ht.id AS ht_id, ht.fenlei, ht.htbh, ht.htdw,
hm.id AS htmx_id, hm.wzmc_mx, hm.xinghao, hm.wz_dw,
hm.shuliang AS ht_shuliang, hm.daozhan_danjia AS ht_danjia,
hm.daozhan_hejia AS ht_hejia, jj.jj_biaoduan, jj.jj_shuliang, jj.jj_danjia, jj.jj_hejia,
jj.jj_zhangjie, jj.didian, jj.didian_sum, jj.is_shenhe
FROM dbo.hetong ht INNER JOIN
dbo.hetong_mx hm ON ht.id = hm.ht_id INNER JOIN
dbo.jijia_mx jj ON ht.id = jj.ht_id AND hm.id = jj.htmx_id
(3)视图cx_jiesuan_mx:
SELECT jm.id AS js_id, jm.js_date, ht.project, ht.id AS ht_id, ht.fenlei, ht.htbh, ht.htdw,
ht.yfk_bl, ht.jsk_bl, ht.is_baohan, hm.id AS htmx_id, hm.wzmc_mx, hm.xinghao,
hm.wz_dw, hm.shuliang AS ht_shuliang, hm.daozhan_danjia AS ht_danjia,
hm.daozhan_hejia AS ht_hejia, jm.js_biaoduan, jm.js_shuliang, jm.js_danjia,
jm.js_hejia, jm.js_danhao, jm.is_jiezhuan, jm.js_hejia * ((1 - ht.zbj_bl)
- ht.yfk_bl * ht.is_baohan) AS yf_fk_jsk, jm.js_beizhu
FROM dbo.hetong ht INNER JOIN
dbo.hetong_mx hm ON ht.id = hm.ht_id INNER JOIN
dbo.jiesuan_mx jm ON ht.id = jm.ht_id AND hm.id = jm.htmx_id
找到了一点点,如果删除以下一段程序,速度就不慢了,大家帮我看下:
set rs3=conn.execute("select fenlei,count(ht_id) as ht_id,htmx_id,max(htbh) as htbh,max(htdw) as htdw from v_jj_js_biaoduan_mxsum group by htmx_id,fenlei,biaoduan having max(project)='"&project&"' and biaoduan='"&biaoduan_&"' and round((sum(lj_js_hejia)-sum(lj_jj_hejia)),2)<0 ")
js=0
bd_js=0
if rs3.eof and rs3.bof then
is_jj_js_biaoduan=0
else
do while not rs3.eof
js=js+1
if ltrim(trim(rs3("fenlei")))=fenlei_ then
bd_js=bd_js+1
end if
rs3.movenext
loop
is_jj_js_biaoduan=bd_js
end if
rs3.close
set rs3=nothing
v_jj_js_biaoduan_mxsum查询数据表的语句文件
SELECT TOP 100 PERCENT a.*, b.biaoduan_no AS biaoduan,
(SELECT isnull(SUM(js_shuliang), 0)
FROM cx_jiesuan_mx
WHERE htmx_id = a.htmx_id AND js_biaoduan = b.biaoduan_no)
AS lj_js_shuliang,
(SELECT isnull(SUM(js_hejia), 0)
FROM cx_jiesuan_mx
WHERE htmx_id = a.htmx_id AND js_biaoduan = b.biaoduan_no) AS lj_js_hejia,
(SELECT isnull(SUM(jj_shuliang), 0)
FROM cx_jijia_mx
WHERE htmx_id = a.htmx_id AND jj_biaoduan = b.biaoduan_no) AS lj_jj_shuliang,
(SELECT isnull(SUM(jj_hejia), 0)
FROM cx_jijia_mx
WHERE htmx_id = a.htmx_id AND jj_biaoduan = b.biaoduan_no)
AS lj_jj_hejia
FROM dbo.cx_htmx a INNER JOIN
dbo.biaoduan b ON a.project = b.project
ORDER BY a.ht_id, a.htmx_id, b.biaoduan_no