我写个存储过程,放如参数运行非常慢,8分多种都没个结果的,但是把里面的SQL拿出来同样带入变量,一样的数据40秒就出来,弄了半天,实在没办法了...
代码如下:
ALTER PROCEDURE [dbo].[SP_Mark_IVRXINGYUAN]
@CurrentDate NVARCHAR(10)
AS
BEGIN
SET NOCOUNT ON;
DECLARE @IFEXEC INT
SELECT @IFEXEC=0
SELECT @IFEXEC=COUNT(1) FROM DBO.ERRORTIMELISTS(NOLOCK)
WHERE ErrorTime = @CurrentDate AND IsIMusic=10
IF @IFEXEC=0
BEGIN
INSERT OPENROWSET('SQLOLEDB','255.255.255.255';'null';'null',
DB_MARK.dbo.Mark_IVRXINGYUAN)
SELECT P.DATE
,ISNULL(A.TIMEST,0) 拨打总次数
,ISNULL(E.TIMEST,0) 信元日志订购次数
,ISNULL(A.TIMESP,0) 挂机人数
,ISNULL(B.TIMEST,0) 下发次数
,ISNULL(C.TIMEST,0) 回拨次数
,ISNULL(D.TIMEST,0) 挂机订购次数
,ISNULL(B.TIMESP,0) 下发人数
,ISNULL(C.TIMESP,0) 回拨人数
,ISNULL(D.TIMESp,0) 挂机订购人数
,ISNULL(F.TIMEST,0) [10S挂机次数]
,ISNULL(F.TIMESP,0) [10S挂机人数]
,ISNULL(G.TIMEST,0) [LC订购次数]
,ISNULL(H.TIMEST,0) [LC信元订购次数]
,NULL
,NULL
,ISNULL(I.TIMEST,0) [10S挂机订购次数]
,ISNULL(I.TIMESP,0) [10S挂机订购人数]
FROM
(SELECT DATE FROM DBO.DIM_DATE WHERE [email=DATE=@CurrentDate]DATE=@CurrentDate[/email]) P
LEFT JOIN
(SELECT CURRENTDATE,COUNT(CURRENTDATE) TIMEST,COUNT(DISTINCT CALLER_NUM) TIMESP
FROM
(
SELECT CURRENTDATE,CALLER_NUM
FROM DBO.IVR_CALL_HISTORY(NOLOCK) WHERE CURRENTDATE [email==@CurrentDate]=@CurrentDate[/email]
AND KEY_TYPE='100'
GROUP BY CURRENTDATE,UNI_CODE,CALLER_NUM
) A
GROUP BY CURRENTDATE) A ON P.DATE=A.CURRENTDATE
LEFT JOIN
(SELECT CURRENTDATE,COUNT(CURRENTDATE) TIMEST,COUNT(DISTINCT CALLER_NUM) TIMESP
FROM
(
SELECT CURRENTDATE,CALLER_NUM
FROM DBO.IVR_CALL_HISTORY(NOLOCK) WHERE CURRENTDATE [email==@CurrentDate]=@CurrentDate[/email]
AND KEY_TYPE='100'
AND (SENDSMS = 1)
GROUP BY CURRENTDATE,UNI_CODE,CALLER_NUM
) B
GROUP BY CURRENTDATE) B ON P.DATE=B.CURRENTDATE
LEFT JOIN
(
SELECT CURRENTDATE,COUNT(CURRENTDATE) TIMEST, COUNT(DISTINCT CALLER_NUM) TIMESP FROM
(
SELECT A.CURRENTDATE,A.CALLER_NUM FROM
(SELECT CURRENTDATE,CALLER_NUM,START_TIME FROM DBO.IVR_CALL_HISTORY(NOLOCK)
WHERE CURRENTDATE [email==@CurrentDate]=@CurrentDate[/email]
AND KEY_TYPE = '100') A
RIGHT JOIN (
SELECT CURRENTDATE,CALLER_NUM, MIN(START_TIME) START_TIME FROM DBO.IVR_CALL_HISTORY
WHERE CURRENTDATE [email==@CurrentDate]=@CurrentDate[/email]
AND KEY_TYPE = '100'
AND (SENDSMS = 1)
GROUP BY CALLER_NUM,CURRENTDATE) B
ON A.CALLER_NUM = B.CALLER_NUM
WHERE A.START_TIME > B.START_TIME
)XX
GROUP BY CURRENTDATE
) C ON P.DATE=C.CURRENTDATE
LEFT JOIN
(
SELECT CURRENTDATE,COUNT(CURRENTDATE) TIMEST FROM
(
SELECT CURRENTDATE FROM DBO.IVR_OPER_HISTORY
WHERE (GATE_TYPE='订购铃音盒' OR GATE_TYPE='下载铃音' OR
GATE_TYPE='下载铃音_外呼' OR GATE_TYPE='赠送铃音')
AND CURRENTDATE [email==@CurrentDate]=@CurrentDate[/email]
AND RETURE_CODE=0
GROUP BY CURRENTDATE,UNI_CODE
) XX
GROUP BY CURRENTDATE
) E ON P.DATE=E.CURRENTDATE
LEFT JOIN
(SELECT CURRENTDATE,COUNT(CURRENTDATE) TIMEST,COUNT(DISTINCT CALLER_NUM) TIMESP
FROM
(
SELECT CURRENTDATE,CALLER_NUM
FROM DBO.IVR_CALL_HISTORY WHERE CURRENTDATE [email==@CurrentDate]=@CurrentDate[/email]
AND KEY_TYPE='100'
AND DATEDIFF(second,START_TIME,END_TIME)<=10
GROUP BY CURRENTDATE,UNI_CODE,CALLER_NUM
) XX
GROUP BY CURRENTDATE) F ON P.DATE=F.CURRENTDATE
LEFT JOIN
(SELECT CURRENTDATE,COUNT(CURRENTDATE) TIMEST,COUNT(DISTINCT CALLER_ID) TIMESP
FROM dbo.LC_Order_History WHERE SOURCE_TYPE=0 AND OP_STATUS=0
AND [email=CurrentDate=@CurrentDate]CurrentDate=@CurrentDate[/email]
GROUP BY CURRENTDATE) G ON P.DATE=G.CURRENTDATE
LEFT JOIN
(SELECT CURRENTDATE,COUNT(CURRENTDATE) TIMEST,COUNT(DISTINCT CALLER_ID) TIMESP
FROM dbo.LC_Order_History WHERE SOURCE_TYPE=0 AND OP_STATUS=0
AND source_code='11001'
AND [email=CurrentDate=@CurrentDate]CurrentDate=@CurrentDate[/email]
GROUP BY CURRENTDATE) H ON P.DATE=H.CURRENTDATE
LEFT JOIN
(
SELECT CURRENTDATE,COUNT(CURRENTDATE) TIMEST,COUNT(DISTINCT CALLER_NUM) TIMESP FROM
(
SELECT CURRENTDATE,CALLER_NUM,UNI_CODE FROM DBO.IVR_OPER_HISTORY
WHERE (GATE_TYPE='订购铃音盒' OR GATE_TYPE='下载铃音' OR
GATE_TYPE='下载铃音_外呼' OR GATE_TYPE='赠送铃音')
AND CURRENTDATE [email==@CurrentDate]=@CurrentDate[/email]
AND RETURE_CODE=0
) A
RIGHT JOIN
(
SELECT A.UNI_CODE FROM
(
SELECT CALLER_NUM,UNI_CODE,START_TIME FROM DBO.IVR_CALL_HISTORY
WHERE CURRENTDATE [email==@CurrentDate]=@CurrentDate[/email]
AND KEY_TYPE = '100'
) A
RIGHT JOIN (
SELECT CURRENTDATE,CALLER_NUM, MIN(START_TIME) START_TIME FROM DBO.IVR_CALL_HISTORY
WHERE CURRENTDATE [email==@CurrentDate]=@CurrentDate[/email]
AND KEY_TYPE = '100'
AND (SENDSMS = 1)
GROUP BY CALLER_NUM,CURRENTDATE) B
ON A.CALLER_NUM = B.CALLER_NUM
WHERE A.START_TIME > B.START_TIME
) B ON A.UNI_CODE=B.UNI_CODE
WHERE A.UNI_CODE IS NOT NULL
GROUP BY CURRENTDATE
) D ON P.DATE=D.CURRENTDATE
LEFT JOIN
(
SELECT CURRENTDATE,COUNT(CURRENTDATE) TIMEST,COUNT(DISTINCT CALLER_NUM) TIMESP FROM
(
SELECT CURRENTDATE,CALLER_NUM,UNI_CODE FROM DBO.IVR_OPER_HISTORY
WHERE (GATE_TYPE='订购铃音盒' OR GATE_TYPE='下载铃音' OR
GATE_TYPE='下载铃音_外呼' OR GATE_TYPE='赠送铃音')
AND CURRENTDATE [email==@CurrentDate]=@CurrentDate[/email]
AND RETURE_CODE=0
) A
RIGHT JOIN
(
SELECT A.UNI_CODE FROM
(
SELECT CALLER_NUM,UNI_CODE,START_TIME FROM DBO.IVR_CALL_HISTORY
WHERE CURRENTDATE [email==@CurrentDate]=@CurrentDate[/email]
AND KEY_TYPE = '100'
) A
RIGHT JOIN (
SELECT CURRENTDATE,CALLER_NUM, MIN(START_TIME) START_TIME FROM DBO.IVR_CALL_HISTORY
WHERE CURRENTDATE [email==@CurrentDate]=@CurrentDate[/email]
AND KEY_TYPE = '100'
GROUP BY CALLER_NUM,CURRENTDATE) B
ON A.CALLER_NUM = B.CALLER_NUM
WHERE A.START_TIME > B.START_TIME
) B ON A.UNI_CODE=B.UNI_CODE
WHERE A.UNI_CODE IS NOT NULL
GROUP BY CURRENTDATE
) I ON P.DATE=I.CURRENTDATE
END
END
代码如下:
ALTER PROCEDURE [dbo].[SP_Mark_IVRXINGYUAN]
@CurrentDate NVARCHAR(10)
AS
BEGIN
SET NOCOUNT ON;
DECLARE @IFEXEC INT
SELECT @IFEXEC=0
SELECT @IFEXEC=COUNT(1) FROM DBO.ERRORTIMELISTS(NOLOCK)
WHERE ErrorTime = @CurrentDate AND IsIMusic=10
IF @IFEXEC=0
BEGIN
INSERT OPENROWSET('SQLOLEDB','255.255.255.255';'null';'null',
DB_MARK.dbo.Mark_IVRXINGYUAN)
SELECT P.DATE
,ISNULL(A.TIMEST,0) 拨打总次数
,ISNULL(E.TIMEST,0) 信元日志订购次数
,ISNULL(A.TIMESP,0) 挂机人数
,ISNULL(B.TIMEST,0) 下发次数
,ISNULL(C.TIMEST,0) 回拨次数
,ISNULL(D.TIMEST,0) 挂机订购次数
,ISNULL(B.TIMESP,0) 下发人数
,ISNULL(C.TIMESP,0) 回拨人数
,ISNULL(D.TIMESp,0) 挂机订购人数
,ISNULL(F.TIMEST,0) [10S挂机次数]
,ISNULL(F.TIMESP,0) [10S挂机人数]
,ISNULL(G.TIMEST,0) [LC订购次数]
,ISNULL(H.TIMEST,0) [LC信元订购次数]
,NULL
,NULL
,ISNULL(I.TIMEST,0) [10S挂机订购次数]
,ISNULL(I.TIMESP,0) [10S挂机订购人数]
FROM
(SELECT DATE FROM DBO.DIM_DATE WHERE [email=DATE=@CurrentDate]DATE=@CurrentDate[/email]) P
LEFT JOIN
(SELECT CURRENTDATE,COUNT(CURRENTDATE) TIMEST,COUNT(DISTINCT CALLER_NUM) TIMESP
FROM
(
SELECT CURRENTDATE,CALLER_NUM
FROM DBO.IVR_CALL_HISTORY(NOLOCK) WHERE CURRENTDATE [email==@CurrentDate]=@CurrentDate[/email]
AND KEY_TYPE='100'
GROUP BY CURRENTDATE,UNI_CODE,CALLER_NUM
) A
GROUP BY CURRENTDATE) A ON P.DATE=A.CURRENTDATE
LEFT JOIN
(SELECT CURRENTDATE,COUNT(CURRENTDATE) TIMEST,COUNT(DISTINCT CALLER_NUM) TIMESP
FROM
(
SELECT CURRENTDATE,CALLER_NUM
FROM DBO.IVR_CALL_HISTORY(NOLOCK) WHERE CURRENTDATE [email==@CurrentDate]=@CurrentDate[/email]
AND KEY_TYPE='100'
AND (SENDSMS = 1)
GROUP BY CURRENTDATE,UNI_CODE,CALLER_NUM
) B
GROUP BY CURRENTDATE) B ON P.DATE=B.CURRENTDATE
LEFT JOIN
(
SELECT CURRENTDATE,COUNT(CURRENTDATE) TIMEST, COUNT(DISTINCT CALLER_NUM) TIMESP FROM
(
SELECT A.CURRENTDATE,A.CALLER_NUM FROM
(SELECT CURRENTDATE,CALLER_NUM,START_TIME FROM DBO.IVR_CALL_HISTORY(NOLOCK)
WHERE CURRENTDATE [email==@CurrentDate]=@CurrentDate[/email]
AND KEY_TYPE = '100') A
RIGHT JOIN (
SELECT CURRENTDATE,CALLER_NUM, MIN(START_TIME) START_TIME FROM DBO.IVR_CALL_HISTORY
WHERE CURRENTDATE [email==@CurrentDate]=@CurrentDate[/email]
AND KEY_TYPE = '100'
AND (SENDSMS = 1)
GROUP BY CALLER_NUM,CURRENTDATE) B
ON A.CALLER_NUM = B.CALLER_NUM
WHERE A.START_TIME > B.START_TIME
)XX
GROUP BY CURRENTDATE
) C ON P.DATE=C.CURRENTDATE
LEFT JOIN
(
SELECT CURRENTDATE,COUNT(CURRENTDATE) TIMEST FROM
(
SELECT CURRENTDATE FROM DBO.IVR_OPER_HISTORY
WHERE (GATE_TYPE='订购铃音盒' OR GATE_TYPE='下载铃音' OR
GATE_TYPE='下载铃音_外呼' OR GATE_TYPE='赠送铃音')
AND CURRENTDATE [email==@CurrentDate]=@CurrentDate[/email]
AND RETURE_CODE=0
GROUP BY CURRENTDATE,UNI_CODE
) XX
GROUP BY CURRENTDATE
) E ON P.DATE=E.CURRENTDATE
LEFT JOIN
(SELECT CURRENTDATE,COUNT(CURRENTDATE) TIMEST,COUNT(DISTINCT CALLER_NUM) TIMESP
FROM
(
SELECT CURRENTDATE,CALLER_NUM
FROM DBO.IVR_CALL_HISTORY WHERE CURRENTDATE [email==@CurrentDate]=@CurrentDate[/email]
AND KEY_TYPE='100'
AND DATEDIFF(second,START_TIME,END_TIME)<=10
GROUP BY CURRENTDATE,UNI_CODE,CALLER_NUM
) XX
GROUP BY CURRENTDATE) F ON P.DATE=F.CURRENTDATE
LEFT JOIN
(SELECT CURRENTDATE,COUNT(CURRENTDATE) TIMEST,COUNT(DISTINCT CALLER_ID) TIMESP
FROM dbo.LC_Order_History WHERE SOURCE_TYPE=0 AND OP_STATUS=0
AND [email=CurrentDate=@CurrentDate]CurrentDate=@CurrentDate[/email]
GROUP BY CURRENTDATE) G ON P.DATE=G.CURRENTDATE
LEFT JOIN
(SELECT CURRENTDATE,COUNT(CURRENTDATE) TIMEST,COUNT(DISTINCT CALLER_ID) TIMESP
FROM dbo.LC_Order_History WHERE SOURCE_TYPE=0 AND OP_STATUS=0
AND source_code='11001'
AND [email=CurrentDate=@CurrentDate]CurrentDate=@CurrentDate[/email]
GROUP BY CURRENTDATE) H ON P.DATE=H.CURRENTDATE
LEFT JOIN
(
SELECT CURRENTDATE,COUNT(CURRENTDATE) TIMEST,COUNT(DISTINCT CALLER_NUM) TIMESP FROM
(
SELECT CURRENTDATE,CALLER_NUM,UNI_CODE FROM DBO.IVR_OPER_HISTORY
WHERE (GATE_TYPE='订购铃音盒' OR GATE_TYPE='下载铃音' OR
GATE_TYPE='下载铃音_外呼' OR GATE_TYPE='赠送铃音')
AND CURRENTDATE [email==@CurrentDate]=@CurrentDate[/email]
AND RETURE_CODE=0
) A
RIGHT JOIN
(
SELECT A.UNI_CODE FROM
(
SELECT CALLER_NUM,UNI_CODE,START_TIME FROM DBO.IVR_CALL_HISTORY
WHERE CURRENTDATE [email==@CurrentDate]=@CurrentDate[/email]
AND KEY_TYPE = '100'
) A
RIGHT JOIN (
SELECT CURRENTDATE,CALLER_NUM, MIN(START_TIME) START_TIME FROM DBO.IVR_CALL_HISTORY
WHERE CURRENTDATE [email==@CurrentDate]=@CurrentDate[/email]
AND KEY_TYPE = '100'
AND (SENDSMS = 1)
GROUP BY CALLER_NUM,CURRENTDATE) B
ON A.CALLER_NUM = B.CALLER_NUM
WHERE A.START_TIME > B.START_TIME
) B ON A.UNI_CODE=B.UNI_CODE
WHERE A.UNI_CODE IS NOT NULL
GROUP BY CURRENTDATE
) D ON P.DATE=D.CURRENTDATE
LEFT JOIN
(
SELECT CURRENTDATE,COUNT(CURRENTDATE) TIMEST,COUNT(DISTINCT CALLER_NUM) TIMESP FROM
(
SELECT CURRENTDATE,CALLER_NUM,UNI_CODE FROM DBO.IVR_OPER_HISTORY
WHERE (GATE_TYPE='订购铃音盒' OR GATE_TYPE='下载铃音' OR
GATE_TYPE='下载铃音_外呼' OR GATE_TYPE='赠送铃音')
AND CURRENTDATE [email==@CurrentDate]=@CurrentDate[/email]
AND RETURE_CODE=0
) A
RIGHT JOIN
(
SELECT A.UNI_CODE FROM
(
SELECT CALLER_NUM,UNI_CODE,START_TIME FROM DBO.IVR_CALL_HISTORY
WHERE CURRENTDATE [email==@CurrentDate]=@CurrentDate[/email]
AND KEY_TYPE = '100'
) A
RIGHT JOIN (
SELECT CURRENTDATE,CALLER_NUM, MIN(START_TIME) START_TIME FROM DBO.IVR_CALL_HISTORY
WHERE CURRENTDATE [email==@CurrentDate]=@CurrentDate[/email]
AND KEY_TYPE = '100'
GROUP BY CALLER_NUM,CURRENTDATE) B
ON A.CALLER_NUM = B.CALLER_NUM
WHERE A.START_TIME > B.START_TIME
) B ON A.UNI_CODE=B.UNI_CODE
WHERE A.UNI_CODE IS NOT NULL
GROUP BY CURRENTDATE
) I ON P.DATE=I.CURRENTDATE
END
END
这位大虾,能否详细解释一下啊