Сколько уникальных значений может принимать 1 байт

в военное время в байт можно всунуть и больше

но обычно работает примерно так

число одно, значение его от 0 до 255

то есть благодаря инструкции и двоичной системе 0,1,2,3,4. 255 считается числом команд

Я правильно понимаю что в чистый байт(без инструкций) можно впихнуть скажем 256 чисел? (типо 111111111111111. )

Десятичное число 255, равно двоичному числу 11111111 (восемь единиц – восемь бит)

То есть, в одном байте значение может быть:
от 00000000 до 11111111 в двоичной системе
или это означает от 0 до 255 в десятичной системе
Или это означает от 0 до FF в шестнадцатиричной системе

Геннадий Сигалаев

Введение

Oracle TimesTen – это реляционная СУБД, оптимизированная для работы в оперативной памяти. Она обеспечивает приложениям возможность мгновенного реагирования и высокую скорость обработки данных, необходимых современным предприятиям и отраслям, работающим в реальном времени (телекоммуникации, рынки ценных бумаг, системы обороны и т. п.). Несмотря на то, что TimesTen первоначально проектировалась для высоконагруженных OLTP систем с малым временем отклика, данное программное обеспечение нашло применение и в аналитических системах. Не удивительно, что TimesTen является одной из составных частей Oracle Exalytics – программно-аппаратного комплекса, предназначенного для бизнес анализа. Кроме того, TimesTen 11.2.2 содержит функционал, который лицензионно можно использовать только на данном программно-аппаратном комплексе. Именно об одной из таких возможностей и пойдет речь далее.

В данной статье рассматривается возможность колоночного сжатия данных (columnar compression).

Используемое окружение:

При создании базы данных использовался параметр NLS_LENGTH_SEMANTICS =BYTE.

Колоночное сжатие

Таблицы в TimesTen могут быть сжаты на уровне колонки, что позволяет хранить данные более эффективно. Единицей компрессии является группа сжатых колонок (compressed column group). Данная группа может состоять из одного или нескольких стобцов (максимальное количество – шестнадцать столбцов). При этом, столбец может быть включен только в одну группу.

Примечание: если создается группа колонок, состоящая из нескольких столбцов, то данные столбцы должны иметь тип хранения INLINE, иначе получим ошибку «805: Multi-column compression with out-of-line columns has not been implemented».

Для определения данной группы, необходимо указать фразу OPTIMIZED FOR READ в условии CREATE TABLE.

Дополнительно, можно указать следующие ключевые слова:

  • COMPRESS – определяет группу сжатых колонок (compressed column group) для таблицы;
  • BY DICTIONARY – определяет тип компрессии на уровне словаря данных для каждой группы сжатых колонок;
  • MAXVALUES – определяет максимальное количество уникальных значений для столбца/столбцов и, таким образом, устанавливает размер указателя на хранящиеся значения в словаре данных. Указатели могут иметь значения 1, 2 и 4 байта.

Например, создадим таблицу:

В данном примере я создал таблицу с двумя группами сжатых колонок. Первая состоит из двух столбцов VAL_1 и VAL_2 и вторая – из столбца VAL_3. Каждый столбец может содержать до 255 уникальных значений, и будет использоватся указатель размера один байт для каждой группы. Кроме того, можно найти следующую информацию о нашей таблице в словаре данных:

Читайте также:  Программа для поиска айпи адресов

Видно, что таблица EMP_COMP сжата и содержит три сжатых столбца. Компрессия имеет тип компресии “QUERY HIGH”, в настоящий момент единственный доступный тип, возможно в новых версиях появяться и другие типы. При создании таблицы с компрессией, TimesTen автоматически создает системные таблицы в текущей схеме для каждой группы.

