Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: Ctrl  назад   1 [2] 3   вперед  Ctrl      все
 Re: Как эффективно использовать хр. процедуру, возвращающую табличные данные?  [new]
Alex_Toms
Member

Откуда: Саранск
Сообщений: 600
iap
А почему не для сотни табличных переменных?

У него в запросе одна временная таблица #tblHeader,
посему достаточно одной переменной, я бы и название оставил @tblHeader...

DECLARE @tblHeader (...)

Insert into @tblHeader
SELECT * FROM myFunc
...............
27 ноя 14, 17:09    [16915043]     Ответить | Цитировать Сообщить модератору
 Re: Как эффективно использовать хр. процедуру, возвращающую табличные данные?  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
Alex_Toms
У него в запросе одна временная таблица #tblHeader
А должно быть ни одной!
Почему нельзя написать SELECT сразу из MyFunc(), я вот не пойму никак!
27 ноя 14, 17:12    [16915064]     Ответить | Цитировать Сообщить модератору
 Re: Как эффективно использовать хр. процедуру, возвращающую табличные данные?  [new]
Shakill
Member

Откуда: мск
Сообщений: 1887
iap
Alex_Toms
У него в запросе одна временная таблица #tblHeader
А должно быть ни одной!
Почему нельзя написать SELECT сразу из MyFunc(), я вот не пойму никак!

можно предположить, что MyFunc адски тяжелая и человек не хочет обращаться к ней два раза
27 ноя 14, 17:15    [16915090]     Ответить | Цитировать Сообщить модератору
 Re: Как эффективно использовать хр. процедуру, возвращающую табличные данные?  [new]
user7777
Guest
iap
Alex_Toms
У него в запросе одна временная таблица #tblHeader
А должно быть ни одной!
Почему нельзя написать SELECT сразу из MyFunc(), я вот не пойму никак!


потому что результат этого селекта, используется три раза в запросе ниже, и как переделать этот запрос я не знаю
27 ноя 14, 17:17    [16915099]     Ответить | Цитировать Сообщить модератору
 Re: Как эффективно использовать хр. процедуру, возвращающую табличные данные?  [new]
user7777
Guest
Shakill
iap
пропущено...
А должно быть ни одной!
Почему нельзя написать SELECT сразу из MyFunc(), я вот не пойму никак!

можно предположить, что MyFunc адски тяжелая и человек не хочет обращаться к ней два раза


все верно)
27 ноя 14, 17:17    [16915105]     Ответить | Цитировать Сообщить модератору
 Re: Как эффективно использовать хр. процедуру, возвращающую табличные данные?  [new]
Glory
Member

Откуда:
Сообщений: 104751
user7777
все верно)

Верно что ?
Что написана тяжелая табличная функция ?
Которую теперь надо приткнуть в чудовищно написанный запрос ?
27 ноя 14, 17:19    [16915121]     Ответить | Цитировать Сообщить модератору
 Re: Как эффективно использовать хр. процедуру, возвращающую табличные данные?  [new]
Alex_Toms
Member

Откуда: Саранск
Сообщений: 600
При замене #tblHeader на SELECT из MyFunc(), сколько раз выполнится MyFunc()?
Если MyFunc() не тормозная, то ваш вариант подойдёт, но как мне кажется тормоза всё же есть.
27 ноя 14, 17:20    [16915135]     Ответить | Цитировать Сообщить модератору
 Re: Как эффективно использовать хр. процедуру, возвращающую табличные данные?  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
user7777
iap
пропущено...
А должно быть ни одной!
Почему нельзя написать SELECT сразу из MyFunc(), я вот не пойму никак!


потому что результат этого селекта, используется три раза в запросе ниже, и как переделать этот запрос я не знаю
А почему три раза, а не один?
27 ноя 14, 17:21    [16915140]     Ответить | Цитировать Сообщить модератору
 Re: Как эффективно использовать хр. процедуру, возвращающую табличные данные?  [new]
Alex_Toms
Member

Откуда: Саранск
Сообщений: 600
Ну вот, пока отвечал, мысль уже дали...
27 ноя 14, 17:22    [16915148]     Ответить | Цитировать Сообщить модератору
 Re: Как эффективно использовать хр. процедуру, возвращающую табличные данные?  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
iap
user7777
пропущено...


потому что результат этого селекта, используется три раза в запросе ниже, и как переделать этот запрос я не знаю
А почему три раза, а не один?
OUTER APPLY Ваш сервер умеет делать?
27 ноя 14, 17:23    [16915156]     Ответить | Цитировать Сообщить модератору
 Re: Как эффективно использовать хр. процедуру, возвращающую табличные данные?  [new]
user7777
Guest
iap
iap
пропущено...
А почему три раза, а не один?
OUTER APPLY Ваш сервер умеет делать?


OUTER APPLY -надо погуглить
27 ноя 14, 17:34    [16915244]     Ответить | Цитировать Сообщить модератору
 Re: Как эффективно использовать хр. процедуру, возвращающую табличные данные?  [new]
Wlr-l
Member

Откуда:
Сообщений: 599
user7777
тоесть вот так:



Insert into #tblHeader
SELECT * FROM myFunc


select * from
#tblHeader left join
(
SELECT id, field, id2
FROM 
(SELECT tblDetail1.id, tblDetail1.field, #tblHeader.id2
FROM
#tblHeader inner join tblDetail1 on #tblHeader.id = tblDetail1.id
Group by tblDetail1.id, tblDetail1.field, #tblHeader.id2
 
union all
SELECT tblDetail2.id, tblDetail2.field, #tblHeader.id2
FROM
#tblHeader inner join tblDetail2 on #tblHeader.id =tblDetail2.id
Group by tblDetail2.id, tblDetail2.field, #tblHeader.id2
) AS q1
GRUP by  id, field, id2) as q2
On #tblHeader.id2 = q2.id2 


Во внутренних и внешнем запросах используется группировка без агрегирующей функции. Это удаление дубликатов?
27 ноя 14, 17:48    [16915339]     Ответить | Цитировать Сообщить модератору
 Re: Как эффективно использовать хр. процедуру, возвращающую табличные данные?  [new]
user7777
Guest
Wlr-l
user7777
тоесть вот так:



Insert into #tblHeader
SELECT * FROM myFunc


select * 
from
#tblHeader left join
(
SELECT id, field, id2
FROM 
(SELECT tblDetail1.id, tblDetail1.field, #tblHeader.id2
FROM
#tblHeader inner join tblDetail1 on #tblHeader.id = tblDetail1.id
Group by tblDetail1.id, tblDetail1.field, #tblHeader.id2
 
union all
SELECT tblDetail2.id, tblDetail2.field, #tblHeader.id2
FROM
#tblHeader inner join tblDetail2 on #tblHeader.id =tblDetail2.id
Group by tblDetail2.id, tblDetail2.field, #tblHeader.id2
) AS q1
GRUP by  id, field, id2) as q2
On #tblHeader.id2 = q2.id2 


Во внутренних и внешнем запросах используется группировка без агрегирующей функции. Это удаление дубликатов?


прошу прощения, неправильно написал пример, сори

вот как-то так

Insert into #tblHeader
SELECT * FROM myFunc


select #tblHeader.fielNew1, #tblHeader.fielNew2,  q2.id, q2.id2,  q2.field, q2.qnt1,  q2.qnt2,  (Case When ISNUll(q2.id2,0)=0 then 0 else q2.qnt2 - q2.qnt1) as qnt3
from

#tblHeader left join
(
SELECT id, field, id2, Sum(qnt1) as qnt1,  Sum(qnt2) as qnt2
FROM 

(
SELECT tblDetail1.id, #tblHeader.id2, tblDetail1.field,  tblDetail1.qnt as qnt1, 0 as qnt2
FROM
#tblHeader inner join tblDetail1 on #tblHeader.id = tblDetail1.id 

union all

SELECT #tblHeader.id, tblDetail2.id2,  tblDetail2.field, 0 as qnt1, tblDetail2.qnt as qnt2
FROM
#tblHeader inner join tblDetail2 on #tblHeader.2id =tblDetail2.2id
) AS q1

GROUP BY  id,  id2, field
) as q2

On #tblHeader.id = q2.id
27 ноя 14, 18:22    [16915537]     Ответить | Цитировать Сообщить модератору
 Re: Как эффективно использовать хр. процедуру, возвращающую табличные данные?  [new]
Glory
Member

Откуда:
Сообщений: 104751
user7777
прошу прощения, неправильно написал пример, сори

вот как-то так

Вы что реально не видите, что вы делаете
#tblHeader left join ... #tblHeader inner ... left join ... #tblHeader inner
27 ноя 14, 21:52    [16916280]     Ответить | Цитировать Сообщить модератору
 Re: Как эффективно использовать хр. процедуру, возвращающую табличные данные?  [new]
Mind
Member

Откуда: Лучший город на Земле
Сообщений: 2322
Alex_Toms
1. Поиск в интернете "mssql табличные переменные индексы" даёт массу ссылок, в том числе и на наш форум.
2. Где использовал, там скорость возрастала. Есть ограничение, индексы могу быть ТОЛЬКО уникальные, хотя их можно приспособить и на поля с не уникальными значениями.
Основная проблема табличных переменных, это не индексы, а отсутствие статистик.
27 ноя 14, 22:31    [16916405]     Ответить | Цитировать Сообщить модератору
 Re: Как эффективно использовать хр. процедуру, возвращающую табличные данные?  [new]
LexusR
Member

Откуда: Novosibirsk
Сообщений: 1887
чото мне кажется всё это сворачивается в
select fielNew1, fielNew2id, id2, field
,SUM(isnull(d1.qnt,0)) as qnt1
,SUM(isnull(d1.qnt,0)) as qnt2
,SUM(case when id2 is null then 0 else isnull(d2.qnt,0) - isnull(d1.qnt,0) end as qnt3
from #tblHeader h
left join tblDetail1 d1 on h.id  = d1.id 
left join tblDetail2 d2 on h.id2 = d2.id 
group by fielNew1, fielNew2, id, id2, field
28 ноя 14, 07:51    [16916976]     Ответить | Цитировать Сообщить модератору
 Re: Как эффективно использовать хр. процедуру, возвращающую табличные данные?  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
LexusR
чото мне кажется всё это сворачивается в
select fielNew1, fielNew2id, id2, field
,SUM(isnull(d1.qnt,0)) as qnt1
,SUM(isnull(d1.qnt,0)) as qnt2
,SUM(case when id2 is null then 0 else isnull(d2.qnt,0) - isnull(d1.qnt,0) end as qnt3
from #tblHeader h
left join tblDetail1 d1 on h.id  = d1.id 
left join tblDetail2 d2 on h.id2 = d2.id 
group by fielNew1, fielNew2, id, id2, field
Нет. Потому что два LEFT JOINа. Сумма задвоится (затроится и т.п.).
Но можно аггрегировать в подзапросах, а потом LEFT JOIN (OUTER APPLY)
Кстати, у Вас получилось одно и то же выражение для qnt1 и qnt2
28 ноя 14, 09:09    [16917153]     Ответить | Цитировать Сообщить модератору
 Re: Как эффективно использовать хр. процедуру, возвращающую табличные данные?  [new]
user7777
Guest
LexusR
чото мне кажется всё это сворачивается в
select fielNew1, fielNew2id, id2, field
,SUM(isnull(d1.qnt,0)) as qnt1
,SUM(isnull(d1.qnt,0)) as qnt2
,SUM(case when id2 is null then 0 else isnull(d2.qnt,0) - isnull(d1.qnt,0) end as qnt3
from #tblHeader h
left join tblDetail1 d1 on h.id  = d1.id 
left join tblDetail2 d2 on h.id2 = d2.id 
group by fielNew1, fielNew2, id, id2, field


нет, потому что еще связь по полю field, при этом нужно выводить еще те записи из tblDetail2, в которых есть совпадение по полю id2 с #tblHeader, но нет по полю field с tblDetail1......
я уже нашел у себя ошибку в логике , буду переписывать с full join....
28 ноя 14, 10:30    [16917555]     Ответить | Цитировать Сообщить модератору
 Re: Как эффективно использовать хр. процедуру, возвращающую табличные данные?  [new]
user7777
Guest
Glory
user7777
прошу прощения, неправильно написал пример, сори

вот как-то так

Вы что реально не видите, что вы делаете
#tblHeader left join ... #tblHeader inner ... left join ... #tblHeader inner



вы реально ничего реального не предложили
28 ноя 14, 10:33    [16917578]     Ответить | Цитировать Сообщить модератору
 Re: Как эффективно использовать хр. процедуру, возвращающую табличные данные?  [new]
Glory
Member

Откуда:
Сообщений: 104751
user7777
вы реально ничего реального не предложили

Нравяться мне такие наезды.
Я написал хреновый код. Я вам его не покажу (во всяком случае целиком), про решаемую задачу тоже ничего не расскажу. А вы должны(!) предложить мне реальные(!) способы решения.
28 ноя 14, 10:35    [16917599]     Ответить | Цитировать Сообщить модератору
 Re: Как эффективно использовать хр. процедуру, возвращающую табличные данные?  [new]
user7777
Guest
Glory
user7777
вы реально ничего реального не предложили

Нравяться мне такие наезды.
Я написал хреновый код. Я вам его не покажу (во всяком случае целиком), про решаемую задачу тоже ничего не расскажу. А вы должны(!) предложить мне реальные(!) способы решения.



я не говорю что вы что-то должны, я говорю что вы пишите бесполезные комменты
28 ноя 14, 10:53    [16917703]     Ответить | Цитировать Сообщить модератору
 Re: Как эффективно использовать хр. процедуру, возвращающую табличные данные?  [new]
user7777
Guest
user7777
Glory
пропущено...

Нравяться мне такие наезды.
Я написал хреновый код. Я вам его не покажу (во всяком случае целиком), про решаемую задачу тоже ничего не расскажу. А вы должны(!) предложить мне реальные(!) способы решения.



я не говорю что вы что-то должны, я говорю что вы пишите бесполезные комменты


и для того чтоб утверждать что метод хреновый, надо показать лучший
28 ноя 14, 10:55    [16917712]     Ответить | Цитировать Сообщить модератору
 Re: Как эффективно использовать хр. процедуру, возвращающую табличные данные?  [new]
Glory
Member

Откуда:
Сообщений: 104751
user7777
я не говорю что вы что-то должны, я говорю что вы пишите бесполезные комменты

Мои комментарии соответствуют уровню ваших вопросов.
Из двух плохих запросов нельзя получить один хороший.
28 ноя 14, 10:55    [16917715]     Ответить | Цитировать Сообщить модератору
 Re: Как эффективно использовать хр. процедуру, возвращающую табличные данные?  [new]
user7777
Guest
Glory
user7777
я не говорю что вы что-то должны, я говорю что вы пишите бесполезные комменты

Мои комментарии соответствуют уровню ваших вопросов.
Из двух плохих запросов нельзя получить один хороший.


Ваши комментарии соответствуют уровню " мне нечего делать .... надо кого-то потроллить"
28 ноя 14, 11:02    [16917765]     Ответить | Цитировать Сообщить модератору
 Re: Как эффективно использовать хр. процедуру, возвращающую табличные данные?  [new]
Glory
Member

Откуда:
Сообщений: 104751
user7777
Ваши комментарии соответствуют уровню " мне нечего делать .... надо кого-то потроллить"

Вы слишком большого мнения о себе и вашей роли в этом мире.
Вы уже сутки пытаетесь из дерьма сделать конфетку с помощью переписывания одной обертки на другую.
28 ноя 14, 11:06    [16917795]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 [2] 3   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить