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

Откуда:
Сообщений: 370
Нужно просто в колонке выставить 1, 2, 3, ....
Пока вижу только решение с курсором
13 май 19, 11:27    [21883148]     Ответить | Цитировать Сообщить модератору
 Re: Как быстрее всего перенумеровать колонку в таблице из 70 млн строк?  [new]
Щукина Анна
Member

Откуда:
Сообщений: 1278
leonix,
перенумеровать - это сделать апдейт в таблице?
13 май 19, 11:29    [21883150]     Ответить | Цитировать Сообщить модератору
 Re: Как быстрее всего перенумеровать колонку в таблице из 70 млн строк?  [new]
Щукина Анна
Member

Откуда:
Сообщений: 1278
leonix,

или же - перенумеровать лишь результат выборки?
13 май 19, 11:29    [21883151]     Ответить | Цитировать Сообщить модератору
 Re: Как быстрее всего перенумеровать колонку в таблице из 70 млн строк?  [new]
leonix
Member

Откуда:
Сообщений: 370
Щукина Анна
leonix,
перенумеровать - это сделать апдейт в таблице?


да
13 май 19, 11:29    [21883152]     Ответить | Цитировать Сообщить модератору
 Re: Как быстрее всего перенумеровать колонку в таблице из 70 млн строк?  [new]
leonix
Member

Откуда:
Сообщений: 370
Щукина Анна
leonix,

или же - перенумеровать лишь результат выборки?


Перенумеровать колонку в таблице которая храниться в базе.
13 май 19, 11:30    [21883154]     Ответить | Цитировать Сообщить модератору
 Re: Как быстрее всего перенумеровать колонку в таблице из 70 млн строк?  [new]
Sergey Syrovatchenko
Member

Откуда: Харьков
Сообщений: 29
Добавляете новую колонку задаете для нее IDENTITY. Удаляете старую колонку (если критично), переименовываете новую на старую. Если с таблицей работают активно, то есть другие варианты.
13 май 19, 11:31    [21883155]     Ответить | Цитировать Сообщить модератору
 Re: Как быстрее всего перенумеровать колонку в таблице из 70 млн строк?  [new]
лолл
Member

Откуда:
Сообщений: 446
Как вариант:

USE tempdb;
GO

BEGIN TRAN

CREATE TABLE test
(
  Id Int NULL
)

INSERT test
VALUES (NULL), (NULL), (NULL)

CREATE SEQUENCE TestSeq
 AS Int
 START WITH 1
 INCREMENT BY 1

ALTER TABLE test ADD CONSTRAINT DF_test_Id DEFAULT (NEXT VALUE FOR TestSeq) FOR Id

UPDATE test SET Id = DEFAULT

SELECT * FROM test

ROLLBACK
13 май 19, 12:05    [21883201]     Ответить | Цитировать Сообщить модератору
 Re: Как быстрее всего перенумеровать колонку в таблице из 70 млн строк?  [new]
leonix
Member

Откуда:
Сообщений: 370
Всем спасибо.
Пойду пробовать на копии.
Не знаю как 1С отреагирует на лишние колонки.
13 май 19, 12:26    [21883232]     Ответить | Цитировать Сообщить модератору
 Re: Как быстрее всего перенумеровать колонку в таблице из 70 млн строк?  [new]
iap
Member

Откуда: Москва
Сообщений: 46689
WITH T AS (SELECT N=ROW_NUMBER()OVER(ORDER BY OrderField),* FROM TableName)
UPDATE T SET NumberField=N;
70 миллионов - не так уж и много. Ну подождёте какое-то время один раз...
Не вижу в этом трагедии.
13 май 19, 12:45    [21883255]     Ответить | Цитировать Сообщить модератору
 Re: Как быстрее всего перенумеровать колонку в таблице из 70 млн строк?  [new]
zzzzzzzzzz
Member

Откуда:
Сообщений: 310
http://www.dbdelta.com/add-or-remove-identity-property-from-an-existing-column-efficiently/
13 май 19, 16:46    [21883564]     Ответить | Цитировать Сообщить модератору
 Re: Как быстрее всего перенумеровать колонку в таблице из 70 млн строк?  [new]
leonix
Member

Откуда:
Сообщений: 370
Отчитываюсь.
Колонку не удалось добавить. Система ругается что колонки нельзя создавать.


Запрос
WITH T AS (SELECT N=ROW_NUMBER() OVER(ORDER BY _fld223),* FROM [dbo].[_InfoRg222])
UPDATE T SET _fld224=N;

не удалось выполнить. После 10 часов работы вывалилась ошибка.

"The transaction log for database 'tempdb' is full due to 'ACTIVE_TRANSACTION'."

Похоже не хватила места на диске.

Можно ли этот запрос выполнять порциями?
14 май 19, 09:03    [21884040]     Ответить | Цитировать Сообщить модератору
 Re: Как быстрее всего перенумеровать колонку в таблице из 70 млн строк?  [new]
iap
Member

Откуда: Москва
Сообщений: 46689
leonix
Колонку не удалось добавить. Система ругается что колонки нельзя создавать.
Сначала разберитесь с этим. Это полный абсурд (или у вас вообще мало прав доступа?).
Раз такое дело, оформляйте вопрос как положено (напишите здесь CREATE TABLE, создание связанных с таблицей объектов - индексов, триггеров, констрейнтов, сообщите версию сервера и т.д.).
Частями можно, но надо обеспечить, чтобы каждая следующая часть не содержала уже обработанные записи.
14 май 19, 10:06    [21884088]     Ответить | Цитировать Сообщить модератору
 Re: Как быстрее всего перенумеровать колонку в таблице из 70 млн строк?  [new]
a_voronin
Member

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

А давайте зададимся более базовым вопросом, а зачем такая нумерация?

И если вы хотите переименовать, то вам сложно сделать следующее?
1) Добавить новую колонку INT NULL
2) Порционно обновлять по TOP = 100000 за раз
14 май 19, 15:38    [21884555]     Ответить | Цитировать Сообщить модератору
 Re: Как быстрее всего перенумеровать колонку в таблице из 70 млн строк?  [new]
Danion
Member

Откуда: Москва
Сообщений: 113
"The transaction log for database 'tempdb' is full due to 'ACTIVE_TRANSACTION'."

Подобное сообщение появляется при нехватке места лог файла базы tempdb. Так что да - либо закончилось место на диске, либо ограничен прирост файла и место в файле закончилось.

Нужно либо разбивать на части, либо увеличивать диск\убирать ограничение автопроста.
14 май 19, 16:30    [21884595]     Ответить | Цитировать Сообщить модератору
 Re: Как быстрее всего перенумеровать колонку в таблице из 70 млн строк?  [new]
leonix
Member

Откуда:
Сообщений: 370
Всем спасибо.
Переосмыслил немного задачу. Переделал по другому.

WITH T AS (
SELECT N=ROW_NUMBER() OVER(partition BY _fld223 ORDER BY _fld251),* 
FROM [dbo].[_InfoRg222] 
where SUBSTRING(_fld223,1,1)='0' )
UPDATE T SET _fld224=N;


_fld223 - гуид, там может быть 16 вариантов символов 0-f. Получается 16 примерно одинаковых порций по 4.5 млн.
Сейчас первая порция обрабатывается 3 часа.
14 май 19, 16:43    [21884605]     Ответить | Цитировать Сообщить модератору
 Re: Как быстрее всего перенумеровать колонку в таблице из 70 млн строк?  [new]
iap
Member

Откуда: Москва
Сообщений: 46689
leonix
Всем спасибо.
Переосмыслил немного задачу. Переделал по другому.

WITH T AS (
SELECT N=ROW_NUMBER() OVER(partition BY _fld223 ORDER BY _fld251),* 
FROM [dbo].[_InfoRg222] 
where SUBSTRING(_fld223,1,1)='0' )
UPDATE T SET _fld224=N;



_fld223 - гуид, там может быть 16 вариантов символов 0-f. Получается 16 примерно одинаковых порций по 4.5 млн.
Сейчас первая порция обрабатывается 3 часа.
Кстати, не зацикливайтесь на том, что я там предложил.
Почитайте здешний FAQ по этому вопросу (такая тема там есть).
14 май 19, 19:11    [21884735]     Ответить | Цитировать Сообщить модератору
 Re: Как быстрее всего перенумеровать колонку в таблице из 70 млн строк?  [new]
PizzaPizza
Member

Откуда:
Сообщений: 222
leonix,

Может быть быстрее будет так:

создаёте новую таблицу копию существующей.
делаете insert select в нее с новой идентити.
профит.
15 май 19, 03:26    [21884885]     Ответить | Цитировать Сообщить модератору
 Re: Как быстрее всего перенумеровать колонку в таблице из 70 млн строк?  [new]
leonix
Member

Откуда:
Сообщений: 370
(4335883 rows affected)

Первая порция отработала за 13 часов.
Осталось 15 порция.
Годится.
Это разовая операция.
15 май 19, 08:34    [21884935]     Ответить | Цитировать Сообщить модератору
 Re: Как быстрее всего перенумеровать колонку в таблице из 70 млн строк?  [new]
Kopelly
Member

Откуда: Красноярск
Сообщений: 278
leonix,
исправь пока не поздно, а то не видать тебе нормальной нумерации:
WITH T AS (
SELECT N=ROW_NUMBER() OVER(ORDER BY _fld223),* 
FROM [dbo].[_InfoRg222] )
UPDATE T SET _fld224=N
where SUBSTRING(_fld223,1,1)='0';
15 май 19, 09:31    [21884972]     Ответить | Цитировать Сообщить модератору
 Re: Как быстрее всего перенумеровать колонку в таблице из 70 млн строк?  [new]
iap
Member

Откуда: Москва
Сообщений: 46689
Kopelly
leonix,
исправь пока не поздно, а то не видать тебе нормальной нумерации:
WITH T AS (
SELECT N=ROW_NUMBER() OVER(ORDER BY _fld223),* 
FROM [dbo].[_InfoRg222] )
UPDATE T SET _fld224=N
where SUBSTRING(_fld223,1,1)='0';
Этого недостаточно.
Ведь так следующая порция опять пронумеруется с 1.
Надо прибавить к количеству уже пронумерованных записей.
15 май 19, 09:33    [21884976]     Ответить | Цитировать Сообщить модератору
 Re: Как быстрее всего перенумеровать колонку в таблице из 70 млн строк?  [new]
iap
Member

Откуда: Москва
Сообщений: 46689
iap
Kopelly
leonix,
исправь пока не поздно, а то не видать тебе нормальной нумерации:
WITH T AS (
SELECT N=ROW_NUMBER() OVER(ORDER BY _fld223),* 
FROM [dbo].[_InfoRg222] )
UPDATE T SET _fld224=N
where SUBSTRING(_fld223,1,1)='0';

Этого недостаточно.
Ведь так следующая порция опять пронумеруется с 1.
Надо прибавить к количеству уже пронумерованных записей.
Или каждый раз определять максимальный номер
15 май 19, 09:34    [21884979]     Ответить | Цитировать Сообщить модератору
 Re: Как быстрее всего перенумеровать колонку в таблице из 70 млн строк?  [new]
Kopelly
Member

Откуда: Красноярск
Сообщений: 278
iap
Этого недостаточно.
Ведь так следующая порция опять пронумеруется с 1.
Надо прибавить к количеству уже пронумерованных записей.

Уверен? По идее пронумеровываются все строки, а обновляются только по условию.
15 май 19, 09:40    [21884985]     Ответить | Цитировать Сообщить модератору
 Re: Как быстрее всего перенумеровать колонку в таблице из 70 млн строк?  [new]
leonix
Member

Откуда:
Сообщений: 370
Я же писал что переосмыслил задачу.
Сначала хотел сквозную нумерацию.
Сейчас решил что в рамках поля _fld223.
Короче это таблица с историей изменений объектов.
_fld223 это гуид объекта.
_fld224 номер версии.
_fld251 дата изменения.
15 май 19, 09:45    [21884991]     Ответить | Цитировать Сообщить модератору
 Re: Как быстрее всего перенумеровать колонку в таблице из 70 млн строк?  [new]
iap
Member

Откуда: Москва
Сообщений: 46689
Kopelly
iap
Этого недостаточно.
Ведь так следующая порция опять пронумеруется с 1.
Надо прибавить к количеству уже пронумерованных записей.

Уверен? По идее пронумеровываются все строки, а обновляются только по условию.
Возможно, я тут был неправ.
Но тогда как раз надо сделать, чтобы нумеровались только оставшиеся записи.
Это должно улучшить производительность.
15 май 19, 09:50    [21884993]     Ответить | Цитировать Сообщить модератору
 Re: Как быстрее всего перенумеровать колонку в таблице из 70 млн строк?  [new]
Посетитель
Member

Откуда:
Сообщений: 1189
leonix
Сейчас решил что в рамках поля _fld223.


тогда должно быть
(PARTITION BY _fld223 order by _fld251)
15 май 19, 09:54    [21884996]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить