powered by simpleCommunicator - 2.0.39     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / выполнение только одной части UNION
14 сообщений из 14, страница 1 из 1
выполнение только одной части UNION
    #36528766
Фотография Shakill
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
день добрый. есть две таблицы с одинаковой структурой, T1 и T2

пишу вьюху V1

SELECT text
FROM T1
WHERE ddate > DivideDate()

UNION

SELECT text
FROM T2
WHERE ddate <= DivideDate() -- наборы данных не пересекаются

на эту вьюху приходит запрос

SELECT text FROM V1 WHERE ddate = '20100202'

итак:
1) будут выполняться оба селекта из юниона или сервер *догадается* выбрать только нужный?
2) какую литературу посоветуете для понимания того, как mssql разбирает и выполняет запросы?

спасибо
...
Рейтинг: 0 / 0
выполнение только одной части UNION
    #36528782
Фотография Паганель
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shakillна эту вьюху приходит запрос

SELECT text FROM V1 WHERE ddate = '20100202'И не ругается на поле V1.ddate ?
...
Рейтинг: 0 / 0
выполнение только одной части UNION
    #36528793
iap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
http://%5D%5B/url]Специально для таких случаев придуманы секционированные представления
Интерсная статья
...
Рейтинг: 0 / 0
выполнение только одной части UNION
    #36528795
Фотография Shakill
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ПаганельShakillна эту вьюху приходит запрос

SELECT text FROM V1 WHERE ddate = '20100202'И не ругается на поле V1.ddate ?

я не копировал запрос целиком, просто общий принцип показал. конечно же, во вьюхе select text, ddate
...
Рейтинг: 0 / 0
выполнение только одной части UNION
    #36528804
iap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Плохо отформатировал...

Специально для таких случаев придуманы секционированные представления
Интерсная статья
...
Рейтинг: 0 / 0
выполнение только одной части UNION
    #36528811
Фотография Паганель
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И что, сервер в результате должен сделать это
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
SELECT text
FROM T1
WHERE ddate > DivideDate()
AND ddate = '20100202'
UNION

SELECT text
FROM T2
WHERE ddate <= DivideDate() -- наборы данных не пересекаются
AND ddate = '20100202'
?
Что-то я смысл того что в where понять не могу
...
Рейтинг: 0 / 0
выполнение только одной части UNION
    #36528832
Фотография Shakill
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ПаганельИ что, сервер в результате должен сделать это
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
SELECT text
FROM T1
WHERE ddate > DivideDate()
AND ddate = '20100202'
UNION

SELECT text
FROM T2
WHERE ddate <= DivideDate() -- наборы данных не пересекаются
AND ddate = '20100202'
?
Что-то я смысл того что в where понять не могу

в результате (по идее) сервер должен искать данные только в одной таблице, которая подходит по дате, а другой селект, который не будет иметь смысла, остановится уже на этапе анализа where и лишний поиск происходить не будет
...
Рейтинг: 0 / 0
выполнение только одной части UNION
    #36528840
Glory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shakill

в результате (по идее) сервер должен искать данные только в одной таблице, которая подходит по дате, а другой селект, который не будет иметь смысла, остановится уже на этапе анализа where и лишний поиск происходить не будет
А откуда сервер узнает, что значение '20100202' есть только в одной таблице ?
...
Рейтинг: 0 / 0
выполнение только одной части UNION
    #36528858
Фотография Shakill
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GloryА откуда сервер узнает, что значение '20100202' есть только в одной таблице ?

я рассчитываю, что сервер сначала вычислит DivideDate(), разберет WHERE и увидит, что один из селектов может вернуть непустой набор данных, а другой - нет, и затем выполнит только один из них. вот и пытаюсь выяснить, так это или нет
...
Рейтинг: 0 / 0
выполнение только одной части UNION
    #36528863
Glory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ShakillGloryА откуда сервер узнает, что значение '20100202' есть только в одной таблице ?

я рассчитываю, что сервер сначала вычислит DivideDate(), разберет WHERE и увидит, что один из селектов может вернуть непустой набор данных, а другой - нет, и затем выполнит только один из них. вот и пытаюсь выяснить, так это или нет
На этапе составления плана сервер не будет вычислять никакие DivideDate()
...
Рейтинг: 0 / 0
выполнение только одной части UNION
    #36528911
Фотография Shakill
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GloryНа этапе составления плана сервер не будет вычислять никакие DivideDate()

хорошо, попробую другими словами.
допустим, индексов нет
при выполнении запроса

Код: plaintext
1.
2.
3.
SELECT text
FROM ATable
WHERE ddate > DivideDate() AND ddate = '20100202'


каким образом поступит сервер:

а) пройдет по всем строкам таблицы, каждый раз вычисляя DivideDate() и производя сравнение ddate

б) один раз вычислит DivideDate() и пройдет по всем строкам таблицы в поисках удовлетворяющих условию записей

в) один раз вычислит DivideDate(), и если получится больше чем '20100202', то без поиска сразу вернет пустой набор данных, т.к. WHERE не будет иметь смысла

?
...
Рейтинг: 0 / 0
выполнение только одной части UNION
    #36528922
Glory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shakill
каким образом поступит сервер:

а) пройдет по всем строкам таблицы, каждый раз вычисляя DivideDate() и производя сравнение ddate

б) один раз вычислит DivideDate() и пройдет по всем строкам таблицы в поисках удовлетворяющих условию записей

в) один раз вычислит DivideDate(), и если получится больше чем '20100202', то без поиска сразу вернет пустой набор данных, т.к. WHERE не будет иметь смысла

?
Откройте для себя планы выполнения(execution plans)
...
Рейтинг: 0 / 0
выполнение только одной части UNION
    #36528999
Фотография Shakill
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GloryShakill
каким образом поступит сервер:

а) пройдет по всем строкам таблицы, каждый раз вычисляя DivideDate() и производя сравнение ddate

б) один раз вычислит DivideDate() и пройдет по всем строкам таблицы в поисках удовлетворяющих условию записей

в) один раз вычислит DivideDate(), и если получится больше чем '20100202', то без поиска сразу вернет пустой набор данных, т.к. WHERE не будет иметь смысла

?
Откройте для себя планы выполнения(execution plans)

В плане слишком обобщенно, наличие узла Filter не раскрывает подробностей, о которых я спрашивал. Как именно происходит фильтрация?
...
Рейтинг: 0 / 0
выполнение только одной части UNION
    #36529005
Glory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shakill

В плане слишком обобщенно, наличие узла Filter не раскрывает подробностей, о которых я спрашивал. Как именно происходит фильтрация?
В плане - все конкретнее некуда
...
Рейтинг: 0 / 0
14 сообщений из 14, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / выполнение только одной части UNION
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]