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

Вопрос

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

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

Подробнее

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

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

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

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

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

1 ответ

Решение

будет ли это дублировать хранилище, необходимое для больших двоичных объектов?

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

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

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 |
+-------------+----------+-----------------+------------+------------------+-------------+------------+
Другие вопросы по тегам