Гость
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Можно ли существенно оптимизировать данную процедуру. / 25 сообщений из 57, страница 1 из 3
19.06.2013, 22:46
    #38303999
dimon71
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли существенно оптимизировать данную процедуру.
Доброго вечера, уважаемые!

Я небольшой спец в программировании, но приходится делать все самому, т.к. много мелких изменений постоянно, и проще переделать самому, чем долго искать спеца, да и не факт что сделают намного лучше. По-этому прошу ногами не пинать.

Мною написано много подобных процедур, стиль написания будет понятен из листинга ниже.
Можно ли существенно ускорить их выполнение? К примеру данный запрос выполняется секунд 20. Запросы идут потоком и в итоге все это долго.
Если найдется спец который существенно ускорит данное безобразие - я готов заплатить.
Может укажете на какие кардинальные ошибки?

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
-- Переносит характеристики товара по умолчанию на товар
USE iNETsHOP_scompt
GO

DROP PROCEDURE [dbo].set_default_descriptions
GO

CREATE PROCEDURE [dbo].set_default_descriptions @GID INT
AS 

SET NOCOUNT on;

DECLARE @GRID INT,
	@PID INT,
	@ETALON_CATEGORY VARCHAR (50),
	@PROP_ETALON_NAME VARCHAR (50),
	@PROP_ETALON_SORT INT,
	@PROP_ETALON_ID INT,
	@PROP_UNIT VARCHAR (20),
	@GP_ID	INT;

	-- Узнаем к какой категории относится товар
	SELECT @GRID = G_GR_ID FROM TBL_GOODS WHERE G_ID = @GID;

	-- Получаем список характеристик по умолчанию категории - образца
	DECLARE cursor_default_props CURSOR LOCAL FOR
	SELECT p.P_ID, p.P_NAME, p.P_UNIT, ggp.GRP_SORT
	FROM TBL_GROUPS_GOODS_PROPS ggp, TBL_PROPS p
	WHERE ggp.GRP_P_ID = p.P_ID AND ggp.GRP_GR_ID = @GRID
	ORDER BY ggp.GRP_SORT;
	
	OPEN cursor_default_props;

	FETCH NEXT FROM cursor_default_props INTO @PROP_ETALON_ID, @PROP_ETALON_NAME, @PROP_UNIT, @PROP_ETALON_SORT;
	WHILE (@@FETCH_STATUS <> -1)
		BEGIN

	-- Получаем данные, есть ли для данного товара характеристика по умолчанию, такая же
	-- как и эталонная характеристика
	-- Если характеристика есть, то запрос вернет 1 или другое число, если есть дублирующиеся характеристики
	-- Если нет - вернется 0

		SET	@GP_ID = NULL;

		SELECT	@GP_ID = GP_ID
		FROM TBL_GOODS_PROPS
		WHERE GP_G_ID = @GID AND GP_P_ID = @PROP_ETALON_ID;

--PRINT CAST (@PROP_ETALON_ID AS VARCHAR (10))+ ' ' + @PROP_ETALON_NAME + ' ' + CAST(@PROP_ETALON_SORT AS VARCHAR (10));

		IF @GP_ID IS NULL
			BEGIN
--PRINT 'Характеристики по умолчанию такой нет. Добавляем.';
			INSERT INTO TBL_GOODS_PROPS (GP_G_ID, GP_P_ID, GP_UNIT) VALUES (@GID, @PROP_ETALON_ID, @PROP_UNIT);
			END 
--PRINT ' ';
		ELSE
			-- характеристика есть у товара, обновляем сортировку и еденицы измерения
			BEGIN
			UPDATE TBL_GOODS_PROPS SET GP_UNIT = @PROP_UNIT WHERE GP_ID = @GP_ID;
			END
		

		FETCH NEXT FROM cursor_default_props INTO @PROP_ETALON_ID, @PROP_ETALON_NAME, @PROP_UNIT, @PROP_ETALON_SORT;
		END
	CLOSE cursor_default_props;
	DEALLOCATE cursor_default_props;

	-- Удаляем характеристики привязанные к товару, но не указанные в умолчании.

	DELETE FROM TBL_GOODS_PROPS WHERE GP_G_ID = @GID AND GP_P_ID IN
	(SELECT P_ID FROM TBL_PROPS, TBL_GOODS_PROPS
	WHERE P_ID = GP_P_ID AND GP_G_ID = @GID AND P_ID NOT IN
		(SELECT p.P_ID
		FROM TBL_GROUPS_GOODS_PROPS ggp, TBL_PROPS p
		WHERE ggp.GRP_P_ID = p.P_ID AND ggp.GRP_GR_ID = @GRID));
...
Рейтинг: 0 / 0
19.06.2013, 22:55
    #38304003
natya
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли существенно оптимизировать данную процедуру.
dimon71,

план выполнения у вас ест?
смотрите план выполнения и вы сам будете исправит ошибки
...
Рейтинг: 0 / 0
19.06.2013, 23:50
    #38304018
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли существенно оптимизировать данную процедуру.
dimon71Может укажете на какие кардинальные ошибки?
1) В теме не описаны исходные структуры;
2) В теме не описана сутьпроисходящего;
3) Код не обёрнут в соответствующий тег.

dimon71Можно ли существенно ускорить их выполнение? К примеру данный запрос выполняется секунд 20. Запросы идут потоком и в итоге все это долго.
Разбираться в этой некомементированной лапше нет никакого желания. Но навскидку весьма напоминает бред процедурного программиста, не понявшего суть SQL и плодящего итерационные циклы вместо одного простого запроса.
...
Рейтинг: 0 / 0
20.06.2013, 09:09
    #38304173
HelenM
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли существенно оптимизировать данную процедуру.
natyaплан выполнения у вас есть?
смотрите план выполнения и вы сам будете исправит ошибки

Плюсую!
Иногда достаточно индексы добавить/убрать, чтобы запрос начал летать.
...
Рейтинг: 0 / 0
20.06.2013, 09:13
    #38304180
aleks2
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли существенно оптимизировать данную процедуру.
HelenMnatyaплан выполнения у вас есть?
смотрите план выполнения и вы сам будете исправит ошибки

Плюсую!
Иногда достаточно индексы добавить/убрать, чтобы запрос начал летать.

Интересуюсь, Сонечка, хдеж ты тут запрос то увидела?

У тредстартера тупая императивная процедура, которая на раз заменяется одним MERGE.
...
Рейтинг: 0 / 0
20.06.2013, 09:24
    #38304191
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли существенно оптимизировать данную процедуру.
dimon71,

Тут совет один — писать запросами а не курсорами.

Вот зачем тебе там курсор?
...
Рейтинг: 0 / 0
20.06.2013, 09:30
    #38304199
Cammomile
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли существенно оптимизировать данную процедуру.
Ув. автор топика, для простоты понимания, скажем так ,что Select * From [TableName] это типа как FOREACH
Т.е. вы в селекте пройдете по каждой строке соответсвующей условию автоматически. Ровно также как при инсерте и апдейте.

Т.е. вам надо для начала прочитать селект/инсерт/апдейт.
Затем оформление хранимок.
Затем начинать творить.

Хотя курсоры и проходят указанный диапазон построчно, нужны они совсем для другого.
...
Рейтинг: 0 / 0
20.06.2013, 09:41
    #38304211
Сергей Викт.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли существенно оптимизировать данную процедуру.
dimon71,

insert
select
и
update from вместо курсора..
А вообще правильно сказали выше, изучите базовые инструкции T-SQL:)
SELECT
UPDATE
INSERT
...
Рейтинг: 0 / 0
20.06.2013, 09:47
    #38304221
Cammomile
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли существенно оптимизировать данную процедуру.
По хорошему, нам нужен отдельный faq по теме "как читать майкрософтовские хелпы". По своему опыту скажу, что конструкции типа
автор [ <FOR Clause>]
[ OPTION ( <query_hint> [ ,...n ] ) ] ввергают неокрепший разум в ужас и уныние.
...
Рейтинг: 0 / 0
20.06.2013, 09:53
    #38304239
Сергей Викт.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли существенно оптимизировать данную процедуру.
CammomileПо хорошему, нам нужен отдельный faq по теме "как читать майкрософтовские хелпы". По своему опыту скажу, что конструкции типа
автор [ <FOR Clause>]
[ OPTION ( <query_hint> [ ,...n ] ) ] ввергают неокрепший разум в ужас и уныние.
Согласен с вами)
А далее ещё:

<query hint> ::=
{
}
Но там всегда есть примеры, которые помогают осознать основные принципы, а далее просто время и разработка...
...
Рейтинг: 0 / 0
20.06.2013, 10:16
    #38304277
dimon71
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли существенно оптимизировать данную процедуру.
Cammomile, и другие уважаемые форумчане. Большое спасибо за советы.
Все понял. Пошел исправляться.
Насчет замены нараз всего этого одним запросом, думаю ничего не выйдет.
Покопаюсь.

Спасибо.
...
Рейтинг: 0 / 0
20.06.2013, 10:23
    #38304285
Мистер Хенки
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли существенно оптимизировать данную процедуру.
dimon71Cammomile, и другие уважаемые форумчане. Большое спасибо за советы.
Все понял. Пошел исправляться.
Насчет замены нараз всего этого одним запросом, думаю ничего не выйдет.
Покопаюсь.

Спасибо.
вам тут про оператор merge намекали, вот и начните чтение справочной информации с него
...
Рейтинг: 0 / 0
20.06.2013, 10:28
    #38304293
invm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли существенно оптимизировать данную процедуру.
CammomileПо хорошему, нам нужен отдельный faq по теме "как читать майкрософтовские хелпы".По хорошему, все уже давно написано.
Синтаксические обозначения в Transact-SQL (Transact-SQL)
Расширенная форма Бэкуса — Наура
...
Рейтинг: 0 / 0
20.06.2013, 10:34
    #38304304
Cammomile
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли существенно оптимизировать данную процедуру.
РБНФ; век живи--век учись. Спасибо коллега!
...
Рейтинг: 0 / 0
20.06.2013, 10:54
    #38304335
DirksDR
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли существенно оптимизировать данную процедуру.
dimon71,

Нет информации о размерах таблицы. Но 20 сек даже для миллиона записей много.
Вряд ли в справочние товаров у Вас больше.
Проверьте наличие и использование индексов.
Использование курсоров не так уж критически сказывается на быстродействии.
Зато намного наглядней алгоритм(скрипт).
...
Рейтинг: 0 / 0
20.06.2013, 10:59
    #38304344
Cammomile
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли существенно оптимизировать данную процедуру.
"Использование курсоров не так уж критически сказывается на быстродействии."
Вот за такое хочеться взять и у...бедить так больше никогда-никогда не писать.
...
Рейтинг: 0 / 0
20.06.2013, 11:16
    #38304368
Cammomile
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли существенно оптимизировать данную процедуру.
DirksDR,когда отработает расскажите нам, как там курсор сказывается на скорости выполнения, ок?
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
 
if Object_id('tempdb..#t') is not null drop table #t 
create table #t (field int)

GO

 with myCTE as (
 select [n] = 1 
 union all 
 select [n] = [n] + 1 from myCTE
 where n < 1000000 
 )
  
insert into #t
select n from myCTE
option (maxrecursion  0 )
 

GO 

select * from #t


declare @f int 
declare myC cursor local forward_only  for select field from #t 
open myC 
fetch next from myC into @f
while @@fetch_status = 0 
begin
  select @f
  fetch next from myC into @f
end
...
Рейтинг: 0 / 0
20.06.2013, 11:17
    #38304371
Cammomile
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли существенно оптимизировать данную процедуру.
Cammomileхочеться ==>хочется
ну почему тут нельзя редактировать посты ((((
...
Рейтинг: 0 / 0
20.06.2013, 11:38
    #38304412
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли существенно оптимизировать данную процедуру.
dimon71Cammomile, и другие уважаемые форумчане. Большое спасибо за советы.
Все понял. Пошел исправляться.
Насчет замены нараз всего этого одним запросом, думаю ничего не .


К сожалению, только так и надо.
Эту процедуру надо заменить на два запроса insert update, или один merge.
...
Рейтинг: 0 / 0
20.06.2013, 11:44
    #38304438
alexeyvg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли существенно оптимизировать данную процедуру.
CammomileПо хорошему, нам нужен отдельный faq по теме "как читать майкрософтовские хелпы". По своему опыту скажу, что конструкции типа
автор [ <FOR Clause>]
[ OPTION ( <query_hint> [ ,...n ] ) ] ввергают неокрепший разум в ужас и уныние.Ну ладно, нормальный хелп, на русском языке, с примерами.

А эти "конструкции типа" обязательно надо изучить, так описываются синтаксические конструкции у всех производителей, и в учебниках, не только у микрософта. Эти конструкции на самом деле очень просты, всего лишь нужно понять, что озачают 3 вида скобок, многоточие и запятая.
...
Рейтинг: 0 / 0
20.06.2013, 11:45
    #38304441
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли существенно оптимизировать данную процедуру.
Cammomile"Использование курсоров не так уж критически сказывается на быстродействии."
Вот за такое хочеться взять и у...бедить так больше никогда-никогда не писать.

А кто это писал?
...
Рейтинг: 0 / 0
20.06.2013, 11:48
    #38304448
Glory
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли существенно оптимизировать данную процедуру.
CammomileПо хорошему, нам нужен отдельный faq по теме "как читать майкрософтовские хелпы". По своему опыту скажу, что конструкции типа
автор [ <FOR Clause>]
[ OPTION ( <query_hint> [ ,...n ] ) ] ввергают неокрепший разум в ужас и уныние.
Вы не поверите, но про то, как читать майкрософтовские хелпы", есть в самом хелпе - Transact-SQL Syntax Conventions (Transact-SQL)
...
Рейтинг: 0 / 0
20.06.2013, 11:48
    #38304449
Cammomile
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли существенно оптимизировать данную процедуру.
ну вот же
DirksDRdimon71,

Нет информации о размерах таблицы. Но 20 сек даже для миллиона записей много.
Вряд ли в справочние товаров у Вас больше.
Проверьте наличие и использование индексов.
Использование курсоров не так уж критически сказывается на быстродействии.
Зато намного наглядней алгоритм(скрипт).
...
Рейтинг: 0 / 0
20.06.2013, 11:51
    #38304452
Glory
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли существенно оптимизировать данную процедуру.
Cammomile"Использование курсоров не так уж критически сказывается на быстродействии."
Вот за такое хочеться взять и у...бедить так больше никогда-никогда не писать.
Все зависит от конкретной задачи. И выигрывает всегда тот, кто знает больше способов. А не тот, у кого больше убеждений.
...
Рейтинг: 0 / 0
20.06.2013, 11:55
    #38304456
Cammomile
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли существенно оптимизировать данную процедуру.
Пример когда селект\инсерт\апдейт в курсоре быстрее чем без курсора в студию.
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Можно ли существенно оптимизировать данную процедуру. / 25 сообщений из 57, страница 1 из 3
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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