Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Update. Сколько update-ов может быть в одном скрипте-файле?  [new]
avpetrov27
Member

Откуда:
Сообщений: 18
Здравствуйте.

Исходные данные:
SQL Server 2012. SQL Managment Studio.
Есть таблица 195000 строк.
Нужно по поиску ключевых слов обновить данные.
Пример:
update TAble1 set Find1 = 'Есть вода и хлеб' where TextCol like '%хлеб%' and TextCol like '%вода%'
update TAble1 set Find1 = 'Есть вода' where TextCol not like '%хлеб%' and TextCol like '%вода%'
Запросов(update-ов) около 6000.
Есть сложные вопросы, около 50 условий like или not like.

Выполнение:
Выполнение долгое.
Оставлял работать на ночь.

Результат:
на утро у меня автоматически вышел из соединения.( т.е. я не мог посмотреть сообщения -сколько он обновил и количество потраченного времени).
Посмотрев результат обнаружил, что выполнены примерно штук 500 запросов сначала, и 10 с конца
(в последних 10 условия на поиск простые : " where TextCol like '%Йод%' " ).

Проблема: почему-то не выполнились запросы из середины(около 5500 штук).
Проверил: выборочно запустил некоторые запросы из середины списка - Среди них некоторые строки обновились(если находились ключевые слова). Получается, что за ночь серединные запросы не были выполнены.

Есть ли какие-то ограничения в SQL server на количество запросов(update) в одном скрипте(файле)?
Если они существуют, возможно ли как-то настроить, например, автоматический последовательный запуск нескольких скриптов?
13 янв 16, 14:34    [18672877]     Ответить | Цитировать Сообщить модератору
 Re: Update. Сколько update-ов может быть в одном скрипте-файле?  [new]
_djХомяГ
Guest
Вы разделяете бэтчи ["логические" куски скрипта] друг от друга
GO

возможно скрипт где то обломался в середине и ушел на другой бэтч который в конце


PS
Оч странно что
автор
Есть таблица 195000 строк.

и
автор
Выполнение долгое.
Оставлял работать на ночь.
13 янв 16, 14:47    [18672952]     Ответить | Цитировать Сообщить модератору
 Re: Update. Сколько update-ов может быть в одном скрипте-файле?  [new]
mishanya3624
Member

Откуда:
Сообщений: 796
_djХомяГ,

точно, как будто нулей не хватает в цифре)
13 янв 16, 14:49    [18672960]     Ответить | Цитировать Сообщить модератору
 Re: Update. Сколько update-ов может быть в одном скрипте-файле?  [new]
StarikNavy
Member

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

>>Есть ли какие-то ограничения в SQL server на количество запросов
если сама студия не падает сразу, то нету

>>почему-то не выполнились запросы из середины
выполнение идет по порядку. или что-то с условиями ("серединные" не нашли записей по своим критериям), или более старые запросы переписали более первые

>>автоматический последовательный запуск нескольких скриптов?
sql agent



з.ы. можно сто апдейтов объеденить в один
update TAble1 set Find1 = case when tnen...
13 янв 16, 14:51    [18672974]     Ответить | Цитировать Сообщить модератору
 Re: Update. Сколько update-ов может быть в одном скрипте-файле?  [new]
iap
Member

Откуда: Москва
Сообщений: 47105
mishanya3624
_djХомяГ,

точно, как будто нулей не хватает в цифре)
В девяти из десяти десятичных цифр нулей действительно не хватает!
13 янв 16, 14:55    [18672996]     Ответить | Цитировать Сообщить модератору
 Re: Update. Сколько update-ов может быть в одном скрипте-файле?  [new]
avpetrov27
Member

Откуда:
Сообщений: 18
_djХомяГ,
спасибо.

_djХомяГ
Вы разделяете бэтчи ["логические" куски скрипта] друг от друга
GO

возможно скрипт где то обломался в середине и ушел на другой бэтч который в конце


Нет "GO" не ставлю. Их нужно после каждого Update ставить, или перед?
Пока "GO" не использовал, и честно говоря не очень хорошо понимаю зачем они. Если расскажете, хотя бы вкратце, буду очень признателен.
13 янв 16, 15:06    [18673057]     Ответить | Цитировать Сообщить модератору
 Re: Update. Сколько update-ов может быть в одном скрипте-файле?  [new]
iap
Member

