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

Написал процедуру, которая возвращает табличные данные. то-есть в процедуре есть
Select * from ***
. Хочу этот результат использовать в другом запросе/процедуре. Так вот если написать просто
exec myproc
, то выполняется 25сек, а если создать временную таблицу и туда вставить полученные значения, то выполнятся 1 мин 25 сек, то-есть в 5 раз дольше.
Казалось - классно, можно написать процедуру возвращающую таблицу и потом использовать ее где необходимо. Но время выполнения не радует. Быстрее будет включить код процедуры, которую я хотел вызвать, в код процедуры из которой я хотел ее вызвать. Подскажите, есть варианты как ускорить процесс без дублирования кода?
27 ноя 14, 14:36    [16913859]     Ответить | Цитировать Сообщить модератору
 Re: Как эффективно использовать хр. процедуру, возвращающую табличные данные?  [new]
iap
Member

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

табличная инлайн функция!
27 ноя 14, 14:42    [16913916]     Ответить | Цитировать Сообщить модератору
 Re: Как эффективно использовать хр. процедуру, возвращающую табличные данные?  [new]
user7777
Guest
iap
user7777,

табличная инлайн функция!


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

Откуда:
Сообщений: 104751
user7777
т.к. в процедуре используются иструкции недоступные в функции

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

Переделайте в доступные


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

Откуда:
Сообщений: 104751
user7777
в процедуре создается временная таблица которая используется далее в процедуре не один раз. Если переделать - будет медленно.

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

Вы не слышали про табличные переменные, которые можно использовать в функциях ?


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

Откуда: Саранск
Сообщений: 600
А индексы в табличной переменной пробовали?
27 ноя 14, 15:50    [16914501]     Ответить | Цитировать Сообщить модератору
 Re: Как эффективно использовать хр. процедуру, возвращающую табличные данные?  [new]
user7777
Guest
Alex_Toms
А индексы в табличной переменной пробовали?


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

Откуда: Москва
Сообщений: 47142
user7777
Alex_Toms
А индексы в табличной переменной пробовали?


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

Откуда: Саранск
Сообщений: 600
1. Поиск в интернете "mssql табличные переменные индексы" даёт массу ссылок, в том числе и на наш форум.
2. Где использовал, там скорость возрастала. Есть ограничение, индексы могу быть ТОЛЬКО уникальные, хотя их можно приспособить и на поля с не уникальными значениями.

Пример: поле PARENT уникально, а R_COMP не уникально, создаю дополнительное поле с уникальными значениями.
DECLARE @P TABLE (ID INT IDENTITY (1,1), R_COMP [int], [PARENT] [int], [CHILD] [int], VOL DECIMAL(7,2), unique(R_COMP,ID), unique(PARENT))
27 ноя 14, 16:13    [16914693]     Ответить | Цитировать Сообщить модератору
 Re: Как эффективно использовать хр. процедуру, возвращающую табличные данные?  [new]
user7777
Guest
iap
user7777
пропущено...


нет, )) вот это уже интересно,.. что реально ускоряет?... ссылку дадите??
Лучше покажите процедуру.
Сдаётся мне, не нужна там временная таблица.



приведу пример, возможно и не нужна



Insert into #tblHeader
SELECT * FROM myFunc


select * from
#tblHeader left join
( 
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 q 
On #tblHeader.id2 = q.id2 
27 ноя 14, 16:17    [16914719]     Ответить | Цитировать Сообщить модератору
 Re: Как эффективно использовать хр. процедуру, возвращающую табличные данные?  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
Alex_Toms
1. Поиск в интернете "mssql табличные переменные индексы" даёт массу ссылок, в том числе и на наш форум.
2. Где использовал, там скорость возрастала. Есть ограничение, индексы могу быть ТОЛЬКО уникальные, хотя их можно приспособить и на поля с не уникальными значениями.

Пример: поле PARENT уникально, а R_COMP не уникально, создаю дополнительное поле с уникальными значениями.
DECLARE @P TABLE (ID INT IDENTITY (1,1), R_COMP [int], [PARENT] [int], [CHILD] [int], VOL DECIMAL(7,2), unique(R_COMP,ID), unique(PARENT))
Это зачем так? Почему не просто UNIQUE(R_COMP,PARENT)?
27 ноя 14, 16:18    [16914726]     Ответить | Цитировать Сообщить модератору
 Re: Как эффективно использовать хр. процедуру, возвращающую табличные данные?  [new]
user7777
Guest
тоесть вот так:



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, 16:21    [16914740]     Ответить | Цитировать Сообщить модератору
 Re: Как эффективно использовать хр. процедуру, возвращающую табличные данные?  [new]
user7777
Guest
Alex_Toms
1. Поиск в интернете "mssql табличные переменные индексы" даёт массу ссылок, в том числе и на наш форум.
2. Где использовал, там скорость возрастала. Есть ограничение, индексы могу быть ТОЛЬКО уникальные, хотя их можно приспособить и на поля с не уникальными значениями.

Пример: поле PARENT уникально, а R_COMP не уникально, создаю дополнительное поле с уникальными значениями.
DECLARE @P TABLE (ID INT IDENTITY (1,1), R_COMP [int], [PARENT] [int], [CHILD] [int], VOL DECIMAL(7,2), unique(R_COMP,ID), unique(PARENT))



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

Откуда: Москва
Сообщений: 47142
user7777
Alex_Toms
1. Поиск в интернете "mssql табличные переменные индексы" даёт массу ссылок, в том числе и на наш форум.
2. Где использовал, там скорость возрастала. Есть ограничение, индексы могу быть ТОЛЬКО уникальные, хотя их можно приспособить и на поля с не уникальными значениями.

Пример: поле PARENT уникально, а R_COMP не уникально, создаю дополнительное поле с уникальными значениями.
DECLARE @P TABLE (ID INT IDENTITY (1,1), R_COMP [int], [PARENT] [int], [CHILD] [int], VOL DECIMAL(7,2), unique(R_COMP,ID), unique(PARENT))



спасибо попробую
Лучше попробуйте написать нормальный SELECT (один!!!).
Кстати, что такое myFunc?
Если функция, то почему без скобок?
27 ноя 14, 16:24    [16914766]     Ответить | Цитировать Сообщить модератору
 Re: Как эффективно использовать хр. процедуру, возвращающую табличные данные?  [new]
Alex_Toms
Member

Откуда: Саранск
Сообщений: 600
Хотел дать один пример для двух ситуаций одной строкой, поправлюсь, даю две строки.

поле PARENT уникально.
DECLARE @P TABLE (R_COMP [int], [PARENT] [int], [CHILD] [int], VOL DECIMAL(7,2), unique(PARENT))

поле R_COMP не уникально, создаю дополнительное поле ID с уникальными значениями.
DECLARE @P TABLE (ID INT IDENTITY (1,1), R_COMP [int], [PARENT] [int], [CHILD] [int], VOL DECIMAL(7,2), unique(R_COMP,ID))
27 ноя 14, 16:29    [16914788]     Ответить | Цитировать Сообщить модератору
 Re: Как эффективно использовать хр. процедуру, возвращающую табличные данные?  [new]
user7777
Guest
iap
Кстати, что такое myFunc?
Если функция, то почему без скобок?


myFunc -функция (спешил скобки не добавил,)

iap
Лучше попробуйте написать нормальный SELECT (один!!!).
- пока не знаю как
27 ноя 14, 16:30    [16914789]     Ответить | Цитировать Сообщить модератору
 Re: Как эффективно использовать хр. процедуру, возвращающую табличные данные?  [new]
user7777
Guest
user7777

iap
Лучше попробуйте написать нормальный SELECT (один!!!).
- пока не знаю как

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

Откуда: Саранск
Сообщений: 600
Даже если будет найден вариант с одним селектом тормоза всё же останутся.
Тормоза от inner join с табличной переменной.
Попробуйте вариант с индексами, интересно на сколько изменится скорость?
27 ноя 14, 16:41    [16914848]     Ответить | Цитировать Сообщить модератору
 Re: Как эффективно использовать хр. процедуру, возвращающую табличные данные?  [new]
Glory
Member

Откуда:
Сообщений: 104751
user7777
приведу пример, возможно и не нужна



Insert into #tblHeader
SELECT * FROM myFunc


select * from
#tblHeader left join
( 
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 q 
On #tblHeader.id2 = q.id2 

Ваш запрос - очень странный
#tblHeader по сути соединяется сама с собой зачем то
27 ноя 14, 16:55    [16914951]     Ответить | Цитировать Сообщить модератору
 Re: Как эффективно использовать хр. процедуру, возвращающую табличные данные?  [new]
Alex_Toms
Member

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

Откуда: Москва
Сообщений: 47142
Alex_Toms
Даже если будет найден вариант с одним селектом тормоза всё же останутся.
Тормоза от inner join с табличной переменной.
Попробуйте вариант с индексами, интересно на сколько изменится скорость?
Какой переменной??!
Зачем переменная??!

Один SELECT вон он - уже есть!
Его просто надо написать по-человечесчки!

Кстати, интересно, а зачем MyFunc()? Какого она типа?
Вызов этой функции в принципе может тормозить по-страшному.
27 ноя 14, 16:58    [16914974]     Ответить | Цитировать Сообщить модератору
 Re: Как эффективно использовать хр. процедуру, возвращающую табличные данные?  [new]
Alex_Toms
Member

Откуда: Саранск
Сообщений: 600
iap
Какой переменной??!
Зачем переменная??!

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

Откуда: Москва
Сообщений: 47142
Alex_Toms
iap
Какой переменной??!
Зачем переменная??!

Мой ответ для варианта с табличной переменной вместо временной таблицы...
А почему не для сотни табличных переменных?
27 ноя 14, 17:04    [16915014]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2 3   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить