Как BLOB хранится в индексированном представлении?

Вопрос

Предполагая, что я создаю индексированное представление для таблицы, содержащей столбец varbinary(max), будет ли двоичный контент физически скопирован в B-дерево индексированного представления или исходные поля будут просто каким-то образом "ссылаться" без физического дублирования их содержимого?

Другими словами, если я создам индексированное представление для таблицы, содержащей большие двоичные объекты, будет ли это дублировать хранилище, необходимое для больших двоичных объектов?

Подробнее

При использовании полнотекстового индекса для двоичных данных, таких как varbinary(max), нам нужен дополнительный столбец «тип фильтра», чтобы указать, как извлекать текст из этих двоичных данных, чтобы его можно было индексировать, примерно так:

CREATE FULLTEXT INDEX ON <table or indexed view> (
    <data column> TYPE COLUMN <type column>
)
...

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

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

Кроме того, объединение этих двух таблиц в одну само по себе имело бы негативные последствия, если не вдаваться в подробности...


person Branko Dimitrijevic    schedule 18.11.2016    source источник
comment
Скорее всего, это копия, поскольку большой двоичный объект может быть вычисленным значением.   -  person usr    schedule 18.11.2016


Ответы (1)


будет ли это дублировать хранилище, необходимое для BLOB?

Да. Индексированное представление будет иметь собственную копию.

Вы можете увидеть это из

CREATE TABLE dbo.T1
  (
     ID   INT IDENTITY PRIMARY KEY,
     Blob VARBINARY(MAX)
  );

DECLARE @vb VARBINARY(MAX) = CAST(REPLICATE(CAST('ABC' AS VARCHAR(MAX)), 1000000) AS VARBINARY(MAX));

INSERT INTO dbo.T1
VALUES      (@vb),
            (@vb),
            (@vb);

GO

CREATE VIEW dbo.V1
WITH SCHEMABINDING
AS
  SELECT ID,
         Blob
  FROM   dbo.T1

GO

CREATE UNIQUE CLUSTERED INDEX IX
  ON dbo.V1(ID)

SELECT o.NAME       AS object_name,
       p.index_id,
       au.type_desc AS allocation_type,
       au.data_pages,
       partition_number,
       au.total_pages,
       au.used_pages
FROM   sys.allocation_units AS au
       JOIN sys.partitions AS p
         ON au.container_id = p.partition_id
       JOIN sys.objects AS o
         ON p.object_id = o.object_id
WHERE  o.object_id IN ( OBJECT_ID('dbo.V1'), OBJECT_ID('dbo.T1') ) 

Что возвращает

+-------------+----------+-----------------+------------+------------------+-------------+------------+
| object_name | index_id | allocation_type | data_pages | partition_number | total_pages | used_pages |
+-------------+----------+-----------------+------------+------------------+-------------+------------+
| T1          |        1 | IN_ROW_DATA     |          1 |                1 |           2 |          2 |
| T1          |        1 | LOB_DATA        |          0 |                1 |        1129 |       1124 |
| V1          |        1 | IN_ROW_DATA     |          1 |                1 |           2 |          2 |
| V1          |        1 | LOB_DATA        |          0 |                1 |        1129 |       1124 |
+-------------+----------+-----------------+------------+------------------+-------------+------------+
person Martin Smith    schedule 18.11.2016