Как SQL Server будет выполнять это предложение WITH - PullRequest
0 голосов
/ 05 ноября 2019

У меня следующий запрос. Здесь «B» дает мне неповторяющиеся MessageIds, и я использую их в подзапросе с A, B внутренне использует A.

Так что, когда я вызову SELECT в последней части, он выполнит A снова или выполнитиспользовать данные, уже выбранные во время вызова B?

WITH A as (

    SELECT z.Name, ze.Inside, ze.MessageId, ze.DateTime
    FROM ZoneStateEntries ze
    INNER JOIN Zone z
    ON ze.ZoneId = z.ZoneId
    WHERE ze.ObjectId = 1324
    AND (Inside = 1 OR Inside = 0)
    AND ze.DateTime BETWEEN '2018-10-22 00:00:00' AND '2019-11-05 00:00:00'

),
B as (

    SELECT a.MessageId
    FROM A a
    INNER JOIN A b
    on a.MessageId = b.MessageId 
    GROUP BY a.MessageId
    HAVING COUNT(a.MessageId) = 1

)

SELECT *
FROM A
WHERE MessageId IN (
    SELECT *
    FROM B
)
AND a.Inside = 1
ORDER BY DateTime DESC

Данные здесь огромны, и мы не можем позволить выполнить запрос A несколько раз. Можем ли мы оптимизировать его дальше?

1 Ответ

0 голосов
/ 05 ноября 2019

A a INNER JOIN A b выглядит ненужным. Вы можете использовать COUNT(DISTINCT MessageId) для получения уникальных сообщений.

WITH A as (
    SELECT z.Name, ze.Inside, ze.MessageId, ze.DateTime
    FROM ZoneStateEntries ze
    INNER JOIN Zone z
    ON ze.ZoneId = z.ZoneId
    WHERE ze.ObjectId = 1324
    AND (Inside = 1 OR Inside = 0)
    AND ze.DateTime BETWEEN '2018-10-22 00:00:00' AND '2019-11-05 00:00:00'
)
SELECT *
FROM A
WHERE MessageId IN (
    SELECT MessageId
    FROM A 
    GROUP BY MessageId
    HAVING COUNT(DISTINCT MessageId) = 1
)
AND a.Inside = 1
ORDER BY DateTime DESC
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...