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


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

主题: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从储存过程返回的结果表中取数这样效率更高?因为出入库的查询用户使用频率较高。

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


加好友 发短信
等级:贵宾 帖子:35433 积分:178524 威望:0 精华:3 注册:2013/3/30 16:36:00
  发帖心情 Post By:2014/8/20 11:29:00 [只看该作者]

一样的.

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


加好友 发短信
等级:版主 帖子:85326 积分:427815 威望:0 精华:5 注册:2012/10/18 22:13:00
  发帖心情 Post By:2014/8/20 11:29:00 [只看该作者]

 1、数据多肯定会慢,每次用多少,就查多少。

 

 2、如果是条件查询,把对应列的索引做一下。

 


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


加好友 发短信
等级:七尾狐 帖子:1731 积分:11255 威望:0 精华:0 注册:2011/12/15 22:06:00
  发帖心情 Post By:2014/8/20 14:57:00 [只看该作者]

以下是引用zpx_2012在2014-8-20 11:24:00的发言:
产品的出入库明细是从SQL2005数据库中的视图查询得到,该视图是由十几张结构类似的出入库单据比如销售出库单,外协出库单,生产领料单等union在一起的,数据多时从这个视图中查询越来越慢,是不是用样的union语句如果是改写在存储过程中,查询时用command从储存过程返回的结果表中取数这样效率更高?因为出入库的查询用户使用频率较高。
这个你使用存储过程或者表函数,带上参数,可以一定上加快速度。还有就是加载数量少也可以快很多。


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


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

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

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


加好友 发短信
等级:版主 帖子:85326 积分:427815 威望:0 精华:5 注册:2012/10/18 22:13:00
  发帖心情 Post By:2014/8/20 16:42:00 [只看该作者]

 常用到的字段,都做一下索引吧,大数据必须做索引的


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


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

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

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


加好友 发短信
等级:版主 帖子:85326 积分:427815 威望:0 精华:5 注册:2012/10/18 22:13:00
  发帖心情 Post By:2014/8/20 17:18:00 [只看该作者]

 原表。

 

 再有一个就是,你的这个视图有问题,你这样理解:你的这个视图,是查询所有表的数据,然后最后再筛选出一部分返回,耗时在查询所有表那里。

 

 你应该这样做,每union一个表格的时候,就应该在每个表都把条件加上去。

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

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


加好友 发短信
等级:七尾狐 帖子:1731 积分:11255 威望:0 精华:0 注册:2011/12/15 22:06:00
  发帖心情 Post By:2014/8/20 17:28:00 [只看该作者]

以下是引用zpx_2012在2014-8-20 16:33:00的发言:
谢谢老师们,因为很多查询条件都是开放给用户可以灵活设置的,所以查询列不固定,不好建立索引。看网上有人说储存过程中union多表查询比视图快,故才有此一问。
那你这种就是用存储过程动态合成SQL语句,效率上比直接用视图要好,特别当几个表数据量都数万行之后,效率很明显有提升


 回到顶部
帅哥哟,离线,有人找我吗?
zpx_2012
  10楼 | 信息 | 搜索 | 邮箱 | 主页 | 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编辑过]

 回到顶部
总数 13 1 2 下一页