100分请大家帮忙想想这个问题怎么解决,速度方面的!!!!如果需要,我可以另开贴子给分的

cqnucsmoon 2003-11-13 07:26:54
我用VB写个程序,主要用于用户查看和修改数据的,主表有30个字段,其中二十个字段为代码(比如:1代表男;2代码女,当然还有其它代表的含义,都放在了其它二十个代码数据表内了)。因为主表有二十表示代码的字段,因此为了直观,让用户能看懂代码的含义,就必须从那二十个表内取出其分别代表的中文意思,于是我就用了二十LEFT连接查询。曾经想过用视图,结果因为不符合视图定义索引的规则,放弃了,现在改为了临时表,当程序一启动时就创建一个临时表(用这二十LEFT连接查询创建的),可是当数据量只有几百条的时候还可以接受,可是当主表数据上千上万就麻烦了。看大家帮我看看这种设计方式是不是有改进的地方,也就是加快数据加载和显示的速度。

不知道我的意图有没有说明白,请大家帮帮忙,其实这个问题已经是我第四次提出来了!!!!!!!!!
如果需要,我可以另开贴子给分的。
...全文
46 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
trampwind 2003-11-14
  • 打赏
  • 举报
回复
我也碰到过这样问题,主表中多的有20多个代码,而且主表中还有多个代码对应同一个从表的情况,
比如专业1,专业2,专业3均对应一个从表专业代码表,在查询的时候要把这些代码全部换成对应名称,
也没想出效率很高的办法,对于那些多个代码对应一个从表的我都先建一级视图,比如上面的专业,我就
建了三个视图,等于建了三个虚拟的专业代码表,
/* 生成最高学历所学专业名称的一级视图 */
create view view_highspecname(codehighspec,highspeccode) as
select speccode,specname from tab_specialty;

/* 生成申报专业名称的一级视图 */
create view view_decspecname(codedecspec,decspeccode) as
select speccode,specname from tab_specialty;

/* 生成现资格专业名称的一级视图 */
create view view_nowquspecname(codenowquspec,nowquspeccode) as
select speccode,specname from tab_specialty;
其中我把主表对应代码字段在视图中成了名称,后来的页面中查询条件是以名称为条件的。
如果不是这种多对一的情况,只需要在查询中用左连接就行了, 我把所建主表视图
贴上去(因为没用大数据量测试,只有二三十条数据,不知道最后速度这样,可能不怎么好,但
现在没想到什么好的办法,就二三十条数据感觉查询跟普通的一个表中查询差不多,感觉不到停顿,
主视图中代码字段其实都是实际的名称了,查询结果里也没重复数据,是所期望的)请高手指教:
create view view_audit(idcard,name,birthday,sex,provcode,partycode,nationcode,
firstjobdate,telephone,graduatedate,eduyearscope,edulvlcode,degreecode,school,
recseries,highspeccode,company,comattrcode,comareacode,decquseriescode,quseriescode,
decspeccode,decqucode,qugradecode,approachcode,nowqucode,nowquspeccode,getqudate,
consignflag,decdate,oldcompany,chargedpt,commicode,decattr,decspecseriescode,
nowspecseriescode,specseriescode)
as select tab_person.idcard,tab_person.name,tab_person.birthday,
tab_person.sex,tab_province.provname,tab_party.partyname,tab_nation.nationname,
tab_person.firstjobdate,tab_person.telephone,tab_person.graduatedate,
tab_eduyears.eduyearscopename,tab_edulvl.edulvlname,tab_degree.degreename,
tab_person.school,tab_audit.recseries,view_highspecname.highspeccode,tab_audit.company,
tab_comattr.comattrname,tab_area.areaname,view_decquseriesname.decquseriescode,
view_quseriesname.quseriescode,view_decspecname.decspeccode,view_decquname.decqucode,
tab_grade.gradename,tab_approach.approachname,view_nowquname.nowqucode,
view_nowquspecname.nowquspeccode,tab_audit.getqudate,tab_audit.consignflag,
tab_audit.decdate,tab_audit.oldcompany,tab_audit.chargedpt,tab_committee.comminame,
tab_audit.decattr,view_decspecseriesname.decspecseriescode,
view_nowspecseriesname.nowspecseriescode,view_specseriesname.specseriescode
from tab_person left outer join tab_eduyears on(tab_person.eduyearscope=tab_eduyears.eduyearscopecode)
left outer join tab_edulvl on(tab_person.edulvlcode=tab_edulvl.edulvlcode)
left outer join tab_degree on(tab_person.degreecode=tab_degree.degreecode)
left outer join tab_province on(tab_person.provcode=tab_province.provcode)
left outer join tab_party on(tab_person.partycode=tab_party.partycode)
left outer join tab_nation on(tab_person.nationcode=tab_nation.nationcode),
tab_audit left outer join tab_comattr on(tab_audit.comattrcode=tab_comattr.comattrcode)
left outer join tab_area on(tab_audit.comareacode=tab_area.areacode)
left outer join tab_grade on(tab_audit.qugradecode=tab_grade.gradecode)
left outer join tab_approach on(tab_audit.approachcode=tab_approach.approachcode)
left outer join tab_committee on(tab_audit.commicode=tab_committee.commicode)
left outer join view_highspecname on(tab_audit.highspeccode=view_highspecname.codehighspec)
left outer join view_decquseriesname on(tab_audit.decquseriescode=view_decquseriesname.codedecquseries)
left outer join view_quseriesname on(tab_audit.quseriescode=view_quseriesname.codequseries)
left outer join view_decspecname on(tab_audit.decspeccode=view_decspecname.codedecspec)
left outer join view_decquname on(tab_audit.decqucode=view_decquname.codedecqu)
left outer join view_nowquname on(tab_audit.nowqucode=view_nowquname.codenowqu)
left outer join view_nowquspecname on(tab_audit.nowquspeccode=view_nowquspecname.codenowquspec)
left outer join view_decspecseriesname on(tab_audit.decspecseriescode=view_decspecseriesname.codedecspecseries)
left outer join view_nowspecseriesname on(tab_audit.nowspecseriescode=view_nowspecseriesname.codenowspecseries)
left outer join view_specseriesname on(tab_audit.specseriescode=view_specseriesname.codespecseries)
where tab_person.idcard=tab_audit.idcard
and tab_person.delflag<>true
and tab_audit.delflag<>true;
cqnucsmoon 2003-11-14
  • 打赏
  • 举报
回复
存储过程??????
atlove 2003-11-14
  • 打赏
  • 举报
回复
为何要20个表呢,合并为一个不就好了不
tjwk 2003-11-14
  • 打赏
  • 举报
回复
用存储过程返回结果集,速度快,还可以带条件
txlicenhe 2003-11-14
  • 打赏
  • 举报
回复
对索引视图的限制
定义索引视图的 SELECT 语句不得包含 TOP、DISTINCT、COMPUTE、HAVING 和 UNION 关键字。也不能包含子查询。

SELECT 列表中不得包含星号 (*)、'table.*' 通配符列表、DISTINCT、COUNT(*)、COUNT(<expression>)、基表中的计算列和标量聚合。

非聚合 SELECT 列表中不能包含表达式。聚合 SELECT 列表(包含 GROUP BY 的查询)中可能包含 SUM 和 COUNT_BIG(<expression>);它一定包含 COUNT_BIG(*)。不允许有其它聚合函数(MIN、MAX、STDEV,...)。

使用 AVG 的复杂聚合无法参与索引视图的 SELECT 列表。不过,如果查询使用这样的聚合,则优化程序将能使用该索引视图,用 SUM 和 COUNT_BIG 的简单聚合组合代替 AVG。

若某列是从取值为 float 数据类型或使用 float 表达式进行取值的表达式得到的,则不能作为索引视图或表中计算列的索引键。这样的列被视为是不精确的。使用 COLUMNPROPERTY 函数决定特定计算列或视图中的列是否精确。

索引视图受限于以下的附加限制:

索引的创建者必须拥有表。所有表、视图和索引必须在同一数据库中创建。


定义索引视图的 SELECT 语句不得包含视图、行集函数、行内函数或派生表。同一物理表在该语句中只能出现一次。


在任何联接表中,均不允许进行 OUTER JOIN 操作。


搜索条件中不允许使用子查询或者 CONTAINS 或 FREETEXT 谓词。


如果视图定义包含 GROUP BY 子句,则视图的 SELECT 列表中必须包含所有分组依据列及 COUNT_BIG(*) 表达式。此外,CREATE UNIQUE CLUSTERED INDEX 子句中必须只包含这些列。
txlicenhe 2003-11-14
  • 打赏
  • 举报
回复
定义索引视图的 SELECT 语句不得包含视图、行集函数、行内函数或派生表。同一物理表在该语句中只能出现一次。
txlicenhe 2003-11-14
  • 打赏
  • 举报
回复
定义索引视图的 SELECT 语句不得包含 TOP、DISTINCT、COMPUTE、HAVING 和 UNION 关键字。也不能包含子查询。

SELECT 列表中不得包含星号 (*)、'table.*' 通配符列表、DISTINCT、COUNT(*)、COUNT(<expression>)、基表中的计算列和标量聚合。


字段名不能用*代替,必须写出具体的字段名。
pengdali 2003-11-14
  • 打赏
  • 举报
回复
http://expert.csdn.net/Expert/TopicView1.asp?id=2455540
cqnucsmoon 2003-11-14
  • 打赏
  • 举报
回复
结帐了
谢谢大家
chifengwatch 2003-11-13
  • 打赏
  • 举报
回复
gz
pengdali 2003-11-13
  • 打赏
  • 举报
回复
A.*改为a.xx,a.yy

简单办法到查询分析器-->打开对象浏览器-->找到你的表-->鼠标右键它-->编写查询脚本,这样你只要直接拷贝就可以了。
cqnucsmoon 2003-11-13
  • 打赏
  • 举报
回复
大力,谢谢你,我的视图就快成功了,但最后创建视图索引的时候说我的表中有自连接,我想是我一个表用了两次以上的原因吧,你看怎么解决呢?谢谢!代码如下:
CurrentSql = "create view 大力 WITH SCHEMABINDING as select " & _
"A.*,B.YJFXMC,C.BMDMC,D.XBMC,E.HFMC,F.ZZMMMC,G.XLMC,H.KSLYMC,I.KSFSMC,K.BKLBMC,L.BYDWMC," & _
"M.UDWMC,N.ZYMC,O.YXMC,P.KMMC AS ZZLLMC,R.KMMC AS WGYMC,S.KMMC AS YWK1MC,T.KMMC AS YWK2MC,U.SSMC AS HKSZSSMC," & _
"V.SSMC AS DWSZSSMC,W.XYJRMC,X.MZ FROM DBO.主表 A " & _
" JOIN DBO.BASIC_YJFXK B ON A.YXSM=B.YXDM AND A.ZYDM=B.ZYDM AND A.YJFXM=B.YJFXM " & _
" JOIN DBO.BASIC_BMD C ON A.BMDDM=C.BMDDM " & _
" JOIN DBO.BASIC_XBK D ON A.XBM=D.XBM " & _
" JOIN DBO.BASIC_HFK E ON A.HFM=E.HFM " & _
" JOIN DBO.BASIC_ZZMMK F ON A.ZZMMM=F.ZZMMM " & _
" JOIN DBO.BASIC_XLK G ON A.XLM=G.XLM " & _
" JOIN DBO.BASIC_KSLYK H ON A.KSLYM=H.KSLYM " & _
" JOIN DBO.BASIC_KSFSK I ON A.KSFSM=I.KSFSM " & _
" JOIN DBO.BASIC_BKLBK K ON A.BKLBM=K.BKLBM " & _
" JOIN DBO.BASIC_BYDWK L ON A.BYDWM=L.BYDWDM " & _
" JOIN DBO.BASIC_DWXX M ON A.DWDM=M.UDWDM " & _
" JOIN DBO.BASIC_YJFXK N ON A.ZYDM=N.ZYDM " & _' 这个表用了两次
" JOIN DBO.BASIC_YJFXK O ON A.YXSM=O.YXDM " & _
" JOIN DBO.BASIC_KSKMK P ON A.ZZLLM=P.KMDM " & _'这个表用了四次
" JOIN DBO.BASIC_KSKMK R ON A.WGYM=R.KMDM " & _
" JOIN DBO.BASIC_KSKMK S ON A.YWK1M=S.KMDM " & _
" JOIN DBO.BASIC_KSKMK T ON A.YWK2M=T.KMDM " & _
" JOIN DBO.BASIC_DWSZSSK U ON A.HKSZSSM=U.SSDM " & _
" JOIN DBO.BASIC_DWSZSSK V ON A.DWSZSSM=V.SSDM " & _
" JOIN DBO.BASIC_XYJRK W ON A.XYJRM=W.XYJRM " & _
" JOIN DBO.BASIC_MZK X ON A.MZM=X.MZM "
cqnucsmoon 2003-11-13
  • 打赏
  • 举报
回复
大力,但是如果不用的,那会产生很多重复的数据啊?
pengdali 2003-11-13
  • 打赏
  • 举报
回复
没办法。你只有先不用DISTINCT建好后,在查询的时候用这个。
cqnucsmoon 2003-11-13
  • 打赏
  • 举报
回复
大力,谢谢谢谢再谢谢

但是我COPY的那段代码里含有DISTINCT啊,按SQL SERVER参考说明上带有它也不能为视图创建索引啊?!怎么办?
pengdali 2003-11-13
  • 打赏
  • 举报
回复
那你不能为left join必须为:

create view xx
WITH SCHEMABINDING
AS
SELECT 主表.*,b.YJFXMC,c.BMDMC,d.HFMC ............ FROM 主表 a
JOIN BASIC_YJFXK b ON
a.YXSM=b.YXDM AND a.ZYDM=b.ZYDM AND a.YJFXM=b.YJFXM
JOIN BASIC_BMD c ON
A.BMDDM=c.BMDDM
JOIN BASIC_XBK d ON
A.XBM=d.XBM
JOIN BASIC_HFK e ON
A.HFM=e.HFM
JOIN BASIC_ZZMMK f ON
A.ZZMMM=f.ZZMMM
JOIN BASIC_XLK g ON
A.XLM=g.XLM
JOIN BASIC_KSLYK h ON
A.KSLYM=h.KSLYM
JOIN BASIC_KSFSK i ON
A.KSFSM=i.KSFSM
JOIN BASIC_BKLBK j ON
A.BKLBM=j.BKLBM)
JOIN BASIC_BYDWK k ON
A.BYDWM=k.BYDWDM
JOIN BASIC_DWXX l ON
A.DWDM=l.UDWDM
......
go

CREATE UNIQUE CLUSTERED INDEX IV1 ON xx (id)
cqnucsmoon 2003-11-13
  • 打赏
  • 举报
回复
大力批评的是,我再改改
不过还想麻烦大力给我看看能不能把它们改为能使用索引的视图语句
pengdali 2003-11-13
  • 打赏
  • 举报
回复
你做那么多子查询不慢才怪。
pengdali 2003-11-13
  • 打赏
  • 举报
回复
你怎么这么写代码的?


SELECT 主表.*,b.YJFXMC,c.BMDMC,d.HFMC ............ FROM 主表 a
LEFT JOIN BASIC_YJFXK b ON
a.YXSM=b.YXDM AND a.ZYDM=b.ZYDM AND a.YJFXM=b.YJFXM
LEFT JOIN BASIC_BMD c ON
A.BMDDM=c.BMDDM
LEFT JOIN BASIC_XBK d ON
A.XBM=d.XBM
LEFT JOIN BASIC_HFK e ON
A.HFM=e.HFM
LEFT JOIN BASIC_ZZMMK f ON
A.ZZMMM=f.ZZMMM
LEFT JOIN BASIC_XLK g ON
A.XLM=g.XLM
LEFT JOIN BASIC_KSLYK h ON
A.KSLYM=h.KSLYM
LEFT JOIN BASIC_KSFSK i ON
A.KSFSM=i.KSFSM
LEFT JOIN BASIC_BKLBK j ON
A.BKLBM=j.BKLBM)
LEFT JOIN BASIC_BYDWK k ON
A.BYDWM=k.BYDWDM
LEFT JOIN BASIC_DWXX l ON
A.DWDM=l.UDWDM
......
cqnucsmoon 2003-11-13
  • 打赏
  • 举报
回复
非常感谢楼上的三位,特别是大力和马可,不止一次为我想这个问题的办法了,其次从内心来讲我很想用视图,可是我的SQL语句曾经贴出来过,可马可认为这条语句不能创建视图索引(但也没有人说不,可能没有发表意见吧),现在我再次提出来,希望能改造成可以创建视图索引的视图。大力的方法我马上去试,谢谢大力,还麻烦你帮我看看这条语句能不能改为可以创建索引的视图!!!
SELECT A.*,B.MZ FROM (SELECT A.*,B.XYJRMC FROM (SELECT A.*,B.SSMC AS DWSZSSMC FROM (SELECT A.*,B.SSMC AS HKSZSSMC FROM (SELECT A.*,B.KMMC AS YWK2MC FROM (SELECT A.*,B.KMMC AS YWK1MC FROM (SELECT A.*,B.KMMC AS WGYMC FROM (SELECT A.*,B.KMMC AS ZZLLMC FROM (SELECT A.*,B.YXMC FROM (SELECT A.*, B.ZYMC FROM (SELECT A.*,B.UDWMC FROM (SELECT A.*,B.BYDWMC FROM (SELECT A.*,B.BKLBMC FROM (SELECT A.*,B.KSFSMC FROM (SELECT A.*,B.KSLYMC FROM (SELECT A.*,B.XLMC FROM (SELECT A.*,B.ZZMMMC FROM (SELECT A.*,B.HFMC FROM (SELECT A.*,B.XBMC FROM (SELECT A.*,B.BMDMC FROM (SELECT 主表.*,BASIC_YJFXK.YJFXMC FROM 主表 LEFT JOIN BASIC_YJFXK ON (主表.YXSM=BASIC_YJFXK.YXDM AND 主表.ZYDM=BASIC_YJFXK.ZYDM AND 主表.YJFXM=BASIC_YJFXK.YJFXM) ) AS A LEFT JOIN BASIC_BMD AS B ON A.BMDDM=B.BMDDM) AS A LEFT JOIN BASIC_XBK AS B ON A.XBM=B.XBM) AS A LEFT JOIN BASIC_HFK AS B ON A.HFM=B.HFM) AS A LEFT JOIN BASIC_ZZMMK AS B ON A.ZZMMM=B.ZZMMM) AS A LEFT JOIN BASIC_XLK AS B ON A.XLM=B.XLM) AS A LEFT JOIN BASIC_KSLYK AS B ON A.KSLYM=B.KSLYM) AS A LEFT JOIN BASIC_KSFSK AS B ON A.KSFSM=B.KSFSM) AS A LEFT JOIN BASIC_BKLBK AS B ON A.BKLBM=B.BKLBM) AS A LEFT JOIN BASIC_BYDWK AS B ON A.BYDWM=B.BYDWDM) AS A LEFT JOIN BASIC_DWXX AS B ON A.DWDM=B.UDWDM) AS A LEFT JOIN (SELECT DISTINCT ZYDM,ZYMC FROM BASIC_YJFXK) AS B ON A.ZYDM=B.ZYDM) AS A LEFT JOIN (SELECT DISTINCT YXDM,YXMC FROM BASIC_YJFXK) AS B ON A.YXSM=B.YXDM) AS A LEFT JOIN BASIC_KSKMK AS B ON A.ZZLLM=B.KMDM) AS A LEFT JOIN BASIC_KSKMK AS B ON A.WGYM=B.KMDM) AS A LEFT JOIN BASIC_KSKMK AS B ON A.YWK1M=B.KMDM) AS A LEFT JOIN BASIC_KSKMK AS B ON A.YWK2M=B.KMDM) AS A LEFT JOIN BASIC_DWSZSSK AS B ON A.HKSZSSM=B.SSDM) AS A LEFT JOIN BASIC_DWSZSSK AS B ON A.HKSZSSM=B.SSDM) AS A LEFT JOIN BASIC_XYJRK AS B ON A.XYJRM=B.XYJRM) AS A LEFT JOIN MZK AS B ON A.MZM=B.MZM

加载更多回复(3)

34,875

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