powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Как эффективно использовать хр. процедуру, возвращающую табличные данные?
25 сообщений из 57, страница 1 из 3
Как эффективно использовать хр. процедуру, возвращающую табличные данные?
    #38818424
user7777
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день.

Написал процедуру, которая возвращает табличные данные. то-есть в процедуре есть
Код: sql
1.
Select * from ***

. Хочу этот результат использовать в другом запросе/процедуре. Так вот если написать просто
Код: sql
1.
exec myproc

, то выполняется 25сек, а если создать временную таблицу и туда вставить полученные значения, то выполнятся 1 мин 25 сек, то-есть в 5 раз дольше.
Казалось - классно, можно написать процедуру возвращающую таблицу и потом использовать ее где необходимо. Но время выполнения не радует. Быстрее будет включить код процедуры, которую я хотел вызвать, в код процедуры из которой я хотел ее вызвать. Подскажите, есть варианты как ускорить процесс без дублирования кода?
...
Рейтинг: 0 / 0
Как эффективно использовать хр. процедуру, возвращающую табличные данные?
    #38818430
iap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user7777,

табличная инлайн функция!
...
Рейтинг: 0 / 0
Как эффективно использовать хр. процедуру, возвращающую табличные данные?
    #38818432
user7777
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
iapuser7777,

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

неподходит в конкретном примере, т.к. в процедуре используются иструкции недоступные в функции
...
Рейтинг: 0 / 0
Как эффективно использовать хр. процедуру, возвращающую табличные данные?
    #38818436
Glory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user7777т.к. в процедуре используются иструкции недоступные в функции
Переделайте в доступные
...
Рейтинг: 0 / 0
Как эффективно использовать хр. процедуру, возвращающую табличные данные?
    #38818437
user7777
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Gloryuser7777т.к. в процедуре используются иструкции недоступные в функции
Переделайте в доступные

в процедуре создается временная таблица которая используется далее в процедуре не один раз. Если переделать - будет медленно.
...
Рейтинг: 0 / 0
Как эффективно использовать хр. процедуру, возвращающую табличные данные?
    #38818445
Glory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user7777в процедуре создается временная таблица которая используется далее в процедуре не один раз. Если переделать - будет медленно.
Вы не слышали про табличные переменные, которые можно использовать в функциях ?
...
Рейтинг: 0 / 0
Как эффективно использовать хр. процедуру, возвращающую табличные данные?
    #38818448
user7777
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Gloryuser7777в процедуре создается временная таблица которая используется далее в процедуре не один раз. Если переделать - будет медленно.
Вы не слышали про табличные переменные, которые можно использовать в функциях ?

слышал, но также слышал что их лучше не использовать если колл. строк больше сотни.. и действительно, эксперимент с табличной переменной вместо временной таблицы в данном примере , показал что это так.
...
Рейтинг: 0 / 0
Как эффективно использовать хр. процедуру, возвращающую табличные данные?
    #38818509
Alex_Toms
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А индексы в табличной переменной пробовали?
...
Рейтинг: 0 / 0
Как эффективно использовать хр. процедуру, возвращающую табличные данные?
    #38818511
user7777
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Alex_TomsА индексы в табличной переменной пробовали?

нет, )) вот это уже интересно,.. что реально ускоряет?... ссылку дадите??
...
Рейтинг: 0 / 0
Как эффективно использовать хр. процедуру, возвращающую табличные данные?
    #38818517
iap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user7777Alex_TomsА индексы в табличной переменной пробовали?

нет, )) вот это уже интересно,.. что реально ускоряет?... ссылку дадите??Лучше покажите процедуру.
Сдаётся мне, не нужна там временная таблица.
...
Рейтинг: 0 / 0
Как эффективно использовать хр. процедуру, возвращающую табличные данные?
    #38818526
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))
...
Рейтинг: 0 / 0
Как эффективно использовать хр. процедуру, возвращающую табличные данные?
    #38818531
user7777
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
iapuser7777пропущено...


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


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



Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
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 
...
Рейтинг: 0 / 0
Как эффективно использовать хр. процедуру, возвращающую табличные данные?
    #38818533
iap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alex_Toms1. Поиск в интернете "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)?
...
Рейтинг: 0 / 0
Как эффективно использовать хр. процедуру, возвращающую табличные данные?
    #38818534
user7777
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
тоесть вот так:



Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
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 
...
Рейтинг: 0 / 0
Как эффективно использовать хр. процедуру, возвращающую табличные данные?
    #38818536
user7777
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Alex_Toms1. Поиск в интернете "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))


спасибо попробую
...
Рейтинг: 0 / 0
Как эффективно использовать хр. процедуру, возвращающую табличные данные?
    #38818538
iap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user7777Alex_Toms1. Поиск в интернете "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?
Если функция, то почему без скобок?
...
Рейтинг: 0 / 0
Как эффективно использовать хр. процедуру, возвращающую табличные данные?
    #38818544
Alex_Toms
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хотел дать один пример для двух ситуаций одной строкой, поправлюсь, даю две строки.

поле 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))
...
Рейтинг: 0 / 0
Как эффективно использовать хр. процедуру, возвращающую табличные данные?
    #38818545
user7777
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
iapКстати, что такое myFunc?
Если функция, то почему без скобок?

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

iapЛучше попробуйте написать нормальный SELECT (один!!!). - пока не знаю как
...
Рейтинг: 0 / 0
Как эффективно использовать хр. процедуру, возвращающую табличные данные?
    #38818549
user7777
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
user7777
iapЛучше попробуйте написать нормальный SELECT (один!!!). - пока не знаю как
скажите как добиться того же результата одним селектом?
...
Рейтинг: 0 / 0
Как эффективно использовать хр. процедуру, возвращающую табличные данные?
    #38818559
Alex_Toms
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Даже если будет найден вариант с одним селектом тормоза всё же останутся.
Тормоза от inner join с табличной переменной.
Попробуйте вариант с индексами, интересно на сколько изменится скорость?
...
Рейтинг: 0 / 0
Как эффективно использовать хр. процедуру, возвращающую табличные данные?
    #38818581
Glory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user7777приведу пример, возможно и не нужна



Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
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 по сути соединяется сама с собой зачем то
...
Рейтинг: 0 / 0
Как эффективно использовать хр. процедуру, возвращающую табличные данные?
    #38818584
Alex_Toms
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не факт, данные в #tblHeader и tblHeader скорее всего разные...
...
Рейтинг: 0 / 0
Как эффективно использовать хр. процедуру, возвращающую табличные данные?
    #38818585
iap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alex_TomsДаже если будет найден вариант с одним селектом тормоза всё же останутся.
Тормоза от inner join с табличной переменной.
Попробуйте вариант с индексами, интересно на сколько изменится скорость?Какой переменной??!
Зачем переменная??!

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

Кстати, интересно, а зачем MyFunc()? Какого она типа?
Вызов этой функции в принципе может тормозить по-страшному.
...
Рейтинг: 0 / 0
Как эффективно использовать хр. процедуру, возвращающую табличные данные?
    #38818593
Alex_Toms
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iapКакой переменной??!
Зачем переменная??!

Мой ответ для варианта с табличной переменной вместо временной таблицы...
...
Рейтинг: 0 / 0
Как эффективно использовать хр. процедуру, возвращающую табличные данные?
    #38818594
iap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alex_TomsiapКакой переменной??!
Зачем переменная??!

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


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