如何应付表数据过大的查询问题?(如何尽量避免大表关联)
2009-01-15 10:19:28 来源:WEB开发网的产生都是实时的,即当调用视图时,自动扩展视图,去运行里面相应的select语句.后来才知道在2000后的版本中视图分一般视图和索引视图,一般视图就是没有创建索引的我印象中的视图.而创建了视图后就称为索引视图.索引视图是物理存在的,可在视图上首先创建一个唯一的聚集索引,其它字段上也可创建非聚集索引.在不改变基础表的情况下,起到了优化的效果.
CREATE VIEW memberView
WITH SCHEMABINDING
AS
SELECT cardNo,proxyID from member
GO
--以会员卡号创建一个唯一聚集索引
CREATE UNIQUE CLUSTERED INDEX ix_member_cardNo
ON member (cardNo);
GO
注意:创建索引视图要点:
1: CREATE VIEW memberView后面要跟上WITH SCHEMABINDING
理由:? 使用 schemaname.objectname 明确识别视图所引用的所有对象,而不管是哪个用户访问该视图.
? 不会以导致视图定义非法或强制 SQL Server 在该视图上重新创建索引的方式,更改视图定义中所引用的对象.
2:视图上的第一个索引必须为 CLUSTERED 和 UNIQUE.
理由:必须为 UNIQUE 以便在维护索引视图期间,轻松地按键值查找视图中的记录,并阻止创建带有重复项目的视图(要求维护特殊的逻辑).必须为 CLUSTERED,因为只有聚集索引才能在强制唯一性的同时存储行.
3:以下情况可考虑创建索引视图:
? 可预先计算聚合并将其保存在索引中,从而在查询执行时,最小化高成本的计算.
? 可预先联接各个表并保存最终获得的数据集.
? 可保存联接或聚合的组合.
4:基础表的更新会引发索引视力的更新.
5:索引视图的创建同时会带来维护上的开销.
理由:1:因为索引视图是物理存在的.
2:要额外的维护索引.
实现:SQL:select 字段 from order
inner join memberView on
order.cardNo=member.cardNo
and member.proxyID=in('a-01',代理号二)
and 时间 between '20080101' and '20080131'
总结:两种解决方案来看,各有所长,一般可以优先考虑使用索引视图来优化大表关联.以上是本人对于如何尽量避免发生大表关联所采取的措施,望大家指教.
更多精彩
赞助商链接