BLOB如何存储在索引视图中?

时间:2016-11-18 12:41:37

标签: sql-server blob indexed-view

问题

假设我在包含varbinary(max)列的表上创建索引视图,将二进制内容物理复制到索引视图的B-Tree中,或者原始字段是否为&#34 ;引用"不知怎的,没有实际复制他们的内容?

换句话说,如果我在包含BLOB的表上创建索引视图,是否会复制BLOB所需的存储空间?

更多细节

当对二进制数据使用全文索引时,例如varbinary(max),我们需要一个额外的"过滤器类型"列,用于指定如何从该二进制数据中提取文本,以便对其进行索引,如下所示:

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

在我的特定情况下,这些字段位于不同的表中,我尝试使用索引视图将它们连接在一起,因此可以在全文索引中使用它们。

当然,我可以将类型字段复制到BLOB表中并手动维护(保持与原始文件同步),但我想知道我是否可以让DBMS自动为我做,这将是优先除非在存储方面需要付出陡峭的代价。

此外,将这两个表合并为一个表会产生负面影响,而不是在这里详细说明......

1 个答案:

答案 0 :(得分:5)

  

会复制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 |
+-------------+----------+-----------------+------------+------------------+-------------+------------+