Sql Crystal Report上的存储过程非常慢
我使用SQL Anywhere作为我的数据库,并使用Crystal Report进行报告 我有两个表Sql Crystal Report上的存储过程非常慢,sql,stored-procedures,crystal-reports,Sql,Stored Procedures,Crystal Reports,我使用SQL Anywhere作为我的数据库,并使用Crystal Report进行报告 我有两个表SALES DETAIL(POSDETAIL)和库存调整表(AdjustInventory)以及创建和查询以显示销售和损耗/调整查询 输出应该是这样的 Product SalesQty Value WastageQty Value ------------------------------------------------ 销售数量将来自POSDETAIL表,Wastage
SALES DETAIL(POSDETAIL)
和库存调整表(AdjustInventory)
以及创建和查询以显示销售和损耗/调整查询
输出应该是这样的
Product SalesQty Value WastageQty Value
------------------------------------------------
销售数量
将来自POSDETAIL
表,WastageQty
将来自AdjustInventory
POSDETAIL
共有435625条记录,AdjustInventory
共有183528条记录
我设计了以下存储过程,它根据需要为我提供完美的输出,并在查询分析器中运行得非常快,但在Crystal报表上,使用此存储过程会变得非常非常慢,几乎需要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
慢度可能出现在Crystal reports中,而不是存储过程中。例如,如果存储过程返回大量记录,并在记录选择公式中过滤它们。另一个可能的原因可能是报告中有另一个表与存储过程的结果连接在一起。如果报告看起来正常,那么您可以检查驱动程序,并使用不同的连接类型播放-OLE DB、ODBC。。。我不知道SQL Anywhere到底有什么可用的。
有没有可能在子报表(称为多次)中出现这种情况?统计信息,索引:重建。Where子句和Group by中的所有列都已编制索引,在查询分析器上运行良好,但在Crystal Report上运行非常慢。“在查询分析器上运行良好,但在Crystal Report上运行非常慢。”-是,我从你的问题中意识到了这一点。请再读一遍我的回答:“统计,索引:重建”。你能解释一下你的答案吗?谢谢您的查询将忽略在同一日期没有匹配销售/订单的任何浪费,这是您想要的吗?(我还假设对于
saleqty
,您不能得到0
的总数,否则您可能会遇到除以零的错误)。从外观上看,您应该能够组合这两个查询,这可能会有所帮助。什么RDBMS支持这一点?它是否有DATE()
函数?日期的格式最好留给显示层。但是,如果你正在存储时间戳,你就无法避免使用类似的东西。测试记录数是否使Crystal变慢的一种方法是使用“Select TOP 10…”来限制进程中返回的记录数。这可能是信息。不,这不是子报告,我不能限制行数,因为用户可以查询行数和日期范围。