Имя системных таблиц формируется следующим образом: "CD$" + идентификатор таблицы (SYS.TABLES.TBLID) + номер сжатого столбца. Каждая системная таблица содержит такие же столбцы что и столбцы, входящие в группу сжатых колонок, плюс столбец – счетчик (##CD_REFCNT).

Таблица словаря данных создается для каждой группы сжатых столбцов и содержит колонку/колонки с уникальными значениямя для сжатой группы. Группа сжатых колонок в таблице содержит указатель на строку, содержащую соответствующее значение в таблице словаря данных (см. Рис. 1.).


Рис. 1.

Указатель может принимать значения 1,2 и 4 байта. Размер указателя зависит от максимального количества содержащихся в словаре уникальных значений (параметр MAXVALUES). Когда пользователь устанавливает данный параметр, размер группы сжатых колонок устанавливается следующим образом:

  • 1 байт – для максимального количества элементов 255 (2^8 -1).
  • 2 байта – для максимального количества элементов 65,535 (2^16 -1).
  • 4 байта – для максимального количества элементов 4,294,967,295 (2^32 -1). Используется по умолчанию.

Посмотрим, как данный функционал работает. Создадим обычную таблицу и вставим в нее один миллион строк.

Видно, что таблица test2 содержит один миллион строк (NUM_USED_ROWS) для хранения которых выделилось 3907 блоков, средняя длина строки с учетом системной информации 171 байт (AVG_ROW_LEN) и таблица хранится INLINE и занимает 171470416 байт, а с учетом методанных, 171539960 байт.

Теперь создадим таблицу с идентичной структурой и сожмем один стобец (val_1). Будем использовать указатель размера 1 байт.

Как видно, средняя длина таблицы test2_comp уменьшилась на 40 байт по сравнению с таблицей test2, т.е. объем занимаемой памяти уменьшился на объем, занимаемый сжатым столбцом. Действительно, в данном примере в словаре данных будет храниться только одно уникальное значение, поэтому выигрыш очевиден.

Давайте посчитаем. Данные храняться в блоках по 256 строк, следовательно при вставке одного миллиона строк, данные выделились для хранения 1000192 строк. Сжатие проводилось по столбцу имеющему длинну 40 байт, следовательно, максимальное количество памяти, которое мы могли съэкономить равно 40007680 байт (40 * 1000192), что собственно мы и получили (см. Таб.1. ). Но при этом, размер метаданных увеличился на 18056 байт, т.к. появилась системная таблица с одной строкой, для которой также выделился блок на 256 строк.

Читайте также:  Приложения для виндовс 7 32 бит

Далее, рассмотрим распределение памяти. Создадим сжатую таблицу (я использую тоже имя test2_comp), используя указатель длины 4 байта и вставим строку.

Как видно, выделился INLINE блок для таблицы test2_comp размером 33648 байт. Также выделился блок для системной таблицы CD$_1086048_2. Давайте вставим еще 256 строк.

Выделился еще один блок размером 33648 байт для таблицы TEST2_COMP (33648 *2 = 67296). Размер метаданных не изменился. Вставим еще несколько строк.

Появился третий блок для таблицы TEST2_COMP (33648 *3 = 100944 байта) и еще один блок для системной таблицы CD$_1086048_2 (36096 – 18832 = 17264 байта), и т.д.

Как видно, TimesTen может существенно сжать данные, но степень сжатия очень сильно зависит от количества уникальных значений в сжимаемой колонке. В таблице 2, представлен размер занимаемой памяти для хранения одного моллиона строк в таблице test2_comp в зависимости от хранения разного колиличества уникальных значений.

Из приведенных данных следует вывод о том, что технология сжатия не эффективна при сжатии уникальных значений и устапает не сжатой таблице на 27 512 328 байт, но при хранении дупликатов, данная технология позволяет существенно съэкономить место.

Но кроме достоинств, данная технология имеет ряд ограничений:

  1. Колонки типа LOB не могут быть сжаты;
  2. Компрессия не поддерживается для реплицируемых таблиц, кэшируемых таблиц, грид таблиц и временных таблиц;
  3. Нет возможности создать материализованное представление ссылсющееся на сжатую таблицу;
  4. Для сжатых таблиц, все SQL операторы блокируют таблицу, т.е. операции insert, delete, update не масштабируются;
  5. Оптимизатор TimesTen не умеет эффективно использовать компрессию.

Некоторые из ограничений являются достаточно существенными. Например, невозможность масштабирования DML операций совершаемых над сжатой таблицей, но данный функционал был разработан для аналитики, поэтому, возможно, в рамках данного контекста, это не так весомо. Самым существенным ограничением, по моему мнению, является невозможность сжать кэшируемые талицы из Oracle Database. Это означает, что необходимо использовать возможности импорта в TimesTen, вместо использования механизма Cache Connect.

Кроме того, я бы хотел рассмотреть выполнение SQL операторов для сжатых таблиц. Создадим сжатую таблицу с одним миллионом строк.

Из приведенного выше примера видно, что использовалось одно и тоже значение для колонки VAL_1 один миллион раз. Системная таблица CD$_1086048_2 содержит только одну строку с этим уникальным значением. Теперь выполним простой SQL-запрос.

Оптимизатор TimesTen выполнил полное сканирование таблицы TAB_COMP (TblLkSerialScan) и это заняло

0,05с., но вся информация, необходимая запросу, может быть получена из системной таблицы CD$_1086048_2, причем системная таблица содержит всего одну строку, а не миллион, что дало бы существенный выигрыш в производительности.

Но к сожалению, данный функционал отсутствует в текущей версии Oracle TimesTen.

Заключение

Колоночное сжатие – это ключевая функциональность, которая появилась в Oracle TimesTen 11.2.2. Данная технология позволяет существенно снизить объем оперативной памяти, необходимый для хранения данных. Конечно, данный функционал имеет существенные ограничения, но, все же, это первый шаг для использования TimesTen в

Читайте также:  Прямой кабель используется для соединения

Минимальная единица измерения объема памяти в двоичных компьютерных системах называется БИТ (BIT).

Бит это двоичное число, которое, как правило принимает либо 0 либо 1. Если говорить о конечном проявлении в физической форме в компьютере, то как правило это состояния "свободно", "занято" или "нет сигнала" и "есть сигнал". Вот именно от сюда проявляется важность двойки и ее степенней.

Так как бит это очень уж маленькая единица измерения даже для переменных, не говоря уже о подсчете информации на энергонезависимых источниках памяти (жесткие диски, флешки).
Ввели дополнительную единицу измерения называемую БАЙТ (BYTE).

В современных компьютерных системах 1 байт равен 8 битам.
Ранее существовали байты с большей размерностью битов.
Байт обычно является минимальным размером в адресации оперативной памяти, то есть компьютер орудует такими блоками из восьми бит. Путем добавления приставок СИ к байту мы и получаем привычные килобайты, мегабайты и так далее.

Любые переменные используемые в ваших программах занимают сколько то места в оперативной памяти. Место это измеряется уже в байтах.

Посмотрим сколько значений может хранить один байт, для этого возведем 2^8 получаем 256 уникальных значений может хранить один байт.
Почему возводим 2 в степень 8. Потому что у нас имеется восемь элементов, которые могут хранить одно из двух значений, получаем 256 возможных комбинаций от 00000000 до 11111111.

Возьмем ключевые значения двойки, которые соответствуют последовательности байтов.
1 байт = 2^8 = 256
2 байта = 2^16 = 65536
4 байта = 2^32 = 4294967296

К примеру тип данных INTEGER часто реализуется используя 2 байта или 4 байта (а бывает и даже один), то есть теоритически может принимать 65536 или 4294967296 уникальных значений.
На практике всегда стоит помнить, что если тип данных имеет знак, то для него отводится один бит. К примеру пусть у нас тип данных TinyINT (маленький INT, используется в субд MySql) будет знаковым, тогда мы получаем 2^7 = 128, так как у нас есть знак, то интервал допустимых значений будет от -128 до 127 (незабываем про 0).

Если же наш TinyINT является беззнаковым (unsigned), то мы получаем интервал значений от 0 до 255.

Для хранения натурального числа N нужно LOG 2 N + 1 бит. То есть логарифм N по основанию 2 плюс 1 бит.

Со строками дело обстоит несколько иначе.
Так как строка это последовательность символов, а символ может быть любой буквой, цифрой или знаком (в том числе пробелом), то каждый символ кодируется отдельно от одного до нескольких байтов.

Leave a Reply

Ваш адрес email не будет опубликован. Обязательные поля помечены *

You may use these HTML tags and attributes:

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>