Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
определение наличия атрибута
|
|||
|---|---|---|---|
|
#18+
народ! есть сущность, у которой может быть, а может и не быть некая связанная с ней сущность. как грамотнее поступать: хранить в таблице два поля типа hasChild bit, ChildID int или обходиться одним полем ChildID int, дозволив ему быть NULL. Второй вариант бережет место, но кажется каким-то косвенным способом определения существования потомка и потому кривым. Я прав? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.04.2002, 11:33 |
|
||
|
определение наличия атрибута
|
|||
|---|---|---|---|
|
#18+
А что, у вас child может быть только один? Судя по полю ChildID. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.04.2002, 11:52 |
|
||
|
определение наличия атрибута
|
|||
|---|---|---|---|
|
#18+
да, один. только один. либо нет оного. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.04.2002, 12:09 |
|
||
|
определение наличия атрибута
|
|||
|---|---|---|---|
|
#18+
Если оба поля по первому варианту not Null, а по второму одно из этих полей Null, а второе Not Null, то с точки зрения занимаемого записью места они совершенно равноценны. Дело в том, что под каждое поле, которое может быть Null, SQL-сервер отводит "незримое" поле - аналог bit. При установке этого бита значение поля игнорируется и считается равным Null. При сброшенном бите из "настоящего" поля считывается "настоящее" значение, которое уже считается не равным Null. Есть еще один нюанс. Все поля типа bit и все "незримые" битовые флаги для полей, которые могут быть Null упаковываются в байты. Создав поле Bit, либо установив на любом поле свойство Allow Nulls, ты увеличишь размер записи не на один бит, а на один байт. Добавив еще одно такое поле, ты не увеличишь размер записи (потому что в этом байте еще будут резервные биты). Добавляя битовые поля (либо делая существующие поля Allow Nulls), ты увеличишь размер записи на следующий байт только тогда, когда количество битов пересечет границу байта. Надеюсь, не очень путано я тут наплел. И еще. Мерять размеры записей на биты IMHO большого смысла нет. Не того масштаба продукт (если только у тебя не длинные частоколы этих битовых полей). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.04.2002, 14:06 |
|
||
|
определение наличия атрибута
|
|||
|---|---|---|---|
|
#18+
2Garya: невнятно. первый случай: create table T (id int not null, hasChild bit not null, ChildID int not null) для выяснения, есть ли у записи с зананным id потомок проверяем: if exists(select 1 from T where hasChild= 1 and id=@id) если есть, то вытягиваем его ChildID второй случай: create table T (id int not null, ChildID int null) проверка тут типа if exists(select 1 from T where ChildID is not null and id=@id) ... Вопрос: как надо? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.04.2002, 15:02 |
|
||
|
определение наличия атрибута
|
|||
|---|---|---|---|
|
#18+
Вопрос: как надо? IMHO Если вы про экономию места, то каждая запись первой таблицы будет занимать на 1 байт больше. Если вы про "косвенный а значит кривой способ определения потомка" то он мне таковым не кажется, поскольку в троичной логике NULL является равноправным значением Если вы про написание интуитивно понятных запросов, то конечно select 1 from T where hasChild = 1 and id=@id более понятен стороннему человеку, разбирающему ваш код чем select 1 from T where ChildID is not null and id=@id, хотя лично для меня, исходя опять же из той же троичной логики, не состовит большой проблемы разобраться, что выбирается в данном запросе. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2002, 06:48 |
|
||
|
определение наличия атрибута
|
|||
|---|---|---|---|
|
#18+
В первом примере: id int not null занимает 4 байта hasChild bit not null занимает 1 бит ChildID int not null занимает 4 байта ____________________________________________________ Итого 8 байт + 1 байт под хранение 1 бита = 9 байт Во втором примере id int not null занимает 4 байта ChildID int null занимает 4 байта + 1 бит под Null-значения _____________________________________________________ Итого 8 байт + 1 байт под хранение 1 бита = 9 байт IMHO, разницы никакой. Если речь идет о размере записи. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2002, 08:57 |
|
||
|
определение наличия атрибута
|
|||
|---|---|---|---|
|
#18+
2Garya Судя по фразе "If there are fixed-length columns in the table, a portion of the row, known as the null bitmap, is reserved to manage column nullability" место под null bitmap будет выделяться в обеих таблицах. Или не так ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2002, 09:07 |
|
||
|
определение наличия атрибута
|
|||
|---|---|---|---|
|
#18+
2Garya Во втором примере Если ChildID - не null, то Итого 8 байт + 1 байт под хранение 1 бита = 9 байт Если ChildID - null, то Итого 4 байт + 1 байт под хранение 1 бита = 5 байт ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2002, 14:19 |
|
||
|
определение наличия атрибута
|
|||
|---|---|---|---|
|
#18+
2 alexeyvg. Нет, не 5 байт, а 9. Потому что 4 байта даже соз значением Null все равно место занимают. Просто значение, которое в них лежит SQL-сервер игнорирует. 2 Glory. Я понял эту фразу так, что биты резервируются только под те поля, которые могут быть Null. Возможно, я ошибаюсь. Но аналогичную интерпретацию я видел в книжке (в какой точно, боюсь, с ходу не вспомню - нужно рыться искать). В той же книжке было написано, что битовые поля, определенные пользователем и "системные" битовые поля под значения Null для всех nullable полей упаковываются в единое мессиво единообразно. То есть, если имеется, к примеру, пара полей Null и тройка полей Bit not Null, они займут пять бит в одном и том же байте. Повторяю, на 100% не берусь сие утверждать - нужно сначала откопать первоисточник. Для заданных квазей двух примеров как ни крути, в любом случае выходит 9 байтов. Под вопросом может быть только, сколько битов 9-го байта задействовано - 3 или 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2002, 15:34 |
|
||
|
определение наличия атрибута
|
|||
|---|---|---|---|
|
#18+
2Garya Покопался в BOL Из явных описаний выходит, что data type fixed-length variable-length char X - varchar - X nchar X - nvarchar - - binary X - varbinary - X Т.е. логически вроде бы получается fixed-length поле - это поле, которое в каждой записи будет занимать всегда постоянное количество байтов. Но тогда опять же вроде бы получается что поле типа int, ввиду того, что оно занимает 4 байта в любой записи (???), является fixed-length полем. Если же просто переводить фразу "If there are fixed-length columns in the table, a portion of the row, known as the null bitmap, is reserved to manage column nullability" то у меня лично получается(литературно) "Если в таблице существуют столбцы с фиксированной длиной(!!!), то для управления состоянием NULL столбца, в структуре записи выделяется часть, иначе именуемая NULL-маска" Что-то как-то не сходится у меня пока - пойду читать MSDN ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2002, 18:51 |
|
||
|
определение наличия атрибута
|
|||
|---|---|---|---|
|
#18+
у меня тут небольшой вопрос по ходу дела ... а если Child'a может не быть, то как вы собираетесь делать поле ChildID int not null? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2002, 13:37 |
|
||
|
определение наличия атрибута
|
|||
|---|---|---|---|
|
#18+
Приветствую Г-ну Andrey: вероятно, автор сообщения ошибся, указав \ncreate table T (id int not null, hasChild bit not null, ChildID int not null) Либо хотел хранить фиктивное значение вроде 0 или -1 в случае отсутствия потомка. Хотя, если есть флаг hasChild, то какое имеет значение содержимое поля ChildID - его можно игнорировать при отсутствии потомка. Удачи ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2002, 14:16 |
|
||
|
определение наличия атрибута
|
|||
|---|---|---|---|
|
#18+
Если кому интересно, то в книге Kalen Delaney "Inside Microsoft SQL Server 2000" - Part III Using Microsoft SQL Server - Chapter 6 Tables - Internal Storage - The Structure of Data Rows сказано в первом байте каждой записи (этот байт имеет имя Status Bits A) "Bit 4 Indicates that a NULL bitmap exists; in SQL Server 2000, a NULL bitmap is always present, even if no NULLs are allowed in any column " Размер NULL bitmap в SQL Server 2000 будет - Ceiling(Number of columns / 8 ) Таким образом размер записи предложенных таблиц будет разным в разных версиях SQL и для SQL2000 он будет 9 и 8 байт соответсвенно. ЗЫ Еще раз спасибо jimmers за книгу ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.04.2002, 10:23 |
|
||
|
определение наличия атрибута
|
|||
|---|---|---|---|
|
#18+
Есть у меня дурная привычка запоминать только то, что может поднадобиться (голова - это сундук, в который нужно складывать только нужные вещи). Где я вычитал про Null bitmap, так и не вспомнил. Пошерстил по Мамаеву, понял, что не там. Значит, в какой-то статье (есть же такая дурная привычка учитываться статьями в неограниченном количестве). Короче, ссылку на первоисточник привести не смогу. По приведенной Glory (большое ему спасибо) информации получается некоторое уточнение по той части, в которой у меня были сомнения. А именно: ...in SQL Server 2000, a NULL bitmap is always present, even if no NULLs are allowed in any column Мой перевод: ...в SQL Server 2000 Null-маска присутствует всегда, даже если нет ни одной колонки, позволяющей вводить Null-значения. >Таким образом размер записи предложенных таблиц ... для SQL2000 ... будет 9 и 8 байт соответсвенно. Glory, объясни пожалуйста, как ты получил 8 байт. В каком конкретно байте размещается Null bitmap? По приведенной тобой информации следует, что в первом случае под Null bitmap отводится 3 бита, во втором случае - 2. Итого в 9-й байт упаковывается Null bitmap (3 бита под 3 поля) + поле HasChild = 4 бита. Во втором случае в 9-й байт упаковываются 2 бита (под 2 поля) Null bitmap. Но у меня получается для обеих случаев размер записи = 9 байт. Если поставить под вопрос упаковку полей типа bit с Null bitmap в единую совокупность байтов (поскольку я не смог нарыть первоисточник), то получается, что в первом случае 10 байтов (поле HasChild - в одном байте, Null bitmap - в другом), по второму ничего не меняется - 9 байтов. Но 9 и 8 у меня не получается никак... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.04.2002, 07:43 |
|
||
|
определение наличия атрибута
|
|||
|---|---|---|---|
|
#18+
В той же книге(если кому надо, она все еще лежит здесь http://www.hot.ee/gloryee) сказано, что NULL-bitmap 1. размещается после полей с фиксированной длиной (до полей с переменной длиной) 2. имеет постоянный размер т.о. NULL-bitmap не "упакован" вместе с полями данных типа bit. Т.е. он не влияет на размер данных конкретной записи. id int not null занимает 4 байта hasChild bit not null занимает 1 бит ChildID int not null занимает 4 байта ____________________________________________________ Итого 8 байт + 1 байт под хранение 1 бита = 9 байт NULL-bitmap = 1 байт Во втором примере id int not null занимает 4 байта ChildID int null занимает 4 байта _____________________________________________________ Итого 8 байт NULL-bitmap = 1 байт ЗЫ Проверил практически. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.04.2002, 09:26 |
|
||
|
|

start [/forum/topic.php?fid=46&fpage=3481&tid=1822954]: |
0ms |
get settings: |
12ms |
get forum list: |
18ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
46ms |
get topic data: |
12ms |
get forum data: |
4ms |
get page messages: |
55ms |
get tp. blocked users: |
1ms |
| others: | 258ms |
| total: | 414ms |

| 0 / 0 |