Откуда: Москва
Сообщений: 47105
Надо все шаблоны для LIKE собрать в таблице.
Тогда
SELECT T.ID, Find1=
STUFF
(
 'Есть '
+(
   SELECT ' и '+P.Word
   FROM Table1 TT
   JOIN Pattern P ON TT.TextCol LIKE '%'+P.Word+'%'
   WHERE TT.ID=T.ID
   FOR XML PATH(''),TYPE
  ).value('.','varchar(1000)')
 ,6,3,''
)
FROM Table1 T;
13 янв 16, 15:12    [18673095]     Ответить | Цитировать Сообщить модератору
 Re: Update. Сколько update-ов может быть в одном скрипте-файле?  [new]
Konst_One
Member

Откуда:
Сообщений: 11615
ТС, вот это

update TAble1 set Find1 = 'Есть вода и хлеб' where TextCol like '%хлеб%'	and TextCol like '%вода%'	
update TAble1 set Find1 = 'Есть вода' where TextCol not like '%хлеб%'	and TextCol like '%вода%'


можно заменить этим одним запросом:

update TAble1 
set Find1 = CASE WHEN TextCol like '%хлеб%'	and TextCol like '%вода%' THEN  'Есть вода и хлеб' 
                CASE WHEN TextCol not like '%хлеб%' and TextCol like '%вода%' THEN  'Есть вода'
                CASE ELSE '' END


а вообще бредовые условия какие-то, подумайте ещё раз
13 янв 16, 15:12    [18673096]     Ответить | Цитировать Сообщить модератору
 Re: Update. Сколько update-ов может быть в одном скрипте-файле?  [new]
iap
Member

Откуда: Москва
Сообщений: 47105
Надо же апдейт сделать...

UPDATE T SET T.Find1=
STUFF
(
 'Есть '
+(
   SELECT ' и '+P.Word
   FROM Table1 TT
   JOIN Pattern P ON TT.TextCol LIKE '%'+P.Word+'%'
   WHERE TT.ID=T.ID
   FOR XML PATH(''),TYPE
  ).value('.','varchar(1000)')
 ,6,3,''
)
FROM Table1 T;
13 янв 16, 15:14    [18673110]     Ответить | Цитировать Сообщить модератору
 Re: Update. Сколько update-ов может быть в одном скрипте-файле?  [new]
iap
Member

Откуда: Москва
Сообщений: 47105
Pattern - это что-то такое:
CREATE TABLE Pattern(Word VARCHAR(100));
INSERT Pattern(Word)VALUES('хлеб'),('вода');
13 янв 16, 15:15    [18673113]     Ответить | Цитировать Сообщить модератору
 Re: Update. Сколько update-ов может быть в одном скрипте-файле?  [new]
WarAnt
Member

Откуда: Питер
Сообщений: 2423
avpetrov27,
автор
Посмотрев результат обнаружил, что выполнены примерно штук 500 запросов сначала, и 10 с конца


Так как написанное бред, сдается мне, что ваши последние 10 запросов тупо перетерли изменения предыдущих 5500 запросов.
13 янв 16, 15:15    [18673118]     Ответить | Цитировать Сообщить модератору
 Re: Update. Сколько update-ов может быть в одном скрипте-файле?  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31910
avpetrov27
Получается, что за ночь серединные запросы не были выполнены.
Если вы не смогли посмотреть результат выполнения, то остаётся только гадать.
Возможно, апдэйты в конце перекрыли апдэйты в середине.

avpetrov27
Нет "GO" не ставлю. Их нужно после каждого Update ставить, или перед?
Пока "GO" не использовал, и честно говоря не очень хорошо понимаю зачем они. Если расскажете, хотя бы вкратце, буду очень признателен.
"GO" разделяет батчи. Для батча строятся планы выполнения, и 6 тысяч стейтментов может быть слишком много.

Поставьте "GO" после каждого апдейта или после группы в сотню апдэйтов.

Но, конечно, ещё лучше сделать CASE или собирать шаблоны в таблице.
13 янв 16, 15:20    [18673142]     Ответить | Цитировать Сообщить модератору
 Re: Update. Сколько update-ов может быть в одном скрипте-файле?  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31910
_djХомяГ
Оч странно что
автор
Есть таблица 195000 строк.

и
автор
Выполнение долгое.
Оставлял работать на ночь.
Ну как, 6 тысяч сканов таблицы в 195000 строк, не так уж мало.
13 янв 16, 15:22    [18673148]     Ответить | Цитировать Сообщить модератору
 Re: Update. Сколько update-ов может быть в одном скрипте-файле?  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8717
