Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2 3   вперед  Ctrl      все
 Увеличить размер поля (строка)  [new]
CoolMind
Member [заблокирован]

Откуда: Вологда
Сообщений: 4122
Хотя этот вопрос часто возникает на форуме, спрошу ещё раз для верности.
MS SQL 2000.
Необходимо в работающей базе, в таблице из нескольких сот тысяч записей увеличить размер поля. Таблица, естественно, связана с другими, так что возможны ошибки во время этой операции.
Если делать через EM, нажать "Design Table", то выходит такое сообщение:
"Saving Definition Changes to tables with large amounts of data could take a considerable amount of time. While changes are being saved, table data will not be accessible.
Do you want to continue?
Да Нет".
Мне необходимо увеличить размер поля типа varchar ещё на тысячу символов.
Прочитал, что удобнее выполнять через Alter Table.
Вопросы: как именно выглядит операция? В какое время лучше выполнять? Сколько времени она займёт?
14 сен 11, 08:25    [11273113]     Ответить | Цитировать Сообщить модератору
 Re: Увеличить размер поля (строка)  [new]
Glory
Member

Откуда:
Сообщений: 104760
CoolMind
Прочитал, что удобнее выполнять через Alter Table.
Вопросы: как именно выглядит операция? В какое время лучше выполнять? Сколько времени она займёт?

- как команда Alter Table с нужным синтаксисом
- когда таблица не используется другими
- зависит от многих факторов, как то размер таблицы, производительность дисковой системы
Для типа varchar не должно быть много, ведь фактического увеличения размера поля не происходит
14 сен 11, 08:30    [11273124]     Ответить | Цитировать Сообщить модератору
 Re: Увеличить размер поля (строка)  [new]
CoolMind
Member [заблокирован]

Откуда: Вологда
Сообщений: 4122
Glory, вот так?
ALTER TABLE tbl
ALTER COLUMN cln VARCHAR(5000)

Думаю, если таблица не должна использоваться, то запустить можно только ночью. Значит, придётся ставить задание. В этом случае не удастся отследить возникающие по ходу сообщения. Есть ли там какие-то подводные камни (нарушение целостности данных, проверка на Null, связи в таблицах, констрейнты, триггеры), которые могут не дать выполнить скрипт?
14 сен 11, 08:40    [11273148]     Ответить | Цитировать Сообщить модератору
 Re: Увеличить размер поля (строка)  [new]
Программист-Любитель
Member

Откуда:
Сообщений: 16839
CoolMind
В этом случае не удастся отследить возникающие по ходу сообщения.
Джоб добросовестно пишет в лог.
14 сен 11, 09:14    [11273252]     Ответить | Цитировать Сообщить модератору
 Re: Увеличить размер поля (строка)  [new]
studieren
Member

Откуда: Tashkent, Uzbekistan
Сообщений: 2845
CoolMind
Glory, вот так?
ALTER TABLE tbl
ALTER COLUMN cln VARCHAR(5000)

Думаю, если таблица не должна использоваться, то запустить можно только ночью. Значит, придётся ставить задание. В этом случае не удастся отследить возникающие по ходу сообщения. Есть ли там какие-то подводные камни (нарушение целостности данных, проверка на Null, связи в таблицах, констрейнты, триггеры), которые могут не дать выполнить скрипт?


Если не ошибаюсь, то увеличить поля таблицы нельзя!!! Когда в SQL Server Management Studio (SSMS) меняем (расширяем или наоборот уменьшаем) размер поля, то сервер пересоздаёт таблицу. Т.е. совершит следующие действия:
- удалит все объекты связанные с таблицей такие как "Check constraint", связи и прочие;
- создаст новую таблицу с приставкой "Tmp" с аналогичной схемой, но только с увеличенным размером изменяемого поля;
- все данные "попробует" впихать в новую таблицу;
- если все нормально прошло, то удалит старую таблицу
- переименует новую таблицу убрав приставку "Tmp"
- восстановит все объекты: "Check constraint", связь, триггер и т.д.

Вообщем-то всё произойдёт очень быстро, так что пользователи не заметят. :)
Единственный пункт, когда сервер может зависнуть, это когда из старой таблицы данные качуют в новую. Но т.к. там нету в этот момент "Check constraint", связь, триггер, в принципе и этот процесс не происходит слишком долго. :)
Единственное когда же пользователи могут "почувствовать", это когда удаляется старая таблица и переименовывается новая. Вот здесь проблема может возникнуть. Но это как правило не долго.
14 сен 11, 11:32    [11274048]     Ответить | Цитировать Сообщить модератору
 Re: Увеличить размер поля (строка)  [new]
invm
Member

Откуда: Москва
Сообщений: 9345
studieren
Если не ошибаюсь, то увеличить поля таблицы нельзя!!!
Ошибаетесь.
14 сен 11, 11:42    [11274137]     Ответить | Цитировать Сообщить модератору
 Re: Увеличить размер поля (строка)  [new]
Shakill
Member

Откуда: мск
Сообщений: 1880
studieren,

create table #t (a varchar(10))
alter table #t alter column a varchar(100)
14 сен 11, 11:44    [11274154]     Ответить | Цитировать Сообщить модератору
 Re: Увеличить размер поля (строка)  [new]
CoolMind
Member [заблокирован]

Откуда: Вологда
Сообщений: 4122
Спасибо участникам за подсказки.
Я думаю, может быть, в течение рабочего дня можно попытаться создать клон поля с увеличенным размером, скопировать туда данные, удалить прежнее поле, переименовать данные? Если связей этого строкового поля с другими таблицами нет, то всё должно пройти гладко, или всё равно, лучше ночью?
14 сен 11, 12:21    [11274548]     Ответить | Цитировать Сообщить модератору
 Re: Увеличить размер поля (строка)  [new]
CoolMind
Member [заблокирован]

Откуда: Вологда
Сообщений: 4122
*переименовать поле*
14 сен 11, 12:22    [11274553]     Ответить | Цитировать Сообщить модератору
 Re: Увеличить размер поля (строка)  [new]
SamMan
Member

Откуда: Moscow
Сообщений: 759
CoolMind
Я думаю, может быть, в течение рабочего дня можно попытаться создать клон поля с увеличенным размером


Смысл клона? Какую цель преследует его создание?
14 сен 11, 12:36    [11274640]     Ответить | Цитировать Сообщить модератору
 Re: Увеличить размер поля (строка)  [new]
CoolMind
Member [заблокирован]

Откуда: Вологда
Сообщений: 4122
SamMan, в принципе, да, смысла нет, проще увеличить размер, чем создать клона и удалить прежний столбец.
14 сен 11, 13:21    [11275027]     Ответить | Цитировать Сообщить модератору
 Re: Увеличить размер поля (строка)  [new]
iljy
Member

Откуда:
Сообщений: 8711
CoolMind
SamMan, в принципе, да, смысла нет, проще увеличить размер, чем создать клона и удалить прежний столбец.

Конечно проще. Вам же сказали - увеличение размера поля переменной длинны никаких модификаций данных не потребует, перепишатся только инфа в метаданных. Да, это потребует эксклюзивной блокировки, но на микросекунды, так что думаю даже в рабочее время это врядли кто заметит.
14 сен 11, 13:33    [11275184]     Ответить | Цитировать Сообщить модератору
 Re: Увеличить размер поля (строка)  [new]
CoolMind
Member [заблокирован]

Откуда: Вологда
Сообщений: 4122
iljy, это придаёт оптимизма. Даже на почти миллионе записей? Хорошо, вечером попробую.
14 сен 11, 13:36    [11275210]     Ответить | Цитировать Сообщить модератору
 Re: Увеличить размер поля (строка)  [new]
alter column
Guest
CoolMind
iljy, это придаёт оптимизма. Даже на почти миллионе записей? Хорошо, вечером попробую.

главное, чтобы на это поле не были "завязаны" другие объекты, индесы, FK....
14 сен 11, 13:40    [11275245]     Ответить | Цитировать Сообщить модератору
 Re: Увеличить размер поля (строка)  [new]
iljy
Member

Откуда:
Сообщений: 8711
CoolMind
iljy, это придаёт оптимизма. Даже на почти миллионе записей? Хорошо, вечером попробую.

Пробуйте. Создайте данные:
use tempdb
create table ttt(s varchar(200))

insert ttt
select top 1000000 replicate('ABCDEFGHIJ', ROW_NUMBER() over(order by (select 1))%20)
from master..spt_values t1,master..spt_values t2,master..spt_values t3
Потом так:
begin tran
alter table ttt alter column s varchar(300)
И в другой сессии exec sp_lock
14 сен 11, 13:47    [11275320]     Ответить | Цитировать Сообщить модератору
 Re: Увеличить размер поля (строка)  [new]
iljy
Member

Откуда:
Сообщений: 8711
alter column
CoolMind
iljy, это придаёт оптимизма. Даже на почти миллионе записей? Хорошо, вечером попробую.

главное, чтобы на это поле не были "завязаны" другие объекты, индесы, FK....

Индексы и всякие другие объекты не помешают, а вот ВК - это да.
14 сен 11, 13:57    [11275394]     Ответить | Цитировать Сообщить модератору
 Re: Увеличить размер поля (строка)  [new]
Shakill
Member

Откуда: мск
Сообщений: 1880
iljy, fk на поле varchar(5000) - это несколько странно, врядли такое кто-то по доброй воле будет делать
14 сен 11, 14:03    [11275442]     Ответить | Цитировать Сообщить модератору
 Re: Увеличить размер поля (строка)  [new]
iljy
Member

Откуда:
Сообщений: 8711
Shakill
iljy, fk на поле varchar(5000) - это несколько странно, врядли такое кто-то по доброй воле будет делать

А этого и не предлагал
14 сен 11, 14:07    [11275467]     Ответить | Цитировать Сообщить модератору
 Re: Увеличить размер поля (строка)  [new]
CoolMind
Member [заблокирован]

Откуда: Вологда
Сообщений: 4122
iljy, интересный скриптик. Кое-что мне непонятно, но позже попробую, спасибо. Поглядел в свойства, индексов по этому полю нет, ВК тоже.
14 сен 11, 14:21    [11275589]     Ответить | Цитировать Сообщить модератору
 Re: Увеличить размер поля (строка)  [new]
iap
Member

Откуда: Москва
Сообщений: 46977
Shakill
iljy, fk на поле varchar(5000) - это несколько странно, врядли такое кто-то по доброй воле будет делать
Это и невозможно: индекс для PK, как и любой другой, не может превышать 900 байт
14 сен 11, 14:22    [11275597]     Ответить | Цитировать Сообщить модератору
 Re: Увеличить размер поля (строка)  [new]
varchar(5000)
Guest
iap
Shakill
iljy, fk на поле varchar(5000) - это несколько странно, врядли такое кто-то по доброй воле будет делать
Это и невозможно: индекс для PK, как и любой другой, не может превышать 900 байт

[занудо]
create table #t(a varchar(5000) not null)
create index a on #t(a)

insert #t(a) 
select '1'
[/занудо]
14 сен 11, 14:24    [11275610]     Ответить | Цитировать Сообщить модератору
 Re: Увеличить размер поля (строка)  [new]
alter column
Guest
iljy
alter column
пропущено...

главное, чтобы на это поле не были "завязаны" другие объекты, индесы, FK....

Индексы и всякие другие объекты не помешают, а вот ВК - это да.

да, действительно, при увеличении размера varchar не влияют, в отличии от, например null -> not null

create table #t(a varchar(5000) null)
create index a on #t(a)

alter table #t alter column a varchar(5000) not null
14 сен 11, 14:27    [11275638]     Ответить | Цитировать Сообщить модератору
 Re: Увеличить размер поля (строка)  [new]
iap
Member

Откуда: Москва
Сообщений: 46977
varchar(5000)
iap
пропущено...
Это и невозможно: индекс для PK, как и любой другой, не может превышать 900 байт

[занудо]
create table #t(a varchar(5000) not null)
create index a on #t(a)

insert #t(a) 
select '1'
[/занудо]
У меня выдаёт это:
Microsoft SQL Server 2008 (SP2) - 10.0.4000.0 (X64)
Warning! The maximum key length is 900 bytes. The index 'a' has maximum length of 5000 bytes.
For some combination of large values, the insert/update operation will fail.
Да, это лишь предупреждение.
Но оно означает, что более 900 байт туда не вставишь.
14 сен 11, 14:41    [11275792]     Ответить | Цитировать Сообщить модератору
 Re: Увеличить размер поля (строка)  [new]
iap
Member

Откуда: Москва
Сообщений: 46977
varchar(5000),

попробуйте:
create table #t(a varchar(5000) not null)
create index a on #t(a)

insert #t(a) 
select REPLICATE('1',900)

insert #t(a) 
select REPLICATE('1',901)
14 сен 11, 14:42    [11275810]     Ответить | Цитировать Сообщить модератору
 Re: Увеличить размер поля (строка)  [new]
Shakill
Member

Откуда: мск
Сообщений: 1880
iap
У меня выдаёт это:
Microsoft SQL Server 2008 (SP2) - 10.0.4000.0 (X64)
Warning! The maximum key length is 900 bytes. The index 'a' has maximum length of 5000 bytes.
For some combination of large values, the insert/update operation will fail.
Да, это лишь предупреждение.
Но оно означает, что более 900 байт туда не вставишь.

но индекс-то на поле varchar(5000) создан другое дело, что толку мало
14 сен 11, 14:45    [11275840]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2 3   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить