Форум программистов, компьютерный форум, киберфорум
Microsoft SQL Server
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.83/18: Рейтинг темы: голосов - 18, средняя оценка - 4.83
0 / 0 / 0
Регистрация: 24.04.2019
Сообщений: 14

Очень долго выполняется хранимая процедура

05.01.2020, 08:18. Показов 3350. Ответов 5

Студворк — интернет-сервис помощи студентам
Добрый день при выполнению запроса, а точнее при сохранении данных с excel хранимая процедура долго обрабатывается

Oracle 11 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
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
USE [WebProject]
GO
/****** Object:  StoredProcedure [dbo].[info_SetCollectedSignWithSerialNumbers]    Script Date: 05.01.2020 10:37:30 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ARITHABORT ON
GO
ALTER PROCEDURE [dbo].[info_SetCollectedSignWithSerialNumbers]
  @basketOrderId int,
  @dataTable dbo.NotPayedOrdersExcel readonly
AS
BEGIN
    
    SET nocount ON
    
 
IF object_id('tempdb..#tmpSerial', 'u') IS NOT NULL DROP TABLE #tmpSerial
CREATE TABLE #tmpSerial (serial nvarchar(100) NOT NULL, goodId int NOT NULL)
 
INSERT INTO #tmpSerial 
SELECT 
  RTRIM(LTRIM(ts.serial)), g.GoodId
FROM
  @dataTable AS ts
  inner join dbo.Goods AS g WITH(nolock) ON g.GoodArticle = ts.article
 
  SET nocount off
  
 
INSERT INTO dbo.BasketOrdersAddInfo
(
  BasketOrderId,
  SerialNumber,
  BasketOrderGoodId,
  UserId
)
SELECT DISTINCT
  bog.BasketOrderId, 
  NULL,
  bog.Id, 
  5
FROM
  dbo.BasketOrderGoods AS bog WITH(nolock)
  --cross join #tmpSerial s
WHERE  
  bog.BasketOrderId = @basketOrderId
 
--select distinct ts.serial from #tmpSerial as ts with(nolock)
--select * from #tmpSerial as ts with(nolock)
 
DECLARE 
  @serial nvarchar(100) = NULL, 
  @i int = 0,
  @goodId int = NULL
 
---------------------------------------------------------- 1
WHILE EXISTS (
  SELECT * 
  FROM 
    dbo.BasketOrdersAddInfo AS boai WITH(nolock) 
    --inner join dbo.BasketOrderGoods as bog with(nolock) on bog.Id = boai.BasketOrderGoodId
  WHERE 
    boai.BasketOrderId = @basketOrderId AND 
    boai.SerialNumber IS NULL --and bog.GoodId = 254203
)
BEGIN
  
  --set @goodId = 254203
  
  SELECT top 1 
    @serial = s.serial, 
    @goodId = s.goodId
  FROM 
    #tmpSerial s
    left outer join dbo.BasketOrdersAddInfo AS boai WITH(nolock) 
      ON 
        boai.BasketOrderId = @basketOrderId AND 
        boai.SerialNumber = s.serial
  WHERE 
    --s.goodId = 254203 and
    boai.Id IS NULL
    
  IF (@serial IS NULL) raiserror('Серийный номер не распознан', 11, 1)
  
  UPDATE boai
  SET 
    boai.SerialNumber = @serial
  FROM 
    dbo.BasketOrdersAddInfo AS boai WITH(nolock) 
    inner join dbo.BasketOrderGoods AS bog WITH(nolock) 
      ON 
        bog.Id = boai.BasketOrderGoodId AND 
        bog.GoodId = @goodId
  WHERE 
    boai.BasketOrderId = @basketOrderId AND
    boai.SerialNumber IS NULL AND 
    boai.Id = (
      SELECT MIN(boai.Id) 
      FROM 
        dbo.BasketOrdersAddInfo AS boai WITH(nolock) 
        inner join dbo.BasketOrderGoods AS bog WITH(nolock) 
        ON 
          bog.Id = boai.BasketOrderGoodId AND 
          bog.GoodId = @goodId
      WHERE 
        boai.BasketOrderId = @basketOrderId AND 
        boai.SerialNumber IS NULL --and boai.BasketOrderGoodId = bog.Id
    )
    
  UPDATE bog SET bog.IsCollected = 1 FROM BasketOrderGoods AS bog WHERE bog.BasketOrderId = @basketOrderId
    
  UPDATE bo SET bo.IsCollected = 1 FROM BasketOrders AS bo WHERE bo.Id=  @basketOrderId
  SET @i += 1
    
  --print @i
  --if (@i > 2) break
  
  --select @i, @goodId, @serial
  
  SET @goodId = NULL
  SET @serial = NULL
  
END
 
--select @i
 
SET @i = 0
 
END
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
05.01.2020, 08:18
Ответы с готовыми решениями:

Медленно выполняется хранимая процедура
Процедура содержит в себе инструкцию Merge с переносом данных из одной тяжёлой таблицы в другую с условиями. Выполнял тот же код не как...

Очень долго выполняется запрос SQL
Добрый день! Товарищи, помогите разобраться почему SQL запрос выполняется жутко долго (2,5 минуты) Как и где можно протестировать этот...

Хранимая процедура
Попытался написать хранимую процедуру, которая при добавление данных в таблицу Сделка, автоматически добавляет код сделки в таблицу...

5
5966 / 4542 / 1094
Регистрация: 29.08.2013
Сообщений: 28,151
Записей в блоге: 3
05.01.2020, 21:41
Цитата Сообщение от KACKbIP Посмотреть сообщение
а точнее при сохранении данных с excel хранимая процедура долго обрабатывается
"что значит при сохранении данных С экселя"?

эксель это электронная таблица, а мы говорим про БД
что вообще у вас происходит?

и что значит "долго"?
и в какой именно момент долго?
0
8 / 5 / 3
Регистрация: 19.01.2015
Сообщений: 88
06.01.2020, 19:46
Немного странное оформление процедуры. Дайте план запроса, который выдает вам процедура.

А так у меня есть только следующие рекомендации:
Строка 29 - это можно убрать.
Строка 22 - сначала выгружайте полностью данные из Excel во временный объект, а потом делайте JOIN к существующей таблице. В таблице GoodArticle что это за поле такое? Если вы пытаетесь сделать JOIN к таблице по текстовому полю - это не очень рационально. Исследуйте другие способы соединения.
Строка 59 - уберите SELECT * и поставьте SELECT 1
Строка 99 - насколько я мог понять, внутренний запрос никак не связан с внешним. Вынесите его в отдельную конструкцию, а значение присваивайте к переменной.
0
 Аватар для pincet
1654 / 1153 / 173
Регистрация: 23.07.2010
Сообщений: 6,910
07.01.2020, 12:27
Цитата Сообщение от kEkCJkee Посмотреть сообщение
Строка 59 - уберите SELECT * и поставьте SELECT 1
это еще зачем?
1
3614 / 2135 / 756
Регистрация: 02.06.2013
Сообщений: 5,169
07.01.2020, 13:04
Лучший ответ Сообщение было отмечено pincet как решение

Решение

Цитата Сообщение от pincet Посмотреть сообщение
это еще зачем?
Как зачем? Само-собой для ускорения выполнения

Не придерайтесь Ну не читает человек документацию - не нужно это ему, он и так все знает...
1
8 / 5 / 3
Регистрация: 19.01.2015
Сообщений: 88
07.01.2020, 19:57
Цитата Сообщение от pincet Посмотреть сообщение
это еще зачем?
Актуализировал данные. Спасибо за замечание. Действительно, в этом нет необходимости.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
07.01.2020, 19:57
Помогаю со студенческими работами здесь

Хранимая процедура
всем привет! при написании хранимой процедуры возникло несколько вопросов такое присвоение не работает select count(id) = @count...

Хранимая процедура
Что-то совсем не могу разобраться... Нужно написать хранимую процедуру, которая заполняет столбец таблицы, на основании других столбцов. ...

Хранимая процедура
Есть хранимая процедура, которая позволяет собрать данные по произведенным платежам из таблиц. Проблема в том что данная процедура...

Хранимая процедура
Здравствуйте, у меня есть хранимая процедура которая по названию континента показывает количество водоемов каждого типа на этом...

Хранимая процедура
Добрый день. Нужно создать хранимую процедуру (UPDATESALARY) со следующими условиями: 1) Входные данные: ID отдела, PERCENT процент...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
Установка Emscripten SDK (emsdk) и CMake на Windows для сборки C и C++ приложений в WebAssembly (Wasm)
8Observer8 30.01.2026
Чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. Система контроля версиями Git. . .
Подключение Box2D v3 к SDL3 для Android: физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
Влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru