此查询执行后无法执行,只是永久加载。
这里或多或少是我的查询概述,而在我的真实查询中只是更多列。
const Botkit = require('./node_modules/lib/botkit/lib/JabberBot.js');
var controller = Botkit({
json_file_store: './bot_store/'
});
var bot = controller.spawn({
client: {
jid: botConfig.jid,
password: botConfig.password,
host: botConfig.host,
port: botConfig.port
}
});
我试图找到哪个表是有问题的表,然后发现它是表CurrentYear。如果我在此表--CurrentYear上发表评论并摆脱对该表的选择,则它是可执行的。仅选择此表仅需要执行4秒即可。
之后,我尝试将该表插入到temp #CurrentYear中,并且它也可以工作。我尝试将其他表插入#temp Ex。#PreviousYear而不使用CurrentYear表,它也可以工作。我还试图注释除CurrentYear以外的所有其他表,它也可以工作。
总体而言,它花了28到30秒的时间完成并拥有3万条记录。
年份映射只是具有这样的值的表
;WITH Person AS
(
SELECT OrderYear, PersonID, Name, OrderCount, OrderValue, OrderPoint
FROM PersonTable
)
, PreviousYear AS
(
SELECT
A.PersonID,
[PreviousYearOrderCount] = A.OrderCount,
[PreviousYearOrderValue] = A.OrderValue,
[PreviousYearOrderPoint] = A.OrderPoint
FROM
PersonTable A
JOIN
YearMapping B ON A.OrderYear = B.OrderYear
AND B.YearFlag = 'PreviousYear'
)
, CurrentYear AS
(
SELECT
A.PersonID,
[CurrentYearOrderCount] = A.OrderCount,
[CurrentYearOrderValue] = A.OrderValue,
[CurrentYearOrderPoint] = A.OrderPoint
FROM
PersonTable A
JOIN
YearMapping B ON A.OrderYear = B.OrderYear
AND B.YearFlag = 'CurrentYear'
)
, NextYear AS
(
SELECT
A.PersonID,
[CurrentYearOrderCount] = A.OrderCount,
[CurrentYearOrderValue] = A.OrderValue,
[CurrentYearOrderPoint] = A.OrderPoint
FROM
PersonTable A
JOIN
YearMapping B ON A.OrderYear = B.OrderYear
AND B.YearFlag = 'NextYear'
)
SELECT
X.PersonID, X.Name, D.Phone, D.Email,
A.PreviousYearOrderCount,
A.PreviousYearOrderValue,
A.PreviousYearOrderPoint,
B.CurrentYearOrderCount,
B.CurrentYearOrderValue,
B.CurrentYearOrderPoint,
C.NextYearOrderCount,
C.NextYearOrderValue,
C.NextYearOrderPoint
FROM
Person X
LEFT JOIN
PreviousYear A ON X.PersonID = A.PersonID
LEFT JOIN
CurrentYear B ON X.PersonID = B.PersonID
LEFT JOIN
NextYear C ON X.PersonID = C.PersonID
LEFT JOIN
ContactTable D ON X.PersonID = D.PersonID
在这一点上,我很奇怪,并且对此互动感到困惑。 任何指针或帮助,将不胜感激。
答案 0 :(得分:0)
尝试用临时表替换公用表表达式。通常,使用多个ctes会使优化器感到很困惑。
您甚至可能会丢失大部分代码,例如:
;
SELECT
A.PersonID, A.Name, A.Phone, A.Email,
[PreviousYearOrderCount] = SUM( CASE WHEN B.YearFlag = 'PreviousYear' THEN A.OrderCount ELSE NULL END ),
[PreviousYearOrderValue] = SUM( CASE WHEN B.YearFlag = 'PreviousYear' THEN A.OrderValue ELSE NULL END ),
[PreviousYearOrderPoint] = SUM( CASE WHEN B.YearFlag = 'PreviousYear' THEN A.OrderPoint ELSE NULL END ),
[CurrentYearOrderCount] = SUM( CASE WHEN B.YearFlag = 'CurrentYear' THEN A.OrderCount ELSE NULL END ),
[CurrentYearOrderCount] = SUM( CASE WHEN B.YearFlag = 'CurrentYear' THEN A.OrderValue ELSE NULL END ),
[CurrentYearOrderCount] = SUM( CASE WHEN B.YearFlag = 'CurrentYear' THEN A.OrderPoint ELSE NULL END ),
[NextYearOrderCount] = SUM( CASE WHEN B.YearFlag = 'NextYear' THEN A.OrderCount ELSE NULL END ),
[NextYearOrderCount] = SUM( CASE WHEN B.YearFlag = 'NextYear' THEN A.OrderValue ELSE NULL END ),
[NextYearOrderCount] = SUM( CASE WHEN B.YearFlag = 'NextYear' THEN A.OrderPoint ELSE NULL END )
FROM
PersonTable A
JOIN
YearMapping B ON A.OrderYear = B.OrderYear
GROUP BY A.PersonID, A.Name, A.Phone, A.Email