可以在系统表上创建索引视图吗?

时间:2019-01-15 21:22:02

标签: sql sql-server tsql sql-server-2017

为什么不能使用sys.表创建索引视图?

我不想每次查询该视图时都写order by,所以我想在要排序的字段上创建聚簇索引。

这是视图:

ALTER VIEW [dbo].[sysVW_Row_Groups]
--WITH SCHEMABINDING
AS
SELECT 
    OBJECT_NAME(rg.OBJECT_ID) as table_name
    ,i.name as index_name
    --,i.type_desc as index_type_desc

    ,rg.partition_number
    ,p.rows as rows_per_partition_number
    --,p.data_compression_desc as data_compresion_partition
    ,row_group_id
    ,state_description
    ,total_rows as total_rows_row_group
    ,convert(decimal(10,2),(total_rows*1.0/POWER(2,20))*100) as full_row_groups
    --,size_in_bytes
    ,convert(decimal(10,2),(size_in_bytes*1.0)/POWER(2,20)) as size_in_Mbytes 
    ,convert(decimal(10,2),(total_rows*1.0/p.rows)*100) as partition_percentage_rows

    ,deleted_rows
    ,i.compression_delay

    ,ps.name as partition_scheme_name
    --,ps.type_desc as partition_scheme_type_desc

    ,pf.name as partition_function_name
    --,pf.type_desc as partition_function_type_desc
    ,pf.boundary_value_on_right
    ,pf.fanout as number_of_resulting_partitions

FROM SYS.COLUMN_STORE_ROW_GROUPS rg
    inner join sys.partitions p ON rg.partition_number = p.partition_number and object_name(rg.object_id) = object_name(p.object_id) 
            and data_compression_desc = 'COLUMNSTORE' --Focused on in columnstore indexes
    inner join sys.indexes i ON OBJECT_NAME(rg.OBJECT_ID) = OBJECT_NAME(i.OBJECT_ID) 
    inner join sys.partition_schemes ps ON i.data_space_id = ps.data_space_id
    inner join sys.partition_functions pf ON ps.function_id = pf.function_id

我知道这对我对列存储索引的帮助不大,但是无论如何...

我收到以下错误消息:

Msg 2720, Level 16, State 1, Procedure sysVW_Row_Groups, Line 10 [Batch Start Line 6]
Cannot schema bind view 'dbo.sysVW_Row_Groups' because it references system object 'SYS.COLUMN_STORE_ROW_GROUPS'.

1 个答案:

答案 0 :(得分:2)

Select * from indexed_view不保证有关查询返回的订单的任何信息。 (如评论所示)。因此,请不要以为您的应用程序会崩溃。

关于“为什么不能在系统表上创建索引视图?”造成这种情况的原因有两个。

  1. 您可以在索引视图上创建约束,这将导致某些系统DDL命令失败(您不希望普通用户能够执行此操作)。
  2. 系统表实际上是视图本身。有不同的基础表,它们没有直接公开(尽管您可以在showplan中看到它们)。因此,我们不允许您绑定到内部表。尽管不常见,但SQL有时可以(在主要版本升级时)更改这些视图,从而可能破坏以前创建的任何索引视图。
  3. 最后,有一个非常不同的代码路径来实现如何更新系统表(视图)。它没有使用正常的更新语句。锁,闩锁,维护系统缓存等有很多特殊逻辑。因此,维护索引视图的逻辑不适用于这些对象。 [所有这些都是很久以前以绩效/规模的名义完成的]