Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Microsoft SQL Server |
![]() ![]() |
essbase.ru Member Откуда: http://essbase.ru/about Сообщений: 1407 |
Всем привет. Есть желание сделать механизм партиционирования запроса через unit all например создаю view create view tbla_all_v as select 1 a, aa.* from tbl1 aa union all select 2 a, aa.* from tbl2 aa и хочу что бы при запросе select * from tbl_all_v where a=1 sql не заходил во второй под-запрос. ( вместо tbl использую табличные функции ) Есть ли что от из хинтов , что подскажет оптимизатору "правильный" путь ? ЕР |
23 мар 15, 12:55 [17418886] Ответить | Цитировать Сообщить модератору |
Minamoto Member Откуда: Москва Сообщений: 1162 |
essbase.ru, вот тут почитайте: https://www.simple-talk.com/sql/sql-tools/sql-server-partitioning-without-enterprise-edition/ |
23 мар 15, 12:57 [17418899] Ответить | Цитировать Сообщить модератору |
Glory Member Откуда: Сообщений: 104760 |
есть целый раздел хелпа, который так и называется partitioning. А кнопки "правильный путь" опять нет. |
||
23 мар 15, 12:57 [17418901] Ответить | Цитировать Сообщить модератору |
essbase.ru Member Откуда: http://essbase.ru/about Сообщений: 1407 |
|
||
23 мар 15, 13:10 [17419031] Ответить | Цитировать Сообщить модератору |
Glory Member Откуда: Сообщений: 104760 |
https://technet.microsoft.com/en-us/library/ms188232(v=sql.105).aspx |
||||
23 мар 15, 13:15 [17419086] Ответить | Цитировать Сообщить модератору |
Владислав Колосов Member Откуда: Сообщений: 8309 |
Откройте справку CREATE VIEW (Transact-SQL) и найдите раздел Секционированные представления |
23 мар 15, 13:15 [17419087] Ответить | Цитировать Сообщить модератору |
iap Member Откуда: Москва Сообщений: 47045 |
Должны быть таблицы со специально построенным СHECK констрейнтом |
||||
23 мар 15, 13:16 [17419090] Ответить | Цитировать Сообщить модератору |
essbase.ru Member Откуда: http://essbase.ru/about Сообщений: 1407 |
inner join с такими таблицами может дать "подсказку" оптимизатору ? |
||
23 мар 15, 13:33 [17419270] Ответить | Цитировать Сообщить модератору |
invm Member Откуда: Москва Сообщений: 9633 |
|
|||
23 мар 15, 13:47 [17419374] Ответить | Цитировать Сообщить модератору |
iap Member Откуда: Москва Сообщений: 47045 |
Не может, а даёт. Вам же дали ссылки на "секционированные представления"? |
||||
23 мар 15, 13:53 [17419410] Ответить | Цитировать Сообщить модератору |
essbase.ru Member Откуда: http://essbase.ru/about Сообщений: 1407 |
- спасибо за пример ) один вопрос не понятно выражение a(p) в (select 2) a(p) - как мне его трактовать для себя ? |
||
23 мар 15, 13:53 [17419413] Ответить | Цитировать Сообщить модератору |
essbase.ru Member Откуда: http://essbase.ru/about Сообщений: 1407 |
|
||||
23 мар 15, 13:54 [17419418] Ответить | Цитировать Сообщить модератору |
SomewhereSomehow Member Откуда: Moscow Сообщений: 2480 Блог |
essbase.ru, Зависит от того какого типа функции у вас, если это табличные inline, то оптимизатор сможет упростить такой запрос без всяких хинтов, при том условии, что вы написали (т.е. без параметризации или каких-то сложных выражений). Если же у вас multystatement табличная функция, то оптимизатор не сможет упростить ничего, т.к. для него это будет все равно, что работа с табличной переменной, о содержимой которой он не догадывается и не может упрощать, чтобы не нарушить смысл запроса.
ИМХО, я конечно не знаю вашей задачи, но такие вопросы навевают мысль о том, что, возможно, вы выбрали не самый удачный путь ее реализации. Учитывая предыдущие вопросы и ваш оракловый опыт, может быть имеет смысл огласить задачу целиком, возможно подскажут более удачный путь/архитектуру решения. Удачи. |
|
23 мар 15, 13:59 [17419459] Ответить | Цитировать Сообщить модератору |
SomewhereSomehow Member Откуда: Moscow Сообщений: 2480 Блог |
Уточню. В первом случае (Inline), речь про доступ именно к таблицам внутри функций - доступ только к одной таблице, во втором (multistatement) речь про доступ ко временным таблицам, в которые помещается результат функций - доступ к обеим таблицам - оптимизатор это не упростит. Но код наполняющий таблицу для второго вызова (a=2), не выполнится. Может это то что вы хотите (в реальности, в сложных выражениях, упрощения может и не произойти, так что проверяйте планы в любом случае). Но повторюсь, имхо, куда-то не туда вы копаете. |
||
23 мар 15, 14:19 [17419622] Ответить | Цитировать Сообщить модератору |
essbase.ru Member Откуда: http://essbase.ru/about Сообщений: 1407 |
это просто от того что я sql использую как калькулятор. поэтому мои задачки и кажутся извратом для true-native sql developer ) Всем спасибо за идеи. буду проверять. |
||
23 мар 15, 14:24 [17419661] Ответить | Цитировать Сообщить модератору |
invm Member Откуда: Москва Сообщений: 9633 |
create function dbo.fn3 ( @p int, @v varchar(10) ) returns table as return ( select 1 as p, fn1.id, fn1.v from dbo.fn1(@v) fn1 where @p = 1 union all select 2 as p, fn2.id, fn2.v from dbo.fn2(@v) fn2 where @p = 2 ); go Как уже писал SomewhereSomehow, в случае multi-statement TVF, в плане будут присутствовать обе функции. Результат какой из них реально читается видно и в плане и в статистике IO. А еще можно посмотреть для каких из них этот самый результат формируется:
|
|||
23 мар 15, 15:13 [17420038] Ответить | Цитировать Сообщить модератору |
essbase.ru Member Откуда: http://essbase.ru/about Сообщений: 1407 |
что бы поставить точку в вопросе. в моих выкрутасах ничего не подошло - - сделал воркараунд через генерации имени запрпашиваемой таблицы ЕР |
30 мар 15, 18:17 [17451400] Ответить | Цитировать Сообщить модератору |
Все форумы / Microsoft SQL Server | ![]() |