繁体   English   中英

在Crystal Report SQL Server 2008中使用的存储过程上创建索引

[英]Creating Index on a stored procedure used in a Crystal Report SQL server 2008

我从来没有在存储过程中使用索引,所以我正在寻求帮助,因为我的一个报告正在运行v slow。 我有一份水晶报告,这是一份老化报告。 在过程本身中,它正在创建一个临时表。 它使用表格临时表的表格有很多数据,并且正在提取大量信息。 最终结果是报告需要永远运行。 除了在临时表上创建索引外,还欢迎任何其他建议,感谢您查看此内容。代码如下。

Create procedure [dbo].[ST_Stored] @AsofDate datetime
as
--drop table #rectodate
declare  @rectodate table (transid INT, transrowid INT, reconsum REAL)


INSERT into @rectodate
select      transid, transrowid, sum(reconsum) as reconsum
from  itr1
where reconnum in (select reconnum from oitr where recondate <=@AsofDate)
group by transid, transrowid

select      t0.transid, t2.cardcode,
            case when t0.debit <> 0 then t0.debit - isnull(t1.reconsum,0) else 0 end as OpenDebit,
            case when t0.credit <> 0 then t0.credit - isnull(t1.reconsum, 0) else 0 end as OpenCredit,
            t0.debit, t0.credit,*
            from  jdt1 t0 left outer join @RecToDate t1
            on t0.transid = t1.transid and t0.line_id= t1.transrowid
            left join OINV t2 on t2.CardCode=t0.ShortName
            join oslp on oslp.slpcode = t2.slpcode

where t0.refdate =@AsofDate and t2.slpcode=5
order by t0.transid, t2.cardcode, t0.refdate

1)您可以做的最简单的事情是在SSMS中执行此存储过程并激活Include Actual Execution Plan选项,以查看SQL Server是否显示您创建缺失索引。 如果可以,那么您应该发布此执行计划。

2)我会创建以下索引(如果没有):

CREATE /*UNIQUE*/ INDEX IX_jdt1_refdate_#_transid_lineid_debit_credit
ON dbo.jdt1(refdate)
INCLUDE (transid,line_id,debit,credit)

正如Bogdan所说,你必须检查查询计划,以了解你的查询为何如此长。 而且我会说你必须创建任何索引“au petit bonheur” 之前这样做(我不是说Bogdan建议的索引是错误的,但不知道数据......这是一个猜测:)。 您的代码中有一条注释显示您尝试了临时表而不是表变量(--drop table #rectodate)。 出于性能原因,我会使用临时表,因为您可以将临时表的索引添加到表变量(并且也可以在tempdb中创建表变量的方式)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM