Можно ли создать индексированное представление для системных таблиц? - PullRequest
0 голосов
/ 16 января 2019

Почему нельзя создать индексированные представления с 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

Я знаю, что это немного поможет мне в индексах columnstore, но в любом случае ...

Я получил следующее сообщение об ошибке:

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 голосов
/ 16 января 2019

Select * from indexed_view не гарантирует ничего о заказе, возвращенном по запросу. (как следует из комментария). Поэтому, пожалуйста, не думайте, что или ваше приложение может сломаться.

Что касается "почему вы не можете создать индексированное представление для системных таблиц?" Есть несколько причин для этого.

  1. Вы можете создать ограничения для индексированных представлений, которые приведут к сбою некоторых системных команд DDL (что не требуется для обычного пользователя).
  2. Системные таблицы фактически являются самими представлениями. Существуют разные базовые таблицы, и они не отображаются напрямую (хотя вы можете увидеть их в showplan). Итак, мы не позволяем вам привязываться к внутренним таблицам. Несмотря на то, что SQL редко встречается, они могут изменить эти представления (при обновлении основной версии) таким образом, что это может нарушить любые индексированные представления, созданные ранее
  3. Наконец, существует совершенно другой путь к коду для реализации обновления системных таблиц (представлений). Он не использует обычные операторы обновления. Существует много специальной логики для блокировок, защелок, поддержки системных кэшей и так далее. Таким образом, логика для поддержки индексированных представлений не будет работать на этих объектах. [Все это было сделано давно во имя производительности / масштаба]
...