Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2 3   вперед  Ctrl      все
 Вопрос про NULL в обновляемом datetime поле  [new]
Веселый Молочник
Guest
Требуется совет от бывалых оптимизаторов.
В большой таблице есть неиндексируемое поле типа datetime. При добавлении записи там ничего нет. Но в процессе работы программы туда обязательно будет занесена текущая дата и время события.
Вопрос: как лучше поступить при добавлении записи в эту таблицу?
1. Оставить в этом поле NULL.
2. Вписать в это поле заведомо раннюю дату, к примеру '19000101' , чтобы избежать расширения записи и последующих сплитов страниц при обновлении этого поля?
5 сен 14, 09:44    [16538299]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос про NULL в обновляемом datetime поле  [new]
pegoopik
Member

Откуда: Новосибирск
Сообщений: 54
Веселый Молочник
2. Вписать в это поле заведомо раннюю дату, к примеру '19000101' , чтобы избежать расширения записи и последующих сплитов страниц при обновлении этого поля?


Можно. Но только надо помнить, что вам потом с этими данными надо будет работать.
По производительности большой разницы нет.
5 сен 14, 09:55    [16538349]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос про NULL в обновляемом datetime поле  [new]
msLex
Member

Откуда:
Сообщений: 9280
Веселый Молочник
чтобы избежать расширения записи и последующих сплитов страниц при обновлении этого поля

Null значение в полях фиксированной длинны занимает столько же места, сколько и любые другие данные.
5 сен 14, 09:58    [16538363]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос про NULL в обновляемом datetime поле  [new]
Веселый Молочник
Guest
pegoopik,

Это-то понятно. Меня интересует целесообразность такого подхода. Вообще кто-то пользуется этим или потери от сплитов такие несущественные, что можно не париться?
5 сен 14, 10:00    [16538376]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос про NULL в обновляемом datetime поле  [new]
Glory
Member

Откуда:
Сообщений: 104751
Веселый Молочник
Это-то понятно. Меня интересует целесообразность такого подхода.

Какая целесообразность, если и NULL и '19000101' будут занимать одинаковое число байтов ?
5 сен 14, 10:02    [16538385]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос про NULL в обновляемом datetime поле  [new]
Веселый Молочник
Guest
msLex,

Спасибо! Значит NULL'у там самое место.
5 сен 14, 10:05    [16538400]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос про NULL в обновляемом datetime поле  [new]
Веселый Молочник
Guest
Glory,

Да - да, спасибо, я уже понял. Просто опаздываю с постами.
5 сен 14, 10:06    [16538409]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос про NULL в обновляемом datetime поле  [new]
super-code
Member

Откуда:
Сообщений: 244
Во времена sql server 2000, microsoft для производительности рекомендовала по возможности объявлять поля not null со значением по умолчанию, вместо полей null, если это возможно. Как сейчас - не знаю.

С точки зрения поддержки кода, однозначно лучше вставить null. А то сложно будет кому-то догадаться, что 19000101 = пустому значению.
5 сен 14, 11:08    [16538742]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос про NULL в обновляемом datetime поле  [new]
Exproment
Member

Откуда:
Сообщений: 416
Веселый Молочник, все зависит от того, как вы это поле потом будете использовать. В DWH регулярная практика для версионности сохранять вместо null минимальное/максимальное значение datetime, дабы проще было соединятся в другими версионными таблицами по интервалу.
5 сен 14, 11:47    [16539001]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос про NULL в обновляемом datetime поле  [new]
o-o
Guest
Exproment,
да ладно, ТС интересовался в плане page split-ов: "чтобы избежать расширения записи и последующих сплитов страниц при обновлении этого поля?"
и ответ получил.
вернее, он именно что интересовался:
msLex
Null значение в полях фиксированной длинны занимает столько же места, сколько и любые другие данные.

???

если б тут была кнопочка "Marked as answered", мой клик был бы +1 к ответу msLex
5 сен 14, 12:01    [16539160]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос про NULL в обновляемом datetime поле  [new]
Веселый Молочник
Guest
o-o,
Да, все правильно говорите. Но и рассуждения Exproment тоже интересно было почитать, при том, что я ничего в них не понял.
5 сен 14, 13:11    [16539846]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос про NULL в обновляемом datetime поле  [new]
o-o
Guest
Веселый Молочник,

мне кажется, вы оба друг друга не поняли, Exproment подумал, что то поле у вас может остаться незаполненным
(невнимательно условие прочитал "туда обязательно будет занесена текущая дата"),
тогда да, удобнее, когда там лежит какая-то минимальная дата, например,
запросы писать проще, не надо рассматривать случай NULL, к-ый портит жизнь в подзапросах AND NOT (...)
5 сен 14, 13:24    [16539958]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос про NULL в обновляемом datetime поле  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8813
В базе следует хранить фактические данные, а не те, которые "удобны". "Удобство" достигается программными средствами.
Например, если дата имеет значение "неизвестно", то она должна быть NULL и никакой другой. Фальсификация и "условности" данных приводят к непредсказуемому поведению и часто крайне неприятных последствиям.
5 сен 14, 13:54    [16540222]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос про NULL в обновляемом datetime поле  [new]
Wlr-l
Member

Откуда:
Сообщений: 602
Веселый Молочник,

Что-то у Вас не так. Программа, которое заполняет поле datetime, скорее всего должна создавать строку.

По поводу null или какое-то фиксированное значение. По этому поводу очень много говорили, в т.ч. и классики.

Если нужны периоды, то можно использовать константы: "для самого начала" '19000101', а "для самого конца" - '99990101'. Все это условности, принимаемые нами. Главное в одной и той же задаче использовать одни и те же соглашения.
5 сен 14, 14:09    [16540354]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос про NULL в обновляемом datetime поле  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381
Веселый Молочник
чтобы избежать расширения записи и последующих сплитов страниц при обновлении этого поля?


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

+

set nocount on;
create table dbo.t (id int identity not null primary key clustered, c int null);
insert into dbo.t select 254 from sys.objects o1 cross join sys.objects o2
go
select count(*) from dbo.t

declare @id int;
declare @db_id int, @object_id int;
set @db_id = db_id();
set @object_id = object_id('dbo.t')

select page_count, avg_page_space_used_in_percent, min_record_size_in_bytes, max_record_size_in_bytes
from sys.dm_db_index_physical_stats(@db_id, @object_id, 1, null, 'DETAILED') where index_level = 0;

alter index all on dbo.t rebuild;

select page_count, avg_page_space_used_in_percent, min_record_size_in_bytes, max_record_size_in_bytes
from sys.dm_db_index_physical_stats(@db_id, @object_id, 1, null, 'DETAILED') where index_level = 0;

declare cur cursor local static forward_only for select top (10) percent id from dbo.t order by newid();
open cur;

fetch next from cur into @id;
while @@fetch_status = 0 begin
  update dbo.t set c = 253 where id = @id;
  fetch next from cur into @id;
end;

close cur;
deallocate cur;

select page_count, avg_page_space_used_in_percent, min_record_size_in_bytes, max_record_size_in_bytes
from sys.dm_db_index_physical_stats(@db_id, @object_id, 1, null, 'DETAILED') where index_level = 0;

select @@version;


go
drop table t



получаем
+

-----------
10404

page_count           avg_page_space_used_in_percent min_record_size_in_bytes max_record_size_in_bytes
-------------------- ------------------------------ ------------------------ ------------------------
40                   99,5935260686929               29                       29

page_count           avg_page_space_used_in_percent min_record_size_in_bytes max_record_size_in_bytes
-------------------- ------------------------------ ------------------------ ------------------------
22                   99,3013960958735               15                       15

page_count           avg_page_space_used_in_percent min_record_size_in_bytes max_record_size_in_bytes
-------------------- ------------------------------ ------------------------ ------------------------
43                   54,9807264640474               15                       29


----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Microsoft SQL Server 2014 - 12.0.2000.8 (X64) 
	Feb 20 2014 20:04:26 
	Copyright (c) Microsoft Corporation
	Express Edition (64-bit) on Windows NT 6.1 <X64> (Build 7601: Service Pack 1)

5 сен 14, 14:59    [16540676]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос про NULL в обновляемом datetime поле  [new]
o-o
Guest
daw,

у меня НЕ воспроизвелось на:

Microsoft SQL Server 2005 - 9.00.3042.00 (Intel X86) Feb 9 2007 22:47:07 Copyright (c) 1988-2005 Microsoft Corporation Express Edition on Windows NT 5.1 (Build 2600: Service Pack 3)

Microsoft SQL Server 2008 R2 (SP2) - 10.50.4000.0 (Intel X86) Jun 28 2012 08:42:37 Copyright (c) Microsoft Corporation Developer Edition on Windows NT 5.1 <X86> (Build 2600: Service Pack 3)

К сообщению приложен файл. Размер - 89Kb
5 сен 14, 15:26    [16540869]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос про NULL в обновляемом datetime поле  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381
o-o,

a ALLOW_SNAPSHOT_ISOLATION или READ_COMMITTED_SNAPSHOT на базе включены?
5 сен 14, 15:37    [16540965]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос про NULL в обновляемом datetime поле  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381
daw,

да, воспроизводится только для базы с включенным ALLOW_SNAPSHOT_ISOLATION или READ_COMMITTED_SNAPSHOT.
ага...
5 сен 14, 15:55    [16541100]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос про NULL в обновляемом datetime поле  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381
daw
daw,

да, воспроизводится только для базы с включенным ALLOW_SNAPSHOT_ISOLATION или READ_COMMITTED_SNAPSHOT.
ага...


ну, да, собственно.
http://technet.microsoft.com/en-us/library/ms175492(v=sql.105).aspx
Space Used in Data Rows
5 сен 14, 16:16    [16541263]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос про NULL в обновляемом datetime поле  [new]
o-o
Guest
да, все сошлось.
можно было и по размеру записи догадаться, что за магическое распухание на 14 байт:

Whenever a record is updated and a version is created, the new record must have a 14-byte tag appended to it. The tag holds the versioning timestamp plus the pointer to the previous version of the record.

Fragmentation from using snapshot isolation
by Paul S. Randal in SQL Server Questions Answered
5 сен 14, 16:46    [16541431]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос про NULL в обновляемом datetime поле  [new]
system1024
Member

Откуда:
Сообщений: 18
Чтобы не плодить темы, спрошу здесь.

Server 2005

Переносили базу с одного сервера на другой. Теперь проблема с датами, а именно - ни в одной строке сервер не отображает более 12 дней. Там, где должны быть даты более 12 дней в месяце, ставит NULL. Подскажите пожалуйста, где ошибка и как исправить?

К сообщению приложен файл. Размер - 52Kb
10 сен 14, 12:54    [16558753]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос про NULL в обновляемом datetime поле  [new]
msLex
Member

Откуда:
Сообщений: 9280
system1024
Переносили базу с одного сервера на другой.

Как?
10 сен 14, 12:56    [16558760]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос про NULL в обновляемом datetime поле  [new]
Glory
Member

Откуда:
Сообщений: 104751
system1024
ни в одной строке сервер не отображает более 12 дней.

Тип datetime не хранит и не отображает дни.

system1024
Там, где должны быть даты более 12 дней в месяце, ставит NULL.

Если показан NULL, то там NULL.

system1024
Подскажите пожалуйста, где ошибка и как исправить?

Ошибка уже произошла при "Переносили базу с одного сервера на другой"
10 сен 14, 12:58    [16558777]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос про NULL в обновляемом datetime поле  [new]
system1024
Member

Откуда:
Сообщений: 18
Glory
system1024
ни в одной строке сервер не отображает более 12 дней.

Тип datetime не хранит и не отображает дни.



Не совсем понял - на другой машине, на 2005 sql все даты были корретными, не было ни одного NULL, такие даты как 25.01.2013 (то есть более 12 дней) отображались.

system1024
Там, где должны быть даты более 12 дней в месяце, ставит NULL.

Если показан NULL, то там NULL.

Glory
system1024
Подскажите пожалуйста, где ошибка и как исправить?

Ошибка уже произошла при "Переносили базу с одного сервера на другой"


Почему ошибка уже в этом? Просто с одной машины на другую.
10 сен 14, 13:05    [16558819]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос про NULL в обновляемом datetime поле  [new]
system1024
Member

Откуда:
Сообщений: 18
msLex
system1024
Переносили базу с одного сервера на другой.

Как?


делал резервную копию, а на новой машине восстанавливал и указывал путь к резервной копии.
10 сен 14, 13:08    [16558832]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2 3   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить