SQL Server查询上的奇怪交互

时间:2019-07-18 04:58:05

标签: sql sql-server database

此查询执行后无法执行,只是永久加载。

这里或多或少是我的查询概述,而在我的真实查询中只是更多列。

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

在这一点上,我很奇怪,并且对此互动感到困惑。 任何指针或帮助,将不胜感激。

1 个答案:

答案 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