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

在Crystal Report SQL server 2008中使用的存储过程上创建索引,sql,sql-server,stored-procedures,crystal-reports,Sql,Sql Server,Stored Procedures,Crystal Reports,我从未在存储过程中使用过索引,因此我正在寻求帮助,因为我使用的一个报告运行速度很慢。我有一份水晶报告,是一份老化报告。在过程本身中,它正在创建一个临时表。它使用的表格temp table包含大量数据,并且正在提取大量信息。最终的结果是该报告需要花费很长时间才能运行。除了在temp表上创建索引外,欢迎您提出任何其他建议,并感谢您的关注 Create procedure [dbo].[ST_Stored] @AsofDate datetime as --drop table #rectodate d

我从未在存储过程中使用过索引,因此我正在寻求帮助,因为我使用的一个报告运行速度很慢。我有一份水晶报告,是一份老化报告。在过程本身中,它正在创建一个临时表。它使用的表格temp table包含大量数据,并且正在提取大量信息。最终的结果是该报告需要花费很长时间才能运行。除了在temp表上创建索引外,欢迎您提出任何其他建议,并感谢您的关注

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所说,您必须检查查询计划,以了解查询为何如此长。 我想说的是,在创建任何小bonheur指数之前,你必须这样做我并不是说Bogdan建议的指数是错误的,但是在不知道数据的情况下。。。这是一个猜测。 代码中有一条注释表明您尝试了一个临时表,而不是一个表变量-drop table rectodate。
出于性能原因,我会选择临时表,因为您可以将索引添加到临时表中,而不是添加到表变量中,顺便说一下,在tempdb中也可以创建表变量。

谢谢您的建议,我会尝试一下。但是我可以在临时表上创建索引吗?是的,我试过了,它不推荐任何索引。jdt1表上已经有一个聚集索引。如果jdt1上有聚集索引,那么IX_jdt1_refdate_transid_lineid_debit_credit将是一个非聚集索引。所以我应该按原样运行您提供的sql语句,还是必须将它合并到实际过程中?我知道这可能是一个愚蠢的问题,但我对开发了解不多,所以我在问。是的,您应该在使用SQL Profiler创建索引之前和之后测量此存储过程的性能SQL:Batch completed event>Duration,CPU and Reads columns>值越低越好。