Использование UNION или UNION ALL в двух операторах select делает их невероятно медленными - PullRequest
5 голосов
/ 23 марта 2011

У меня есть два запроса, давайте назовем их Query A и Query B.

Оба этих запроса выполняются менее чем за секунду для сценария, который я тестирую, и Query A возвращает 1 результат, а Query B возвращает0 результатов.

Если я объединю (или объединю все) эти два запроса, для возврата (ожидаемого) результата 1 потребуется более минуты.

Оба запроса выбирают одинаковые столбцы из одного и того же столбца.столы.Я мог бы потенциально переписать все это без объединения, имея весьма условное условие where, но я пытался уйти от этого.

Есть идеи?Я не уверен, сколько точных запросов и схем мне удастся получить с помощью совместного использования, но я рад предоставить то, что могу.

Это на MSSQL 2008, если это важно для чьего-либо ответа.

Ответы [ 3 ]

1 голос
/ 23 марта 2011

Отдельные предложения в UNION, которые очень похожи и в одних и тех же таблицах, могут быть объединены в один запрос оптимизатором. Это видно по отсутствию оператора UNION в плане запроса. Я видел подобные вещи раньше, но редко

Что вы можете сделать, это SELECT.. INTO #temp... для первого запроса, за которым следует INSERT #temp... для второго

Теперь, где я это прочитал ...

1 голос
/ 23 марта 2011

Я бы попытался просмотреть планы выполнения в Management Studio для отдельных запросов, а затем сравнить их с планом выполнения для запроса, содержащего UNION.

Если бы существовала такая резкая разница во времени выполнения, я бы предположил, что с планом выполнения запроса UNION что-то не так. Определение того, что отличается, поможет вам (и, возможно, нам) в правильном направлении понять причину проблемы.

0 голосов
/ 23 марта 2011

Они оба делают сканирование таблицы? Похоже, он превышает емкость кеша, а вы кешируете на диск.

Даже если они из одной таблицы, записи, вероятно, будут блокироваться независимо.

...