资源描述:
《如何应付表数据过大的查询问题-(如何尽量避免大表关联)》由会员上传分享,免费在线阅读,更多相关内容在学术论文-天天文库。
1、如何应付表数据过大的查询问题?(如何尽量避免大表关联)>>教育资源库 一般来说,对于做B/S架构的朋友来说,更有机会遇到高并发的数据库访问情况,因为现在ember,一个会员有一个代理号:proxyID,代理下面有许多的会员卡:cardNo,它们共用一个代理号. 两表通过cardNo来相关联. 需求:查询一个用户或者某些用户某一时间段所有会员卡产生的订单情况. 实现SQL: select字段fromorder innerjoinmemberon order.cardNo=member.cardNo andmember.p
2、roxyIDin('a-01',代理号二) and时间betember表只起到数据约束的作用,和查询用户会员卡号的作用,所有可以先把代理的会员卡号先取到表变量中,然后利用带有卡号的表变量和订单表相关联查询. declarettable (cardNoint) insertt selectcardNofrommemberorder innerjointon order.cardNo=t.cardNoand时间betember表只用到了其中的两个字段(cardNo,proxyID).设想一下,此时的member表如果只
3、有这两个字段情况会不会好些呢?答案不言而喻. 视图这个名词在我以前对它的印象中,从来没有认为视图能优化查询,因为我认为视图对于数据库来说就是一个虚假表,在数据库中并无实际物理位置来存储数据.对于用户来说无非就是通过不同的视角来观看结果.视图数据 的产生都是实时的,即当调用视图时,自动扩展视图,去运行里面相应的select语句.后来才知道在2000后的版本中视图分一般视图和索引视图,一般视图就是没有创建索引的我印象中的视图.而创建了视图后就称为索引视图.索引视图是物理存在的,可在视图上首先创建一个唯一的聚集索引,其它字段上也可创建非聚集索引.在不改变基础表的情况下,起到
4、了优化的效果. CREATEVIEemberViememberGO--以会员卡号创建一个唯一聚集索引CREATEUNIQUECLUSTEREDINDEXix_member_cardNo ONmember(cardNo); GO 注意:创建索引视图要点: 1:CREATEVIEemberVieaname.objectname明确识别视图所引用的所有对象,而不管是哪个用户访问该视图. ?不会以导致视图定义非法或强制SQLServer在该视图上重新创建索引的方式,更改视图定义中所引用的对象. 2:视图上的第一个索引必须为CLUSTERED和UNIQUE. 理由:必
5、须为UNIQUE以便在维护索引视图期间,轻松地按键值查找视图中的记录,并阻止创建带有重复项目的视图(要求维护特殊的逻辑).必须为CLUSTERED,因为只有聚集索引才能在强制唯一性的同时存储行. 3:以下情况可考虑创建索引视图: ?可预先计算聚合并将其保存在索引中,从而在查询执行时,最小化高成本的计算. ?可预先联接各个表并保存最终获得的数据集. ?可保存联接12下一页>>>>这篇文章来自..,。或聚合的组合. 4:基础表的更新会引发索引视力的更新. 5:索引视图的创建同时会带来维护上的开销. 理由:1:因为索引视图是物理存在的. 2:要额外的维护索引.
6、 实现:SQL:select字段fromorder innerjoinmemberVieember.cardNo andmember.proxyID=in('a-01',代理号二) and时间between'20080101'and'20080131' 总结:两种解决方案来看,各有所长,一般可以优先考虑使用索引视图来优化大表关联.以上是本人对于如何尽量避免发生大表关联所采取的措施,望大家指教.上一页12>>>>这篇文章来自..,。