救命啊,关于存储过程的优化!SQL SERVER2005!
下面是我的存储过程,想取得每一个id每一天(从07.2.7到07.7.17)的总数以及在各种情况下出现的总数。id一共有460个左右,但执行起来慢的可怜了。从表T中去查,表T有大概1700万条数据。
USE [TEMP]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[up_statistic_amount_detail]
-- Add the parameters for the stored procedure here
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
CREATE TABLE Stat_amount_detail(ID INT NOT NULL,
TDate DATETIME,
SAmountEachDay INT NOT NULL,
CAmountEachDay INT NOT NULL,
QAmountEachDay INT NOT NULL,
TAmountEachDay INT NOT NULL,
PAmountEachDay INT NOT NULL);
-- Insert statements for procedure here
DECLARE @DATE DATETIME;
DECLARE @MAXDATE DATETIME;
/*RECORD ONCE ROUND COST TIME*/
DECLARE @PROCESSTIME DATETIME;
DECLARE @FINALDATE DATETIME;
DECLARE @TIMEEXP INT;
SET @MAXDATE='2007-7-17 23:59:59';
DECLARE @SAmount INT;
DECLARE @CAmount INT;
DECLARE @QAmount INT;
DECLARE @TAmount INT;
DECLARE @PAmount INT;
DECLARE @ID INT;
DECLARE ID_CURSOR CURSOR FOR
SELECT DISTINCT(ID) FROM T ORDER BY ID ASC;
OPEN ID_CURSOR;
FETCH NEXT FROM ID_CURSOR INTO @ID;
WHILE(@@FETCH_STATUS=0)
BEGIN
SET @DATE='2007-2-7 0:00:00';
WHILE(@DATE<=@MAXDATE)
BEGIN
CREATE TABLE TL(
ID varchar(32) NOT NULL,
TID varchar(20) NOT NULL,
TDATE datetime NOT NULL
)
CREATE CLUSTERED INDEX temp_index_id ON TL(ID);
CREATE NONCLUSTERED INDEX temp_index_tdate ON TL(TDATE);
CREATE NONCLUSTERED INDEX temp_index_tid ON TL(TID);
SET @FINALDATE=DATEADD(DAY,1,@DATE);
SET @PROCESSTIME=GETDATE();
INSERT INTO TL SELECT ID,TID,TDATE FROM T WHERE ID=@ID AND TDATE BETWEEN @DATE AND @FINALDATE;
SELECT @SAmount=COUNT(ID) FROM TL;
/*SELECT @CAmount=COUNT(ID) FROM TL WHERE TID='20001';*/
SELECT @QueryAmount=COUNT(ID) FROM TL WHERE TID='20002';
SELECT @PwdAmount=COUNT(ID) FROM TL WHERE TID='20004';
SELECT @TransferAmount=COUNT(ID) FROM TL WHERE TID='20005';
SET @CAmount=@SAmount-@QAmount-@PAmount-@TAmount;
INSERT INTO Stat_amount_detail VALUES(@ID,@TDATE,@SAmount,@CAmount,@QAmount,@TAmount,@PAmount);
SET @DATE=DATEADD(DAY,1,@DATE);
DROP TABLE TL;
SELECT @TIMEEXP=DATEDIFF(MS,@PROCESSTIME,GETDATE());
PRINT('one round spend time:');
PRINT(@TIMEEXP);
END
FETCH NEXT FROM ID_CURSOR INTO @ID;
END
END
表T中有非聚集索引ID和非聚集索引TDATE,我测试了一下,大概跑完一个id需要12分钟。大家帮忙看看,什么原因,有没有什么提高效率的办法,谢谢!在线等!!!