Foxtable(狐表)用户栏目专家坐堂 → union多个表存储过程是否比视图更快?


  共有4764人关注过本帖树形打印复制链接

主题:union多个表存储过程是否比视图更快?

帅哥哟,离线,有人找我吗?
zpx_2012
  1楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:四尾狐 帖子:976 积分:8527 威望:0 精华:0 注册:2012/2/9 16:35:00
union多个表存储过程是否比视图更快?  发帖心情 Post By:2014/8/20 11:24:00 [显示全部帖子]

产品的出入库明细是从SQL2005数据库中的视图查询得到,该视图是由十几张结构类似的出入库单据比如销售出库单,外协出库单,生产领料单等union在一起的,数据多时从这个视图中查询越来越慢,是不是用样的union语句如果是改写在存储过程中,查询时用command从储存过程返回的结果表中取数这样效率更高?因为出入库的查询用户使用频率较高。

 回到顶部
帅哥哟,离线,有人找我吗?
zpx_2012
  2楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:四尾狐 帖子:976 积分:8527 威望:0 精华:0 注册:2012/2/9 16:35:00
  发帖心情 Post By:2014/8/20 16:33:00 [显示全部帖子]

谢谢老师们,因为很多查询条件都是开放给用户可以灵活设置的,所以查询列不固定,不好建立索引。看网上有人说储存过程中union多表查询比视图快,故才有此一问。

 回到顶部
帅哥哟,离线,有人找我吗?
zpx_2012
  3楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:四尾狐 帖子:976 积分:8527 威望:0 精华:0 注册:2012/2/9 16:35:00
  发帖心情 Post By:2014/8/20 17:14:00 [显示全部帖子]

如果要做索引的话,是在原表中做索引,还是在视图中做比较好呢?

 回到顶部
帅哥哟,离线,有人找我吗?
zpx_2012
  4楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:四尾狐 帖子:976 积分:8527 威望:0 精华:0 注册:2012/2/9 16:35:00
  发帖心情 Post By:2014/8/20 17:28:00 [显示全部帖子]

老师讲的有道理,但是问题是这个条件是动态的,用户选择不同的节点设置不同的目录树等都不一样,要怎么才能传递到视图中呢,只能改用存储过程,还是?

而且不同的用户操作,可能每个人点击时生成的条件都不一样,如果合成前就加入条件的话,会否有其他影响?

每个月新增加的记录数大概是2~3万条。

 

下面是视图的代码:

 

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER VIEW [dbo].[Stockinout]
AS
SELECT a._Identify,b.入库单号 AS 进出单号,a.入库日期 AS 进出日期,a.入库单位 AS 进出单位,a.仓库,a.仓管员, b.产品编码, b.来源单号, b.品名, b.规格, 0 AS 工序号,b.数量 AS 入库数量, 0 AS 出库数量, b.数量 AS 进出数量, b.计量单位,
              品质判定,'采购入库' AS 进出类别,0 as 盘点序号,CASE When b.品质判定 in('合格','特采') then '合格品' when b.品质判定 in('选别','退货') then '不良品' when b.品质判定 = '报废' then '报废品' else '未判定' end as 品质状态
FROM dbo.采购入库单 AS a INNER JOIN dbo.采购入库明细 AS b ON a.入库单号 = b.入库单号
UNION ALL
SELECT a._Identify,b.退货单号 AS 进出单号,a.退货日期 AS 进出日期,a.收货单位 AS 进出单位,a.仓库,a.仓管员,b.产品编码,b.来源单号,b.品名,b.规格,0 AS Expr1,0 AS 入库数量,-b.数量 AS 出库数量,b.数量 AS 进出数量,b.计量单位,
             品质状态, '采购退货' AS 进出类别,0 as 盘点序号,CASE WHEN b.品质状态 = '合格品' then '合格品' when b.品质状态 ='不良品' then '不良品' when b.品质状态 = '报废品' then '报废品' else '未判定' end as 品质状态
FROM  dbo.采购退货单 AS a INNER JOIN dbo.采购退货明细 AS b ON a.退货单号 = b.退货单号
UNION ALL

...后面的表都类似

 

[此贴子已经被作者于2014-8-20 17:50:57编辑过]

 回到顶部
帅哥哟,离线,有人找我吗?
zpx_2012
  5楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:四尾狐 帖子:976 积分:8527 威望:0 精华:0 注册:2012/2/9 16:35:00
  发帖心情 Post By:2014/8/20 17:49:00 [显示全部帖子]

谢谢几位老师,大概知道了。


 回到顶部