Миллиард двести тысяч строк требуется просмотреть, чего же странного по времени.
13 янв 16, 16:22    [18673575]     Ответить | Цитировать Сообщить модератору
 Re: Update. Сколько update-ов может быть в одном скрипте-файле?  [new]
mishanya3624
Member

Откуда:
Сообщений: 796
Владислав Колосов,

точно 6000 апдейтов, лярд и 200 лямов выходит
13 янв 16, 16:38    [18673705]     Ответить | Цитировать Сообщить модератору
 Re: Update. Сколько update-ов может быть в одном скрипте-файле?  [new]
o-o
Guest
avpetrov27
Посмотрев результат обнаружил, что выполнены примерно штук 500 запросов сначала, и 10 с конца
(в последних 10 условия на поиск простые : " where TextCol like '%Йод%' " ).

может, выпонилось все, но одно другое переобновило.
может, остальные апдэйты из середины пакета завершились с ошибками.
раз все было в одном пакете и последний апдэйт выполнился,
ошибки не batch aborted
(т.е. один statement обломался, но пакет дальше выполняется)
вот примеры на эти 2 случая:
if OBJECT_ID('dbo.t') is not null drop table dbo.t;
create table dbo.t (id int identity, col1 varchar(10), col2 varchar(100));
go

insert into dbo.t(col2) values ('aaa'), ('bbb'), ('cccc');
go

-- (1)
update dbo.t 
set col1 = 'exists bbb' 
where col2 like '%bbb%'; 

-- (2)
update dbo.t 
set col1 = 'exists a' 
where col2 like '%a%'; 

-- (3)
update dbo.t 
set col1 = 'exists aaa' 
where col2 like '%aaa%'; 
go

select *
from dbo.t;
go

--id	col1	col2
--1	exists aaa	aaa
--2	exists bbb	bbb
--3	NULL	cccc

-- (2) - ??? -- update over update

-- (4)
update dbo.t 
set col1 = 'exists bbb' 
where col2 like '%bbb%'; 

-- (5)
update dbo.t 
set col1 = 'exists cccc' 
where col2 like '%cccc%'; 

-- (6)
update dbo.t 
set col1 = 'exists a' 
where col2 like '%a%'; 
go

select *
from dbo.t;

--id	col1	col2
--1	exists a	aaa
--2	exists bbb	bbb
--3	NULL	cccc

-- (5) - ??? -- error

можно логировать успешные апдэйты, используя output:
if OBJECT_ID('dbo.res') is not null drop table dbo.res;
create table dbo.res (id_statement int, id int, col1_old varchar(10), col1_new varchar(10));
go

-- (1)
update dbo.t 
set col1 = 'exists bbb' 
output 1, inserted.id, deleted.col1, inserted.col1 into dbo.res(id_statement, id, col1_old, col1_new)
where col2 like '%bbb%'; 

-- (2)
update dbo.t 
set col1 = 'exists a' 
output 2, inserted.id, deleted.col1, inserted.col1 into dbo.res(id_statement, id, col1_old, col1_new)
where col2 like '%a%'; 

-- (3)
update dbo.t 
set col1 = 'exists aaa' 
output 3, inserted.id, deleted.col1, inserted.col1 into dbo.res(id_statement, id, col1_old, col1_new)
where col2 like '%aaa%'; 
go

-- (4)
update dbo.t 
set col1 = 'exists bbb' 
output 4, inserted.id, deleted.col1, inserted.col1 into dbo.res(id_statement, id, col1_old, col1_new)
where col2 like '%bbb%'; 

-- (5)
update dbo.t 
set col1 = 'exists cccc' 
output 5, inserted.id, deleted.col1, inserted.col1 into dbo.res(id_statement, id, col1_old, col1_new)
where col2 like '%cccc%'; 

-- (6)
update dbo.t 
set col1 = 'exists a' 
output 6, inserted.id, deleted.col1, inserted.col1 into dbo.res(id_statement, id, col1_old, col1_new)
where col2 like '%a%'; 
go

select *
from dbo.res;

--id_statement	id	col1_old	col1_new
--1	2	exists bbb	exists bbb
--2	1	exists a	exists a
--3	1	exists a	exists aaa
--4	2	exists bbb	exists bbb
--6	1	exists aaa	exists a


заодно отсутствующие id_statement укажут на statement-ы, завершившиеся с ошибкой
13 янв 16, 18:02    [18674327]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить