300分送分题,回复者有分!关于多表查询问题! ( 积分: 300 )

  • 主题发起人 主题发起人 qutwah
  • 开始时间 开始时间
Q

qutwah

Unregistered / Unconfirmed
GUEST, unregistred user!
有四个表<br>表1:<br>&nbsp;&nbsp;Autoid&nbsp;integer&nbsp;identity(1,1)&nbsp;Primary&nbsp;Key,<br>&nbsp;&nbsp;Employeeid&nbsp;Integer;<br>&nbsp;&nbsp;OldDepartmentid&nbsp;integer<br>&nbsp;&nbsp;OldJobid&nbsp;integer<br>表2:<br>&nbsp;&nbsp;Autoid&nbsp;integer&nbsp;identity(1,1)&nbsp;Primary&nbsp;Key,<br>&nbsp;&nbsp;EmployNo&nbsp;VarChar(10), <br>&nbsp;&nbsp;EmployName&nbsp;varchar(10) <br>表3:<br>&nbsp;&nbsp;Autoid&nbsp;integer&nbsp;identity(1,1)&nbsp;Primary&nbsp;Key,<br>&nbsp;&nbsp;DepartmentName&nbsp;varchar(20)<br>表4<br>&nbsp;&nbsp;Autoid&nbsp;integer&nbsp;identity(1,1)&nbsp;Primary&nbsp;Key,<br>&nbsp;&nbsp;Job&nbsp;varchar(20);<br>通过这四个表,我想查询得出一个表:<br>&nbsp;&nbsp;Autoid,EmployeeNo,EmployName,DepartmentName,Job(通过表1的Employeeid与表2的Autoid关联,表1的OldDepartmentid与表3的Autoid关联,表1的OldJobid与表4的Autoid关联,返回结果为所有表1的记录),如果使用left&nbsp;Join的话,涉及到多表关联查询,当记录较多时,可能速度很慢,如果使用查询字段的话,速度也很慢,有没有可能提高速度的最好办法?
 
这类的.我都是用连接查询的.别的也没想出什么个好的法子来.
 
请问,用连接查询,如果记录量大的话,速度如何?
 
整到一个表里面去
 
如果慢的话&nbsp;&nbsp;就用视图了
 
admin2008:<br>&nbsp;我也曾想过使用视图,但由于对视图不太了解,到目前为止,还没使用过视图.所以,有几点需向你请教:<br>&nbsp;&nbsp;一、如果象我现在的这种多表关联查询,使用视图是否能提高查询效率?<br>&nbsp;&nbsp;二、视图能进行edit,insert,update等操作吗?例如:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;使用ADOQUERY:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SQL:select&nbsp;*&nbsp;from&nbsp;View1(建立的视图)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;能否能adoquery进行以下操作:<br>&nbsp;&nbsp;&nbsp;&nbsp;adoquery.edit<br>&nbsp;&nbsp;&nbsp;&nbsp;adoquery.fieldbyname(fieldname).asstring:=str<br>&nbsp;&nbsp;&nbsp;&nbsp;adoquery.post
 
对单表的视图是可以增、删、改的,多章表的联合不可以。视图的使用很简单的,是实际表一样的。
 
假如提供两个方法,实现表1数据查询<br>方法一:<br>&nbsp;&nbsp;建立视图:<br>&nbsp;&nbsp;Create&nbsp;View&nbsp;V表1<br>&nbsp;&nbsp;AS<br>&nbsp;&nbsp;Select&nbsp;*&nbsp;from&nbsp;表1<br>在DELPHI中,使用ADOQUERY1来显示&quot;V表1&quot;的所有数据,来达到显示&quot;表1&quot;的所有记录:<br>&nbsp;&nbsp;SQL='select&nbsp;*&nbsp;from&nbsp;V表1'<br>方法二:<br>&nbsp;&nbsp;直接查询&quot;表1&quot;的所有记录:<br>&nbsp;&nbsp;SQL='Select&nbsp;*&nbsp;from&nbsp;表1';<br>在这两种方法中,哪种方法的执行速度更快?请高手指点.
 
select&nbsp;Autoid,'EmployeeNo'&nbsp;=&nbsp;(select&nbsp;EmployNo&nbsp;from&nbsp;表2&nbsp;where&nbsp;表2.Autoid&nbsp;=&nbsp;表1.Employeeid),<br>'EmployName'&nbsp;=&nbsp;(select&nbsp;EmployName&nbsp;from&nbsp;表2&nbsp;where&nbsp;表2.Autoid&nbsp;=&nbsp;表1.Employeeid),<br>'DepartmentName'&nbsp;=&nbsp;(select&nbsp;DepartmentName&nbsp;from&nbsp;表3&nbsp;where&nbsp;表3.Autoid&nbsp;=&nbsp;表1.OldDepartmentid),<br>'Job'&nbsp;=&nbsp;(select&nbsp;Job&nbsp;from&nbsp;表4&nbsp;where&nbsp;表4.Autoid&nbsp;=&nbsp;表1.OldJobid)&nbsp;from&nbsp;表1
 
银雨辰:<br>&nbsp;&nbsp;我没有试用,只是不知,如果记录多的话,这种视图的速度是否会很慢?
 
如果查询比较复杂,关联的表比较多,建议使用视图!
 
to&nbsp;银雨辰,<br>再请教一个问题:<br>&nbsp;&nbsp;对于这种视图,是否应该为该视图建立索引呢?如果要建立,那又应该如何建立索引字段?
 
视图也称为虚拟表,因为视图所返回的结果集的一般格式与表相同,都是由列和行组成,而且在&nbsp;SQL&nbsp;语句中引用视图的方式也与引用表的方式相同。标准视图的结果集不是永久地存储在数据库中。每次查询引用标准视图时,SQL&nbsp;Server都会在内部将视图的定义替换为该查询,直到修改后的查询仅引用基表。<br>&nbsp;&nbsp;对于标准视图而言,为每个引用视图的查询动态生成结果集的开销很大,特别是对于那些涉及对大量行进行复杂处理(如聚合大量数据或联接许多行)的视图。如果在查询中频繁地引用这类视图,可通过对视图创建唯一聚集索引来提高性能。对视图创建唯一聚集索引后,结果集将存储在数据库中,就像带有聚集索引的表一样。<br>&nbsp;&nbsp;如果很少更新基础数据,则索引视图的效果最佳。维护索引视图的成本可能高于维护表索引的成本。如果经常更新基础数据,则维护索引视图数据的成本可能超过使用索引视图所带来的性能收益。如果基础数据以批处理的形式定期更新,但在更新之间主要作为只读数据进行处理,请考虑在更新前删除所有索引视图,然后再重新生成。这样做可以提高更新的性能。<br><br>在对视图创建聚集索引之前,该视图必须符合下列要求:<br>&nbsp;&nbsp;1/视图不能引用任何其他视图,只能引用基表。<br>&nbsp;&nbsp;2/视图引用的所有基表必须与视图位于同一数据库中,并且所有者也与视图相同。<br>&nbsp;&nbsp;3/必须使用&nbsp;SCHEMABINDING&nbsp;选项创建视图。架构绑定将视图绑定到基础基表的架构。<br><br>对视图创建的第一个索引必须是唯一聚集索引。创建唯一聚集索引后,可以创建其他非聚集索引。视图的索引命名约定与表的索引命名约定相同。唯一的区别是表名替换为视图名。<br>SET&nbsp;NUMERIC_ROUNDABORT&nbsp;OFF;<br>SET&nbsp;ANSI_PADDING,&nbsp;ANSI_WARNINGS,&nbsp;CONCAT_NULL_YIELDS_NULL,&nbsp;ARITHABORT,<br>&nbsp;&nbsp;&nbsp;&nbsp;QUOTED_IDENTIFIER,&nbsp;ANSI_NULLS&nbsp;ON;<br>CREATE&nbsp;UNIQUE&nbsp;CLUSTERED&nbsp;INDEX&nbsp;IDX_V表1&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;ON&nbsp;V表1(Autoid);
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
I
回复
0
查看
777
import
I
后退
顶部