powered by simpleCommunicator - 2.0.52     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Почему файл БД вырос после alter column
25 сообщений из 53, страница 1 из 3
Почему файл БД вырос после alter column
    #40033486
RegisteredUser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
почему так получилось:

- почистил немного данные в БД, а в одной из таблиц еще решил уменьшить длину поля ReqJson (было varchar 8000)
Выполнил
Код: sql
1.
alter table [dbo].[Monitoring_Arch] alter column [ReqJson ] varchar(6000)



До начала операции на диске было свободно более 65Гб.
я наблюдал за ростом файла БД и лога пока длилась операция
Операция прошла успешно, лог урезался, а вот файл БД на диске так и остался большим (свободное место сейчас чуть более 47Гб).
Почему так? И что можно сделать, чтобы освободить место на диске?
...
Рейтинг: 0 / 0
Почему файл БД вырос после alter column
    #40033493
godsql
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
RegisteredUser,

Шринк?
Лучше смотрите не место на диске, а свойства базы данных.
...
Рейтинг: 0 / 0
Почему файл БД вырос после alter column
    #40033499
RegisteredUser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
godsql
RegisteredUser,

Шринк?
Лучше смотрите не место на диске, а свойства базы данных.


лог урезался как раз после DBCC SHRINKDATABASE ([JMProd]);
а вот mdf остался большим
...
Рейтинг: 0 / 0
Почему файл БД вырос после alter column
    #40033502
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RegisteredUser,

А почему должна была уменьшиться база? varchar указывает на максимально допустимый размер, который может быть выделен при сохранении строки. Очевидно, Вы путаете с char типом.
...
Рейтинг: 0 / 0
Почему файл БД вырос после alter column
    #40033504
RegisteredUser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
проблема локализовна:
- созданы доп. файлы tempdb

что с ними делать?
...
Рейтинг: 0 / 0
Почему файл БД вырос после alter column
    #40033512
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RegisteredUser,

Это правильно, количество файлов должно зависеть от количества ядер.
...
Рейтинг: 0 / 0
Почему файл БД вырос после alter column
    #40033514
RegisteredUser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Владислав Колосов,

тогда вопрос остается открытым - данных стало меньше, а размер БД вырос гиг на 15 после alter column
...
Рейтинг: 0 / 0
Почему файл БД вырос после alter column
    #40033543
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RegisteredUser
Владислав Колосов,

тогда вопрос остается открытым - данных стало меньше, а размер БД вырос гиг на 15 после alter column


Ты, наверное, думаешь, что трансформация таблицы производится сферическим святым духом в вакууме?
Наивняк.
Был создан новый столбец в таблице, скопированы туда данные, а затем старый столбец удален.
Вот тебе, бабушка, и 15 Гб.
А тот чего бы сервер жужжал диском столько долго...
...
Рейтинг: 0 / 0
Почему файл БД вырос после alter column
    #40033552
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RegisteredUser
файл БД на диске так и остался большим

RegisteredUser
размер БД вырос гиг на 15 после alter column
Файл БД остался прежним, или вырос?
aleks222
Был создан новый столбец в таблице, скопированы туда данные, а затем старый столбец удален.
Да, это при добавлении столбца null командой alter?
Там же только метаданные меняются.
...
Рейтинг: 0 / 0
Почему файл БД вырос после alter column
    #40033554
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexeyvg

Там же только метаданные меняются.

За чем же тогда "наблюдал" страдалец?
Создание пустого столбца "не понаблюдаешь".
...
Рейтинг: 0 / 0
Почему файл БД вырос после alter column
    #40033563
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RegisteredUser
Почему так? И что можно сделать, чтобы освободить место на диске?
Потому что создается новый столбец и в него копируются данные из старого. Старый будет физически удален только перестроением таблицы.
Код: 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.
use tempdb;
set ansi_nulls, quoted_identifier, xact_abort on;
go

create table dbo.t (id int identity primary key, s varchar(8000));
insert into dbo.t
 (s)
 select top (10000)
  replicate('a', 5000)
 from
  master.dbo.spt_values a cross join
  master.dbo.spt_values b
go

select
 c.name, pc.max_length
from
 sys.system_internals_partition_columns pc join
 sys.partitions p on p.partition_id = pc.partition_id left join
 sys.columns c on column_id = pc.partition_column_id and c.object_id = p.object_id
where
 p.object_id = object_id('dbo.t', 'U')
order by
 pc.partition_column_id;

exec sp_spaceused 'dbo.t', 'true';
go

alter table dbo.t alter column s varchar(6000);
go

select
 c.name, pc.max_length
from
 sys.system_internals_partition_columns pc join
 sys.partitions p on p.partition_id = pc.partition_id left join
 sys.columns c on column_id = pc.partition_column_id and c.object_id = p.object_id
where
 p.object_id = object_id('dbo.t', 'U')
order by
 pc.partition_column_id;

exec sp_spaceused 'dbo.t', 'true';
go

alter table dbo.t rebuild;
go

select
 c.name, pc.max_length
from
 sys.system_internals_partition_columns pc join
 sys.partitions p on p.partition_id = pc.partition_id left join
 sys.columns c on column_id = pc.partition_column_id and c.object_id = p.object_id
where
 p.object_id = object_id('dbo.t', 'U')
order by
 pc.partition_column_id;

exec sp_spaceused 'dbo.t', 'true';
go

drop table dbo.t;
go

...
Рейтинг: 0 / 0
Почему файл БД вырос после alter column
    #40033578
uaggster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А что делать - так страдальцу и не сказали!

Код: sql
1.
alter table [dbo].[Monitoring_Arch] Rebuild


спасет отца русской демократии!

ЗЫ: Размер поменял зря. Ни пользы от этого, ни удовольствия.
Размер varchar должен быть примерно в 2 раза больше средней длины хранящихся в поле данных, при этом, разумеется, не меньше максимально возможного размера данных, которые там предстоит хранить.
...
Рейтинг: 0 / 0
Почему файл БД вырос после alter column
    #40033585
Фотография ptr128
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
uaggster,

так как подобные поля очень редко нуждаются в индексации, то я предпочитаю сразу делать их [n]varchar(max). Как плюс, места в кортежах они почти не занимают (24 байта на каждое) и обслуживание таблиц ускоряется. Как минус, нужно помнить о лимите в 8060 байт для сортировки.
...
Рейтинг: 0 / 0
Почему файл БД вырос после alter column
    #40033600
Фотография Yasha123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ptr128
uaggster,

так как подобные поля очень редко нуждаются в индексации, то я предпочитаю сразу делать их [n]varchar(max). Как плюс, места в кортежах они почти не занимают (24 байта на каждое) и обслуживание таблиц ускоряется. Как минус, нужно помнить о лимите в 8060 байт для сортировки.

лажа это, прости господи.
если значение поля влазит в инроу, то там и будет размещено.
так что если значения по длине не превышают 6000 символов,
как ни объявляй, varchar(6000) или varchar(max), покуда длина строки не превысит 8060,
размещение будет одинаковым.
и уж ни о каком ускорении речи не идет вовсе.
...
Рейтинг: 0 / 0
Почему файл БД вырос после alter column
    #40033601
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ptr128
так как подобные поля очень редко нуждаются в индексации, то я предпочитаю сразу делать их [n]varchar(max). Как плюс, места в кортежах они почти не занимают (24 байта на каждое) и обслуживание таблиц ускоряется.
1. По умолчанию типы *(max) все равно хранятся in-row, если это возможно.
2.
Код: 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.
use master;
set ansi_nulls, quoted_identifier, xact_abort on;
go

create database DBTest001;
alter database DBTest001 set recovery full;
backup database DBTest001 to disk = 'nul:';
go

use DBTest001;
go

create table dbo.t1 (id int identity primary key, s varchar(1000));
create table dbo.t2 (id int identity primary key, s varchar(max));
create table dbo.t3 (id int identity primary key, s varchar(max));

exec sp_tableoption 'dbo.t3', 'large value types out of row', 1;
go

set statistics time on;
go

insert into dbo.t1
 (s)
 select top (100000)
  replicate('a', 1000)
 from
  master.dbo.spt_values a cross join
  master.dbo.spt_values b;

insert into dbo.t2
 (s)
 select top (100000)
  replicate('a', 1000)
 from
  master.dbo.spt_values a cross join
  master.dbo.spt_values b;

insert into dbo.t3
 (s)
 select top (100000)
  replicate('a', 1000)
 from
  master.dbo.spt_values a cross join
  master.dbo.spt_values b;
go

set statistics time off;
go

use master;
alter database DBTest001 set single_user with rollback immediate;
drop database DBTest001;
go

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
 SQL Server Execution Times:
   CPU time = 422 ms,  elapsed time = 947 ms.

 SQL Server Execution Times:
   CPU time = 515 ms,  elapsed time = 961 ms.

 SQL Server Execution Times:
   CPU time = 5547 ms,  elapsed time = 6264 ms.
...
Рейтинг: 0 / 0
Почему файл БД вырос после alter column
    #40033605
Фотография ptr128
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Yasha123

лажа это, прости господи.
если значение поля влазит в инроу, то там и будет размещено.


Если чего-то не знаете, то из этого не следует, что этого нет )))
invm

create table dbo.t3 (id int identity primary key, s varchar(max));
exec sp_tableoption 'dbo.t3', 'large value types out of row', 1;
...
Рейтинг: 0 / 0
Почему файл БД вырос после alter column
    #40033606
Фотография ptr128
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
invm,

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


Код: 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.
use master;
set ansi_nulls, quoted_identifier, xact_abort on;
go

create database DBTest001;
alter database DBTest001 set recovery full;
backup database DBTest001 to disk = 'nul:';
go

use DBTest001;
go

create table dbo.t1 (id int identity primary key, s varchar(1000));
create table dbo.t2 (id int identity primary key, s varchar(max));
create table dbo.t3 (id int identity primary key, s varchar(max));

exec sp_tableoption 'dbo.t3', 'large value types out of row', 1;
go

set statistics time on;
set statistics io on;
go

insert into dbo.t1
 (s)
 select top (100000)
  replicate('a', 1000)
 from
  master.dbo.spt_values a cross join
  master.dbo.spt_values b;

insert into dbo.t2
 (s)
 select top (100000)
  replicate('a', 1000)
 from
  master.dbo.spt_values a cross join
  master.dbo.spt_values b;

insert into dbo.t3
 (s)
 select top (100000)
  replicate('a', 1000)
 from
  master.dbo.spt_values a cross join
  master.dbo.spt_values b;
go

SELECT SUM(id) FROM t1 WHERE id BETWEEN 1000 AND 10000
SELECT SUM(id) FROM t2 WHERE id BETWEEN 1000 AND 10000
SELECT SUM(id) FROM t3 WHERE id BETWEEN 1000 AND 10000

set statistics time off;
set statistics io off;
go

use master;
alter database DBTest001 set single_user with rollback immediate;
drop database DBTest001;
go



...

(1 row affected)
Table 't1'. Scan count 1, logical reads 1295, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.

SQL Server Execution Times:
CPU time = 0 ms, elapsed time = 2 ms.
SQL Server parse and compile time:
CPU time = 0 ms, elapsed time = 0 ms.

(1 row affected)
Table 't2'. Scan count 1, logical reads 1295, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.

SQL Server Execution Times:
CPU time = 0 ms, elapsed time = 2 ms.
SQL Server parse and compile time:
CPU time = 0 ms, elapsed time = 0 ms.

(1 row affected)
Table 't3'. Scan count 1, logical reads 39, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.

SQL Server Execution Times:
CPU time = 0 ms, elapsed time = 1 ms.
...
Рейтинг: 0 / 0
Почему файл БД вырос после alter column
    #40033607
Фотография Yasha123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ptr128
Yasha123

лажа это, прости господи.
если значение поля влазит в инроу, то там и будет размещено.


Если чего-то не знаете, то из этого не следует, что этого нет )))
invm

create table dbo.t3 (id int identity primary key, s varchar(max));
exec sp_tableoption 'dbo.t3', 'large value types out of row', 1;

чего уж так извращаться-то, объявляйте сразу text.
а лучше и вовсе на 2000-ый переходите,
ваша логика его достойна.
кстати, что там про ускорение-то?
жду тест, когда благодаря вашему извращению хоть что-то ускорится
(что замедлится как вставка, так и выборка, я вам на раз продемонстрирую)
...
Рейтинг: 0 / 0
Почему файл БД вырос после alter column
    #40033608
Фотография ptr128
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Yasha123,

откройте спойлер выше. На примере от invm - в два раза!
...
Рейтинг: 0 / 0
Почему файл БД вырос после alter column
    #40033609
Фотография Yasha123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
о, да это песня,
мало того, что в приведенном тесте вообще читаются только инроу-страницы,
так товарищ еще и не в курсе, что читать лобы будет куда дольше.
...
Рейтинг: 0 / 0
Почему файл БД вырос после alter column
    #40033610
Фотография ptr128
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Yasha123,

я отлично знаю, что чтение out-of-row будет медленней. Но когда на практике в 90% запросов они не читаются, так как содежат всяческие комментарии для пользователей или тому подобный текст, но зато тормозят обработку данных и обслуживание индексов, я выбираю out-of-row.
...
Рейтинг: 0 / 0
Почему файл БД вырос после alter column
    #40033611
Фотография Yasha123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ptr128
Yasha123,

откройте спойлер выше. На примере от invm - в два раза!

дарагуля, в спойлере выше все строки есть инроу (lob logical reads 0)
расхотелось уже хранить свои максы в лобах
или пример со сменой способа хранения лобов только мне показал,
а себе применить забыл?
...
Рейтинг: 0 / 0
Почему файл БД вырос после alter column
    #40033613
Фотография ptr128
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Yasha123,

читать научитесь. Полезно будет )))

exec sp_tableoption 'dbo.t3', 'large value types out of row', 1
...
Table 't1'. Scan count 1, logical reads 1295 , physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 't2'. Scan count 1, logical reads 1295 , physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 't3'. Scan count 1, logical reads 39 , physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.

Просто на практике у меня выборки в хранимых процедурах в 90% out-of-row не используют )))
...
Рейтинг: 0 / 0
Почему файл БД вырос после alter column
    #40033615
Фотография Yasha123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ptr128
Yasha123,

читать научитесь. Полезно будет )))

exec sp_tableoption 'dbo.t3', 'large value types out of row', 1
...
Table 't1'. Scan count 1, logical reads 1295 , physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 't2'. Scan count 1, logical reads 1295 , physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 't3'. Scan count 1, logical reads 39 , physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.

Просто на практике у меня выборки в хранимых процедурах в 90% out-of-row не используют )))

ну давай вместе поучимся:
авторTable 't1'. Scan count 1, logical reads 1295 , physical reads 0, read-ahead reads 0, lob logical reads 0 , lob physical reads 0, lob read-ahead reads 0.
Table 't2'. Scan count 1, logical reads 1295 , physical reads 0, read-ahead reads 0, lob logical reads 0 , lob physical reads 0, lob read-ahead reads 0.
Table 't3'. Scan count 1, logical reads 39 , physical reads 0, read-ahead reads 0, lob logical reads 0 , lob physical reads 0, lob read-ahead reads 0.
...
Рейтинг: 0 / 0
Почему файл БД вырос после alter column
    #40033616
Фотография ptr128
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Yasha123,

Лично для Вас фонт покрупнее. Может со зрением плохо?

на практике у меня выборки в хранимых процедурах в 90% out-of-row не используют

Table 't1'. Scan count 1, logical reads 1295
Table 't2'. Scan count 1, logical reads 1295
Table 't3'. Scan count 1, logical reads 39

То есть, за счет того, что в последней таблице строки были вынесены out-of-row, количество logical reads при выборке из этой таблице, в которой эти строки не участвуют, сократилось в 33 раза!
...
Рейтинг: 0 / 0
25 сообщений из 53, страница 1 из 3
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Почему файл БД вырос после alter column
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]