Типы таблиц CONNECT - VIR
Тип VIR
Таблица VIR — это виртуальная таблица, содержащая только специальные или виртуальные столбцы. Единственное её свойство — это «размер» или мощность, означающая количество виртуальных строк. Она создаётся с помощью синтаксиса:
CREATE TABLE name [coldef] ENGINE=CONNECT TABLE_TYPE=VIR [BLOCK_SIZE=n];
Необязательный параметр BLOCK_SIZE задаёт размер таблицы, по умолчанию равный 1, если не указан. Если её столбцы не указаны, она практически эквивалентна таблице SEQUENCE «seq_1_to_Size».
Отображение констант или выражений
Многие СУБД используют однострочную таблицу без столбцов для этого, часто называемую «dual». MySQL и MariaDB используют синтаксис, где таблица не указывается. С помощью CONNECT можно достичь той же цели с помощью виртуальной таблицы, с заметным преимуществом — возможностью отображения нескольких строк. Например:
create table virt engine=connect table_type=VIR block_size=10;
select concat('The square root of ', n, ' is') what,
round(sqrt(n),16) value from virt;
Это вернёт:
| что | значение |
|---|---|
| Квадратный корень из 1 равен | 1.0000000000000000 |
| Квадратный корень из 2 равен | 1.4142135623730951 |
| Квадратный корень из 3 равен | 1.7320508075688772 |
| Квадратный корень из 4 равен | 2.0000000000000000 |
| Квадратный корень из 5 равен | 2.2360679774997898 |
| Квадратный корень из 6 равен | 2.4494897427831779 |
| Квадратный корень из 7 равен | 2.6457513110645907 |
| Квадратный корень из 8 равен | 2.8284271247461903 |
| Квадратный корень из 9 равен | 3.0000000000000000 |
| Квадратный корень из 10 равен | 3.1622776601683795 |
Что произошло? Во-первых, в отличие от таблицы Oracle «dual», которая не имеет столбцов, таблица MariaDB должна иметь хотя бы один столбец. По умолчанию CONNECT создаёт таблицы VIR с одним специальным столбцом. Это можно увидеть с помощью команды SHOW CREATE TABLE:
CREATE TABLE `virt` ( `n` int(11) NOT NULL `SPECIAL`=ROWID, PRIMARY KEY (`n`) ) ENGINE=CONNECT DEFAULT CHARSET=latin1 `TABLE_TYPE`='VIR' `BLOCK_SIZE`=10
Этот специальный столбец называется «n», а его значение — номер строки, начиная с 1. Это чисто виртуальная таблица, и соответствующий ей и её индексу файл данных не существует. Можно указать столбцы таблицы VIR, но они должны быть специальными или виртуальными столбцами CONNECT. Например:
create table virt2 ( n int key not null special=rowid, sig1 bigint as ((n*(n+1))/2) virtual, sig2 bigint as(((2*n+1)*(n+1)*n)/6) virtual) engine=connect table_type=VIR block_size=10000000; select * from virt2 limit 995, 5;
Эта таблица показывает сумму и сумму квадратов первых n целых чисел:
| n | sig1 | sig2 |
|---|---|---|
| 996 | 496506 | 329845486 |
| 997 | 497503 | 330839495 |
| 998 | 498501 | 331835499 |
| 999 | 499500 | 332833500 |
| 1000 | 500500 | 333833500 |
Обратите внимание, что размер таблицы может быть очень большим, так как физических данных нет. Однако результат запросов должен быть ограничен. Например:
select * from virt2 where n = 1664510;
Такой запрос может занимать очень много времени, если столбец rowid не индексирован. Обратите внимание, что по умолчанию CONNECT объявляет столбец «n» первичным ключом. На самом деле, таблицы VIR могут быть индексированы, но только по столбцам ROWID (или ROWNUM) таблицы. Это виртуальный индекс, для которого данные не хранятся.
Генерация таблицы, заполненной константными значениями
Интересное применение виртуальных таблиц, которого часто нельзя достичь с помощью таблиц любого другого типа, — это генерация таблицы, содержащей константные значения. Это легко сделать с помощью виртуальной таблицы. Давайте определим таблицу FILLER как:
create table filler engine=connect table_type=VIR block_size=5000000;
Здесь мы выбираем размер, больший, чем самая большая таблица, которую мы хотим создать. Позже, если нам понадобится таблица, предварительно заполненная значениями по умолчанию и/или NULL, мы можем сделать, например:
create table tp ( id int(6) key not null, name char(16) not null, salary float(8,2)); insert into tp select n, 'unknown', NULL from filler where n <= 10000;
Это сгенерирует таблицу с 10000 строками, которую можно обновить позже при необходимости. Обратите внимание, что вместо FILLING здесь можно было использовать таблицу SEQUENCE.
Таблицы VIR и таблицы SEQUENCE
Только с её стандартным столбцом, таблица VIR почти эквивалентна таблице SEQUENCE. Основное различие — используемый синтаксис, например:
select * from seq_100_to_150_step_10;
можно получить с помощью таблицы VIR (размера >= 15) следующим образом:
select n*10 from vir where n between 10 and 15;
Следовательно, основное отличие заключается в возможности определения столбцов таблиц VIR. К сожалению, в настоящее время существует много ограничений для виртуальных столбцов, которые, надеемся, будут устранены в будущем.
© 2023 MariaDB
Licensed under the Creative Commons Attribution 3.0 Unported License and the GNU Free Documentation License.
https://mariadb.com/kb/en/connect-table-types-vir/