Visão geral de exibições

Este tópico abrange conceitos para entender e usar exibições.

Neste tópico:

O que é uma Exibição?

Uma exibição permite que o resultado de uma consulta seja acessado como se fosse uma tabela. A consulta é especificada na instrução CREATE VIEW.

Exibições têm muitas finalidades, incluindo a combinação, segregação e proteção de dados. Por exemplo, você pode criar exibições separadas que atendam às necessidades de diferentes tipos de colaboradores, tais como médicos e contadores em um hospital:

CREATE TABLE hospital_table (patient_id INTEGER,
                             patient_name VARCHAR, 
                             billing_address VARCHAR,
                             diagnosis VARCHAR, 
                             treatment VARCHAR,
                             cost NUMBER(10,2));
INSERT INTO hospital_table 
        (patient_ID, patient_name, billing_address, diagnosis, treatment, cost) 
    VALUES
        (1, 'Mark Knopfler', '1982 Telegraph Road', 'Industrial Disease', 
            'a week of peace and quiet', 2000.00),
        (2, 'Guido van Rossum', '37 Florida St.', 'python bite', 'anti-venom', 
            70000.00)
        ;
Copy
CREATE VIEW doctor_view AS
    SELECT patient_ID, patient_name, diagnosis, treatment FROM hospital_table;

CREATE VIEW accountant_view AS
    SELECT patient_ID, patient_name, billing_address, cost FROM hospital_table;
Copy

Uma exibição pode ser usada em quase qualquer lugar onde uma tabela possa ser usada (junções, subconsultas, etc.). Por exemplo, usando as exibições criadas acima:

  • Mostre todos os tipos de problemas médicos para cada paciente:

    SELECT DISTINCT diagnosis FROM doctor_view;
    +--------------------+
    | DIAGNOSIS          |
    |--------------------|
    | Industrial Disease |
    | python bite        |
    +--------------------+
    
    Copy
  • Mostre o custo de cada tratamento (sem mostrar informações de identificação pessoal sobre pacientes específicos):

    SELECT treatment, cost 
        FROM doctor_view AS dv, accountant_view AS av
        WHERE av.patient_ID = dv.patient_ID;
    +---------------------------+----------+
    | TREATMENT                 |     COST |
    |---------------------------+----------|
    | a week of peace and quiet |  2000.00 |
    | anti-venom                | 70000.00 |
    +---------------------------+----------+
    
    Copy

Um comando CREATE VIEW pode usar um nome de tabela totalmente qualificado, parcialmente qualificado ou não-qualificado. Por exemplo:

CREATE VIEW v1 AS SELECT ... FROM my_database.my_schema.my_table;

CREATE VIEW v1 AS SELECT ... FROM my_schema.my_table;

CREATE VIEW v1 AS SELECT ... FROM my_table;
Copy

Se o esquema não for especificado, o Snowflake assumirá que a tabela está no mesmo esquema que a exibição. (Se supormos que a tabela está no esquema ativo, a exibição poderia se referir a tabelas diferentes em momentos diferentes).

Tipos de exibições

O Snowflake oferece suporte para dois tipos de exibições:

  • Exibições não-materializadas (geralmente chamadas simplesmente de “exibições”)

  • Exibições materializadas.

Exibições não-materializadas

O termo “exibição” se refere genericamente a todos os tipos de exibições; no entanto, o termo é usado aqui para se referir especificamente a exibições não-materializadas.

Uma exibição é basicamente uma definição nomeada de uma consulta. Os resultados de uma exibição não-materializada são criados pela execução da consulta no momento em que a exibição é referenciada em uma consulta. Os resultados não são armazenados para uso futuro. O desempenho é mais lento do que com exibições materializadas. Exibições não-materializadas são o tipo de exibição mais comum.

Qualquer expressão de consulta que retorna um resultado válido pode ser usada para criar uma exibição não-materializada, como por exemplo:

  • Seleção de algumas (ou todas as) colunas em uma tabela.

  • Seleção de uma faixa específica de dados em colunas de uma tabela.

  • Junção de dados de duas ou mais tabelas.

Exibições materializadas

Embora uma exibição materializada seja denominada como se fosse um tipo de exibição, em muitos aspectos ela se comporta mais como uma tabela. Os resultados de uma exibição materializada são armazenados, quase como se os resultados fossem uma tabela. Isso permite um acesso mais rápido, mas requer espaço de armazenamento e manutenção ativa, ambos com custos adicionais.

Além disso, as exibições materializadas têm algumas restrições que as não-materializadas não têm.

Para obter mais detalhes, consulte Como trabalhar com exibições materializadas.

Exibições seguras

Tanto exibições materializadas quanto não-materializadas podem ser definidas como seguras. As exibições seguras têm vantagens sobre as exibições padrão, incluindo melhor privacidade de dados e compartilhamento de dados; no entanto, elas também têm alguns impactos de desempenho a serem considerados.

Para obter mais detalhes, consulte Como trabalhar com exibições seguras.

Exibições recursivas (apenas exibições não-materializadas)

Uma exibição não-materializada pode ser recursiva (ou seja, a exibição pode se referir a si mesma).

O uso da recursividade em exibições é semelhante ao uso da recursividade em CTEs recursivas. Na verdade, uma exibição pode ser definida com uma CTE recursiva. Por exemplo:

CREATE VIEW employee_hierarchy (title, employee_ID, manager_ID, "MGR_EMP_ID (SHOULD BE SAME)", "MGR TITLE") AS (
   WITH RECURSIVE employee_hierarchy_cte (title, employee_ID, manager_ID, "MGR_EMP_ID (SHOULD BE SAME)", "MGR TITLE") AS (
      -- Start at the top of the hierarchy ...
      SELECT title, employee_ID, manager_ID, NULL AS "MGR_EMP_ID (SHOULD BE SAME)", 'President' AS "MGR TITLE"
        FROM employees
        WHERE title = 'President'
      UNION ALL
      -- ... and work our way down one level at a time.
      SELECT employees.title, 
             employees.employee_ID, 
             employees.manager_ID, 
             employee_hierarchy_cte.employee_id AS "MGR_EMP_ID (SHOULD BE SAME)", 
             employee_hierarchy_cte.title AS "MGR TITLE"
        FROM employees INNER JOIN employee_hierarchy_cte
       WHERE employee_hierarchy_cte.employee_ID = employees.manager_ID
   )
   SELECT * 
      FROM employee_hierarchy_cte
);
Copy

Em vez de usar uma CTE recursiva, você pode criar uma exibição recursiva com a palavra-chave RECURSIVE, por exemplo:

CREATE RECURSIVE VIEW employee_hierarchy_02 (title, employee_ID, manager_ID, "MGR_EMP_ID (SHOULD BE SAME)", "MGR TITLE") AS (
      -- Start at the top of the hierarchy ...
      SELECT title, employee_ID, manager_ID, NULL AS "MGR_EMP_ID (SHOULD BE SAME)", 'President' AS "MGR TITLE"
        FROM employees
        WHERE title = 'President'
      UNION ALL
      -- ... and work our way down one level at a time.
      SELECT employees.title, 
             employees.employee_ID, 
             employees.manager_ID, 
             employee_hierarchy_02.employee_id AS "MGR_EMP_ID (SHOULD BE SAME)", 
             employee_hierarchy_02.title AS "MGR TITLE"
        FROM employees INNER JOIN employee_hierarchy_02
        WHERE employee_hierarchy_02.employee_ID = employees.manager_ID
);
Copy

Para obter mais detalhes, incluindo exemplos, consulte CREATE VIEW.

Vantagens das exibições

Exibições permitem escrever um código mais modular

Exibições ajudam você a escrever um código SQL mais claro e modular. Por exemplo, suponha que seu banco de dados de um hospital tenha uma tabela listando informações sobre todos os funcionários. Você pode criar exibições para tornar conveniente extrair informações apenas sobre a equipe médica ou apenas sobre a equipe de manutenção. Você pode até mesmo criar hierarquias de exibições.

Por exemplo, você pode criar uma exibição para os médicos e uma para os enfermeiros, e depois criar a exibição medical_staff referindo-se à exibição dos médicos e dos enfermeiros:

CREATE TABLE employees (id INTEGER, title VARCHAR);
INSERT INTO employees (id, title) VALUES
    (1, 'doctor'),
    (2, 'nurse'),
    (3, 'janitor')
    ;

CREATE VIEW doctors as SELECT * FROM employees WHERE title = 'doctor';
CREATE VIEW nurses as SELECT * FROM employees WHERE title = 'nurse';
CREATE VIEW medical_staff AS
    SELECT * FROM doctors
    UNION
    SELECT * FROM nurses
    ;
Copy
SELECT * 
    FROM medical_staff
    ORDER BY id;
+----+--------+
| ID | TITLE  |
|----+--------|
|  1 | doctor |
|  2 | nurse  |
+----+--------+
Copy

Em muitos casos, em vez de escrever uma consulta grande e difícil de entender, você pode decompor a consulta em partes menores e criar uma exibição para cada uma dessas partes. Isso não só torna o código mais fácil de entender, mas em muitos casos também torna o código mais fácil de depurar porque você pode depurar uma exibição de cada vez em vez de toda a consulta.

Como uma exibição pode ser referenciada por muitas consultas diferentes, as exibições ajudam a aumentar a reutilização do código.

Exibições permitem o acesso a um subconjunto de uma tabela

Exibições permitem o acesso a apenas uma parte dos dados em uma ou mais tabelas. Por exemplo, suponha que você tenha uma tabela de registros médicos de pacientes. A equipe médica deve ter acesso a todas as informações médicas (por exemplo, diagnóstico), mas não às informações financeiras (por exemplo, o número do cartão de crédito do paciente). A equipe de contabilidade deve ter acesso às informações relacionadas às contas, tais como os custos de cada uma das prescrições dadas ao paciente, mas não aos dados médicos particulares, tais como o diagnóstico de um problema de saúde mental. Você pode criar duas exibições separadas, uma para a equipe médica e outra para a equipe de cobrança, de modo que cada uma dessas funções veja apenas as informações necessárias para desempenhar suas funções. As exibições permitem isso porque você pode conceder privilégios para uma determinada exibição a uma determinada função, sem que a função do beneficiário tenha privilégios sobre a(s) tabela(s) subjacente(s) à exibição.

No exemplo médico:

  • A equipe médica não teria privilégios sobre a(s) tabela(s) de dados, mas teria privilégios sobre a exibição mostrando diagnóstico e tratamento.

  • A equipe de contabilidade não teria privilégios sobre a(s) tabela(s) de dados, mas teria privilégios sobre a exibição mostrando informações de cobrança.

Para aumentar a segurança, o Snowflake oferece suporte para a definição de uma exibição como segura. Para obter mais detalhes sobre exibições seguras, consulte Como trabalhar com exibições seguras.

Exibições materializadas podem melhorar o desempenho

Exibições materializadas são projetadas para melhorar o desempenho. Exibições materializadas contêm uma cópia de um subconjunto dos dados em uma tabela. Dependendo da quantidade de dados na tabela e na exibição materializada, pode ser muito mais rápido percorrer a exibição materializada do que a tabela. Exibições materializadas também oferecem suporte para clustering, e você pode criar múltiplas exibições materializadas sobre os mesmos dados, clusterizando cada exibição materializada em uma coluna diferente, de modo que diferentes consultas podem ser executadas na exibição com o melhor clustering para aquela consulta.

Para obter mais detalhes, consulte Como trabalhar com exibições materializadas.

Limitações das exibições

  • Para limitações e notas de uso relacionadas à criação de exibições, consulte CREATE VIEW.

  • A definição de uma exibição não pode ser atualizada (ou seja, não é possível usar ALTER VIEW ou ALTER MATERIALIZED VIEW para alterar a definição de uma exibição). Para mudar uma definição de exibição, é preciso recriar a exibição com a nova definição.

  • As exibições são somente leitura (ou seja, não é possível executar comandos DML diretamente em uma exibição). Entretanto, você pode usar uma exibição em uma subconsulta dentro de uma instrução DML que atualiza a tabela base subjacente. Por exemplo:

    DELETE FROM hospital_table 
        WHERE cost > (SELECT AVG(cost) FROM accountant_view);
    
    Copy
  • As mudanças em uma tabela não são automaticamente propagadas para as exibições criadas sobre essa tabela. Por exemplo, se você remover uma coluna de uma tabela, as exibições dessa tabela podem se tornar inválidas.

  • Se a definição da exibição chamar a função CURRENT_DATABASE ou CURRENT_SCHEMA, a função avalia o banco de dados ou o esquema que contém a exibição, não o banco de dados ou o esquema da sessão que você especifica com um comando USE <objeto> ou seleciona com o seletor de contexto em Snowsight.