【问题标题】:Stored procedure is very slow on Crystal ReportCrystal Report 上的存储过程非常慢
【发布时间】:2013-12-31 05:20:05
【问题描述】:

我使用 SQL Anywhere 作为我的数据库,并使用 Crystal Report 进行报告。

我有两个表 SALES DETAIL (POSDETAIL)Inventory Adjusted table (AdjustInventory) 并创建和查询以显示销售和浪费/调整后的查询。

输出应该是这样的

Product   SalesQty  Value    WastageQty    Value
------------------------------------------------

Sales Qty 将来自 POSDETAIL 表,WastageQty 将来自 AdjustInventory

POSDETAIL 共有 435625 条记录,AdjustInventory 共有 183528 条记录。

我在下面设计了存储过程,它可以根据需要为我提供完美的输出,并且在查询分析器中运行速度非常快,但是在 Crystal Reports 上使用此存储过程变得非常非常慢,需要将近 15 到 25 分钟才能在报表上显示数据任何日期范围。

Create PROCEDURE MyDatabaseTest.ReportUser.sp_SalesWastage ()
BEGIN
   DECLARE LOCAL TEMPORARY TABLE tblSumWastage (ProductId integer,TIMEORD  date,WastedQty integer);
   delete from  tblSumWastage;
   insert into tblSumWastage  

   select 
      DBA.AdjustInventory.INVENNUM as ProductId,
      DATEFORMAT(POSDETAIL.TIMEORD,'yyyy/mm/dd') as OrderDate,
      SUM(AdjustInventory.ADJUSTUNITS) as WastedQty
   from 
      DBA.POSDETAIL
   join 
      DBA.AdjustInventory on DBA.POSDETAIL.PRODNUM = DBA.AdjustInventory.INVENNUM
                             and DBA.AdjustInventory.AdjustType = 9 
                             and AdjustInventory.ADJUSTUNITS > 0 
                             and DATEFORMAT(DBA.AdjustInventory.AdjustTime,'yyyy/mm/dd') = DATEFORMAT(POSDETAIL.TIMEORD,'yyyy/mm/dd')
   group by 
       DBA.AdjustInventory.INVENNUM, DATEFORMAT(POSDETAIL.TIMEORD,'yyyy/mm/dd');

   select    
       p.OrderDate, p.ProductId, p.SalesQty, 
       f.WastedQty / p.SalesQty as WastedQty,
       p.EachCost
   from 
       (select 
           POSDETAIL.PRODNUM as ProductId,
           DATEFORMAT(POSDETAIL.TIMEORD,'yyyy/mm/dd') as OrderDate, 
           POSDETAIL.COSTEACH as EachCost,
           SUM(POSDETAIL.QUAN) as SalesQty
        from 
           DBA.POSDETAIL 
        group by 
           DATEFORMAT(POSDETAIL.TIMEORD,'yyyy/mm/dd'),
           POSDETAIL.PRODNUM,POSDETAIL.COSTEACH
       ) as p (ProductId, OrderDate, EachCost, SalesQty) 
   inner join 
       (select * from tblSumWastage) as f (ProductId, OrderDate, WastedQty) 
          on p.ProductId = f.ProductId and p.OrderDate = f.OrderDate;
END

【问题讨论】:

  • 统计,索引:重建。
  • Where 子句和 Group by 中的所有列都被索引,在查询分析器上运行完美,但在 Crystal Report 上非常慢。
  • "在查询分析器上运行完美,但在 Crystal Report 上却非常非常慢。" - 是的,我从你的问题中意识到这一点。再次阅读我的答案:“统计,索引:重建。”。
  • 能否请您解释一下您的答案?谢谢
  • 您的查询将忽略在同一日期没有匹配销售/订单的任何浪费,这是您想要的吗? (我还假设你不能得到 0SalesQty 的总数,否则你可能会遇到被零除的错误)。从外观上看,您应该能够组合这两个查询,这可能会有所帮助。什么 RDBMS 支持这个 - 它有 DATE() 函数吗?日期的格式最好留给显示层。但是,如果您要存储时间戳,则无法使用类似的东西。

标签: sql stored-procedures crystal-reports


【解决方案1】:

缓慢可能出现在 Crystal 报表中,而不是存储过程中。例如,如果存储过程返回大量记录并且您在记录选择公式中过滤它们。另一个可能的原因可能是您在报告中加入了另一个表,其中包含存储过程的结果。如果报告看起来不错,那么您可以检查驱动程序并使用不同的连接类型 - OLE DB、ODBC...我不知道 SQL Anywhere 到底有什么可用的。 是否有机会在多次调用的子报表中包含此内容?

【讨论】:

  • 测试记录数是否使 Crystal 变慢的一种方法是使用“Select TOP 10 ...”限制 proc 中返回的记录数。这可能会提供信息跨度>
  • 不,这不是子报表,我不能限制行,因为用户可以查询和日期范围。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-12
相关资源
最近更新 更多