以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.net/bbs/index.asp)
--  专家坐堂  (http://foxtable.net/bbs/list.asp?boardid=2)
----  union多个表存储过程是否比视图更快?  (http://foxtable.net/bbs/dispbbs.asp?boardid=2&id=55627)

--  作者:zpx_2012
--  发布时间:2014/8/20 11:24:00
--  union多个表存储过程是否比视图更快?
产品的出入库明细是从SQL2005数据库中的视图查询得到,该视图是由十几张结构类似的出入库单据比如销售出库单,外协出库单,生产领料单等union在一起的,数据多时从这个视图中查询越来越慢,是不是用样的union语句如果是改写在存储过程中,查询时用command从储存过程返回的结果表中取数这样效率更高?因为出入库的查询用户使用频率较高。
--  作者:Bin
--  发布时间:2014/8/20 11:29:00
--  
一样的.
--  作者:有点甜
--  发布时间:2014/8/20 11:29:00
--  

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

 

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

 


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


--  作者:zpx_2012
--  发布时间:2014/8/20 16:33:00
--  
谢谢老师们,因为很多查询条件都是开放给用户可以灵活设置的,所以查询列不固定,不好建立索引。看网上有人说储存过程中union多表查询比视图快,故才有此一问。
--  作者:有点甜
--  发布时间:2014/8/20 16:42:00
--  

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


--  作者:zpx_2012
--  发布时间:2014/8/20 17:14:00
--  
如果要做索引的话,是在原表中做索引,还是在视图中做比较好呢?
--  作者:有点甜
--  发布时间:2014/8/20 17:18:00
--  

 原表。

 

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

 

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

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

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


--  作者:zpx_2012
--  发布时间: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编辑过]