AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / dba / Perguntas / 143208
Accepted
John
John
Asked: 2016-07-08 00:57:37 +0800 CST2016-07-08 00:57:37 +0800 CST 2016-07-08 00:57:37 +0800 CST

Agrupar por em visualizações materializadas e planejamento de consulta [duplicado]

  • 772
Essa pergunta já tem resposta aqui :
Quais fatores entram na seleção do índice agrupado de uma exibição indexada? (1 resposta)
Fechado há 6 anos .

Em parte por curiosidade, me perguntei se poderia usar uma exibição indexada (materializada) para acelerar uma consulta de contagem em alguma tabela base.

A consulta é algo como

SELECT COUNT(*)
FROM BaseTable
WHERE Slot = ?;

então eu criei uma visão

CREATE VIEW IndexedView
WITH SCHEMABINDING AS
SELECT bt.Slot, COUNT_BIG(*) AS COUNT
FROM dbo.BaseTable bt
GROUP BY bt.Slot;

com um índice agrupado

CREATE UNIQUE CLUSTERED INDEX IX_Main
ON IndexedView (Slot);

E isso funciona, agora posso escrever a consulta original como

SELECT COUNT
FROM IndexedView
WHERE Slot = ?

e obter o resultado desejado muito mais rápido.

Infelizmente, dificilmente é muito útil para mim, pois minhas consultas geralmente não são feitas à mão. Eu realmente preciso que a consulta original se torne mais rápida usando a exibição indexada como uma espécie de índice para BaseTable- e acho que li em algum lugar que isso pode acontecer em algumas circunstâncias, mas de acordo com meus testes, não neste.

Então minha(s) pergunta(s) seria(m):

  • As exibições indexadas ainda podem me ajudar neste cenário de alguma forma?
  • Alguém pode recomendar fontes/literatura que explique em quais casos as exibições indexadas são usadas para otimizações de consultas nas tabelas em que se baseiam?

EDIT: Na pergunta duplicada - estou mais interessado no GROUP BY e no aspecto agregado de exibições indexadas. A resposta me ajudou a encontrar um erro estúpido que cometi, agora está funcionando para mim também.

JOYOUS ADDENDUM : Agora que funcionou, testei com sucesso que funciona até mesmo nos casos em que a consulta contém uma junção à esquerda naqueles casos em que a junção à esquerda pode de fato ser otimizada (ou seja, a cláusula on cobre um índice exclusivo na tabela unida).

Isso é realmente incrível, porque significa que, mesmo em casos de consulta com junções à esquerda, é possível projetar o esquema de forma que obter uma contagem total de linhas de tudo ou agrupamentos específicos seja rápido.

sql-server materialized-view
  • 1 1 respostas
  • 590 Views

1 respostas

  • Voted
  1. Best Answer
    wBob
    2016-07-08T04:38:54+08:002016-07-08T04:38:54+08:00

    O recurso é chamado de 'correspondência de visualização indexada' e pode ser complicado acertar. Há vários pré-requisitos descritos aqui: Resolução de índices em exibições , mais a exibição indexada precisa ser capaz de responder à pergunta que sua consulta está fazendo. Eu esperaria que funcionasse no Developer/Enterprise Edition para cenários diretos e consegui que funcionasse com um esquema e uma consulta simples:

    -- Indexed view matching
    USE tempdb
    GO
    
    IF OBJECT_ID('dbo.BaseTable') IS NOT NULL DROP TABLE dbo.BaseTable
    GO
    
    CREATE TABLE dbo.BaseTable (
    
        rowId       INT IDENTITY PRIMARY KEY,
    
        slot        INT NOT NULL,
        someDate    DATETIME DEFAULT GETDATE(),
        someData    UNIQUEIDENTIFIER DEFAULT NEWID(),
    )
    GO
    
    
    -- Add dummy data
    ;WITH cte AS (
    SELECT TOP 1000000 ROW_NUMBER() OVER ( ORDER BY ( SELECT 1 ) ) rn
    FROM master.sys.columns c1
        CROSS JOIN master.sys.columns c2
        CROSS JOIN master.sys.columns c3
    )
    INSERT INTO dbo.BaseTable ( slot, someDate, someData )
    SELECT
        rn % 999,
        DATEADD( day, rn % 333, '1 Jan 2016' ), 
        NEWID()
    FROM cte
    
    CHECKPOINT
    GO --10
    
    
    DECLARE @slot INT = 42
    
    SELECT COUNT(*)
    FROM dbo.BaseTable
    WHERE Slot = @slot
    OPTION ( RECOMPILE );
    GO
    
    CREATE VIEW dbo.IndexedView
    WITH SCHEMABINDING AS
    SELECT bt.Slot, COUNT_BIG(*) AS COUNT
    FROM dbo.BaseTable bt
    GROUP BY bt.Slot;
    GO
    
    CREATE UNIQUE CLUSTERED INDEX IX_Main
    ON IndexedView (Slot);
    GO
    
    
    -- Indexed view matching
    DECLARE @slot INT = 42
    
    SELECT COUNT(*)
    FROM dbo.BaseTable
    WHERE Slot = @slot
    OPTION ( RECOMPILE );
    GO
    
    
    -- Indexed view not used as it can't 'cover' the query
    DECLARE @slot INT = 42
    
    SELECT COUNT(*)
    FROM dbo.BaseTable
    WHERE Slot = @slot
    AND rowId = 42
    OPTION ( RECOMPILE );
    GO
    
    
    -- Query Indexed view directly with NOEXPAND hint
    DECLARE @slot INT = 42
    
    SELECT COUNT(*)
    FROM dbo.IndexedView WITH ( NOEXPAND )
    WHERE Slot = @slot
    OPTION ( RECOMPILE );
    GO
    
    
    -- EXPAND VIEWS hint ensures Indexed view is NOT used.
    DECLARE @slot INT = 42
    
    SELECT COUNT(*)
    FROM dbo.IndexedView 
    WHERE Slot = @slot
    OPTION ( RECOMPILE, EXPAND VIEWS );
    GO
    

    Plano de execução:

    Correspondência de visualização indexada

    Existem algumas outras consultas no meu script de teste acima e você pode ver que a exibição indexada não é usada para algumas delas.

    Aqui estão algumas citações sobre exibições indexadas de um dos arquitetos do otimizador de consulta, Conor Cunningham:

    O otimizador de consulta contém lógica para usar esse índice nos casos em que o texto da consulta original referenciou explicitamente a exibição, bem como nos casos em que o usuário envia uma consulta que usa os mesmos componentes da exibição (em qualquer ordem equivalente).

    mas ...

    [complexidade] ... torna difícil para o otimizador de consulta considerar planos que executam primeiro a avaliação da exibição e, em seguida, processam o restante da consulta. A correspondência arbitrária de árvores é um problema computacionalmente complexo e o conjunto de recursos de visualizações é muito grande para executar essa operação com eficiência.

    'Internos do Microsoft SQL Server 2008', Capítulo 8: O otimizador de consultas - Conor Cunningham

    ...exibições indexadas funcionam para consultas SPJG básicas (SELECT-PROJECT-JOIN-GROUPBY). As uniões devem ser uniões internas, não autojunções, e devem ser unificadas em uma chave. Cada operadora tem uma série de restrições...

    fonte

    Acho que essas citações são bastante reveladoras. Você também pode querer considerar índices filtrados.

    • 6

relate perguntas

  • SQL Server - Como as páginas de dados são armazenadas ao usar um índice clusterizado

  • Preciso de índices separados para cada tipo de consulta ou um índice de várias colunas funcionará?

  • Quando devo usar uma restrição exclusiva em vez de um índice exclusivo?

  • Quais são as principais causas de deadlocks e podem ser evitadas?

  • Como determinar se um Índice é necessário ou necessário

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host

    • 12 respostas
  • Marko Smith

    Como fazer a saída do sqlplus aparecer em uma linha?

    • 3 respostas
  • Marko Smith

    Selecione qual tem data máxima ou data mais recente

    • 3 respostas
  • Marko Smith

    Como faço para listar todos os esquemas no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    Como usar o sqlplus para se conectar a um banco de dados Oracle localizado em outro host sem modificar meu próprio tnsnames.ora

    • 4 respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Martin Hope
    Jin conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane Como faço para listar todos os esquemas no PostgreSQL? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh Por que o log de transações continua crescendo ou fica sem espaço? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland Listar todas as colunas de uma tabela especificada 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney O MySQL pode realizar consultas razoavelmente em bilhões de linhas? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx Como posso monitorar o andamento de uma importação de um arquivo .sql grande? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST

Hot tag

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve