Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 26.05.2014, 13:32   #1
Nekit9401
Пользователь
 
Аватар для Nekit9401
 
Регистрация: 11.12.2012
Сообщений: 56
По умолчанию Создание индекса для ускорения выполнения процедуры (SQL)

Имеется процедура для заполнения таблицы, так же для заполнения одного столбца этой таблицы используются данные из другой таблицы.

Код:
CREATE PROCEDURE insert_sale
AS
DECLARE     @num NUMERIC,
		@date DATETIME,
		@num_article INT,
		@quantity INT,
		@article INT,
		@price NUMERIC,
		@num_shop NUMERIC,
		@n NUMERIC;
DECLARE cur_insert_sale CURSOR FOR SELECT num_bill, date_bill FROM bill
OPEN cur_insert_sale
FETCH cur_insert_sale INTO @num, @date
WHILE @@FETCH_STATUS=0
	BEGIN
	SET @article=1
	SET @num_shop=CEILING(RAND()*20)
	SET @n=CEILING(RAND()*5)
	WHILE @article<=@n
	BEGIN
		PRINT @n
		PRINT @num
		PRINT @num_shop
IF MONTH(@date)<3 OR MONTH(@date)=12
BEGIN
	IF RAND()<=0.5 SET @num_article=CEILING(RAND()*30)
	ELSE SET @num_article=CEILING(RAND()*210)
END
IF MONTH(@date)>=3 AND MONTH(@date)<=5
BEGIN
	IF RAND()<=0.5 SET @num_article=CEILING(RAND()*29+31)
	ELSE SET @num_article=CEILING(RAND()*210)
END
IF MONTH(@date)>=6 AND MONTH(@date)<=8
BEGIN
	IF RAND()<=0.5 SET @num_article=CEILING(RAND()*29+61)
	ELSE SET @num_article=CEILING(RAND()*210)
END
IF MONTH(@date)>=9 AND MONTH(@date)<=11
BEGIN
	IF RAND()<=0.5 SET @num_article=CEILING(RAND()*29+91)
	ELSE SET @num_article=CEILING(RAND()*210)
END
		PRINT @num_article
		SET @quantity=CEILING(RAND()*2)
	INSERT INTO sale(quantity, num_bill, num_shop, num_article)
		VALUES(@quantity, @num, @num_shop, @num_article)
	UPDATE sale
	SET price=
		(SELECT price FROM article WHERE sale.num_article=article.num_article)
		SET @article=@article+1
		END
FETCH cur_insert_sale INTO @num, @date
END
DEALLOCATE cur_insert_sale
При выполнении этой процедуры создается около 35 тыс. строк и по времени занимает очень долго, по истечении 7 минут было создано около 11 тыс. строк. Как правильно создать индекс для запроса, что бы уменьшить время выполнения данной процедуры?
Nekit9401 вне форума Ответить с цитированием
Старый 26.05.2014, 13:41   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Если не секрет почему делаешь фетчем, а не insert into... from select ...
?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 26.05.2014, 13:49   #3
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Чуть ускорит
Код:
IF MONTH(@date)<3 OR MONTH(@date)=12
...
ELSE IF MONTH(@date)>=3 AND MONTH(@date)<=5
... и т.д.
И индекс для article по полю num_article - может существенно ускорит

CLOSE cur_insert_sale перед DEALLOCATE пропущен

А так курсор очень медленная штука и очень похоже, что все это можно заменить одним/парочкой запросов на обновление без курсора
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 26.05.2014, 15:06   #4
Nekit9401
Пользователь
 
Аватар для Nekit9401
 
Регистрация: 11.12.2012
Сообщений: 56
По умолчанию

Спасибо, все учел, но даже с индексом почему то выполнения запроса не ускорилось, так что я просто вынес update из процедуры и выполнил его отдельно, после заполнения всех остальных полей.
Nekit9401 вне форума Ответить с цитированием
Старый 26.05.2014, 15:33   #5
eval
Подтвердите свой е-майл
 
Регистрация: 29.08.2012
Сообщений: 4,011
По умолчанию

Цитата:
Спасибо, все учел ... так что я просто вынес update из процедуры и выполнил его отдельно
т.е. не учел ничего
eval вне форума Ответить с цитированием
Старый 26.05.2014, 15:34   #6
Nekit9401
Пользователь
 
Аватар для Nekit9401
 
Регистрация: 11.12.2012
Сообщений: 56
По умолчанию

Цитата:
т.е. не учел ничего
Учел то, что посоветовали, но результат остался все равно тот же.
Nekit9401 вне форума Ответить с цитированием
Старый 26.05.2014, 15:39   #7
eval
Подтвердите свой е-майл
 
Регистрация: 29.08.2012
Сообщений: 4,011
По умолчанию

передали на 1 запрос без курсоров и результат тот-же?
eval вне форума Ответить с цитированием
Старый 26.05.2014, 15:44   #8
eval
Подтвердите свой е-майл
 
Регистрация: 29.08.2012
Сообщений: 4,011
По умолчанию

Цитата:
IF RAND()<=0.5 SET @num_article=CEILING(RAND()*30)
ELSE SET @num_article=CEILING(RAND()*210)
а это что за барада?
eval вне форума Ответить с цитированием
Старый 26.05.2014, 15:48   #9
Nekit9401
Пользователь
 
Аватар для Nekit9401
 
Регистрация: 11.12.2012
Сообщений: 56
По умолчанию

Ну да, вынес запрос с update из процедуры, выполнил процедуру, таблица заполнилась, столбец price заполнился NULL значениями, потом отдельно выполнил update и скопировал нужные значения в столбец price. Вроде получилось все верно. Процедура без update выполнялась около 30 сек. Если сделал что-то неверно, тогда подскажите, что я сделал не так?
Nekit9401 вне форума Ответить с цитированием
Старый 26.05.2014, 15:51   #10
Nekit9401
Пользователь
 
Аватар для Nekit9401
 
Регистрация: 11.12.2012
Сообщений: 56
По умолчанию

Цитата:
Сообщение от eval Посмотреть сообщение
а это что за барада?
Генерация случайного числа с учетом вероятности.
Nekit9401 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сжатие файлов для ускорения загрузки Derdemyansky Общие вопросы C/C++ 3 03.02.2014 18:25
Создание макроса для выполнения отчетности в несколько кликов! polysster Microsoft Office Excel 2 14.08.2013 23:16
дефыйна для ускорения ветора и вообще STL Kukurudza Общие вопросы C/C++ 1 29.03.2012 18:34
Изменение кода для ускорения движения фигуры. 7vlad37 Microsoft Office Excel 7 28.07.2011 14:52
Создание процедуры на SQL Skyline20000 SQL, базы данных 0 31.03.2009 16:57