Índices para Iniciantes Fabrício Lima MVP Data Platform Índices para Iniciantes
Fabrício Lima Vitória-ES 11 anos de SQL Server CEO Fabricio Lima Soluções em BD Pass Chapter Leader do SQL Server ES Palestrante em eventos (8º SQLSAT) Blog sobre SQL Server MVP Data Platform
Patrocinadores Observação – Citar que o evento é gratuito e que os patrocinadores são os responsáveis por garantir o café da manhã, lanche da tarde e infraestrutura básica do evento. Em contrapartida eles desejam mostrar seus produtos e serviços. É bacana que vocês (público) conheçam eles e aceitem receber mailing.
Índices no SQL Server Tarefas do dia a dia de um DBA Índices são estruturas em disco organizadas em estrutura de árvore para facilitar nossas buscas. Tarefas do dia a dia de um DBA Leitura Complementar: https://www.simple-talk.com/sql/learn-sql-server/sql-server-index-basics/ http://www.sql-server-performance.com/2007/clustered-indexes/ http://www.mssqltips.com/sqlservertip/1206/understanding-sql-server-indexing/ http://www.mssqltips.com/sql-server-tip-category/38/indexing/ http://blogs.msdn.com/b/timchapman/archive/2012/09/28/index-rebuild-vs-reorganize-the-transaction-log-edition.aspx Livro: http://www.amazon.com/Expert-Performance-Indexing-Server-2012/dp/1430237414
Heap, Clustered e Nonclustered Heap – Tabela sem um índice clustered. Índice Clustered – É a própria tabela armazenada de forma estruturada/ordenada pela chave que você definiu na criação do índice O nível folha contém todas as colunas da tabela Só pode ter um por tabela Índice Nonclustered – É uma estrutura independente formada pelas colunas do índice nonclustered e possui um RID/ClusterKey para acessar a tabela (Heap ou Cluster) Não contém todos os dados da tabela Podemos ter mais de um por tabela (até 999 se tiver coragem) Tarefas do dia a dia de um DBA Leitura Complementar: http://www.fabriciolima.net/blog/2010/11/30/casos-do-dia-a-dia-exclusao-de-um-indice-grande-e-pouco-utilizado/
Índice Cluster Cenário: TABELA com 3 colunas: LastName (clustered) Name (Nonclustered) Dt_Nascimento Consulta 1: Select Lastname from TABELA where Lastname = 'Domingues’ Consulta 2: Select * where Lastname = 'Domingues' 10/05/2000 18/06/1981 10/05/2002 14/08/1985 10/05/2008 16/06/1982 10/05/2005 14/09/1989 10/05/2000 18/06/1981 10/05/2002 14/08/1985 10/05/2008 16/06/1982 10/05/2005 14/09/1989 10/05/2000 18/06/1981 10/05/2002 14/08/1985 10/05/2008 16/06/1982 10/05/2005 14/09/1989 10/05/2000 18/06/1981 10/05/2002 14/08/1985 10/05/2008 16/06/1982 10/05/2005 14/09/1989 Vídeo em inglês muito bom para entendimento do funcionamento dos índices: https://www.youtube.com/watch?v=p9FlnOPltA8
Índice Não-Cluster Cenário: TABELA com 3 colunas: LastName (clustered) Name (Nonclustered) Dt_Nascimento Consulta 1: Select Lastname, Name from TABELA where Name = 'Anabela' Consulta 2: Select * Consulta 3: where Dt_Nascimento = '20150421' 10/05/2010 18/06/1981 10/05/2002 14/08/1985 10/05/2008 16/06/1982 10/05/2005 14/09/1979 10/05/2000 18/06/1981 10/05/2002 14/08/1985 10/05/2008 16/06/1982 10/05/2005 14/09/1969 10/05/2008 18/06/1981 10/05/2002 14/08/1985 21/04/2015 16/06/1982 10/05/2005 14/09/1959 10/05/2001 18/06/1981 10/05/2002 14/08/1985 10/05/2008 16/06/1982 10/05/2005 14/09/1979
Índice Nonclustered + CLustered
Índice Nonclustered + Heap
DEMO (a gosto do freguês)
Criação de índices “Quando você cria um índice que melhora uma query de 10 minutos para 1 minuto ou de 1 minuto para 1 segundo.” Reação DBA Reação Usuário
Criação de índices “Quando o cliente diz que já otimizou o banco com a criação de alguns índices.”
Include, FillFactor e PageSplit INCLUDE: Inclui as colunas apenas no Leaf Level do índice, deixando os outros níveis menores. É utilizado para que não seja necessário acessar o índice clustered ou heap para pegar uma coluna utilizada na query (covered index). FILLFACTOR: Especifica o percentual de preenchimento das páginas dos índices. O Default do SQL Server é criar o FILLFACTOR com o valor 0, que na verdade é igual a 100%! Page Split: Quando você faz um update/insert e uma página está cheia, outra página é criada e os registros são divididos entre elas. Leitura Complementar: http://www.fabriciolima.net/blog/2011/02/07/querys-do-dia-a-dia-como-visualizar-as-colunas-include-de-um-indice/ http://fabriciolima.net/blog/2011/02/26/qual-o-valor-ideal-para-o-fillfactor-de-um-indice/
FILLFACTOR “Quando o cliente diz que colocou o FILLFACTOR em 10% para reduzir a Fragmentação dos Índices.”
DEMO (a gosto do freguês)
Fragmentação
Fragmentação REORGANIZE: Não utiliza espaço em disco a mais para realizar essa operação Reorganiza os LEAF LEVEL dos índices Não atualiza as estatísticas dos índices Se cancelar o comando, não perde o que foi feito. O REBUILD perde. REBUILD: Utiliza espaço em disco temporário para realizar o REBUILD Destrói o índice e cria novamente Atualiza as estatísticas dos índices Causa um Lock grande na tabela quando executado de forma OFFLINE. A versão Enterprise do SQL permite que se execute um REBUILD ONLINE.
Fica Tranquilo Walter(Walt), eu tenho um Job de Rebuild!!! Fragmentação Fica Tranquilo Walter(Walt), eu tenho um Job de Rebuild!!! Para quem não conhece, esse é o Walter!
DEMO (a gosto do freguês)
DMV - Utilização de Índices no SQL Server dm_db_index_usage_stats – Essa DMV informa quantas vezes um índice foi utilizado desde a última vez que o SQL Server foi reiniciado. (Informação valiosa) BUG no SQL 2012 e 2014 (reinicia com REBUILD): http://www.littlekendra.com/2016/05/18/index-usage-stats-bug-fixed-in-sql-server-2012-sp2-cu12-sp3-cu3/ Para não perder informação em caso de restart do SQL, crio uma rotina que guarda essa informação de forma diária. Muito útil para decidir na exclusão de um índice
DMV – Dicas de Criação de Índices Exemplo de uma sugestão indevida de um índice que já existe.
DMV – Dicas de Criação de Índices sys.dm_db_missing_index_* – Esse conjunto de DMVs informam alguns índices que poderiam ser criados no banco de dados. Considerações para utilização: Analisar a qtd de colunas do índice que está sendo sugerido Analisar o tamanho da tabela, a quantidade de vezes que o índice seria utilizado e o impacto Analisar se já não existe um índice parecido com o que foi sugerido Após criar o índice, acompanhar com a DMV de utilização se esse índice foi utilizado ou não Em caso de pouca utilização, exclua o índice As vezes essa DMV indica índices que já existem (não é 100% confiável) NUNCA CRIE TODOS OS ÍNDICES INDICADOS POR ESSA DMV Leitura Complementar: http://blogs.msdn.com/b/bartd/archive/2007/07/19/are-you-using-sql-s-missing-index-dmvs.aspx http://www.sql-server-performance.com/2009/identify-missing-indexes-using-sql-server-dmvs/ http://www.mssqltips.com/sqlservertip/1634/using-sql-server-dmvs-to-identify-missing-indexes/
Referências Índices: PAGE Split: Livro: https://www.simple-talk.com/sql/learn-sql-server/sql-server-index-basics/ http://www.sql-server-performance.com/2007/clustered-indexes/ http://www.mssqltips.com/sqlservertip/1206/understanding-sql-server-indexing/ http://www.mssqltips.com/sql-server-tip-category/38/indexing/ http://blogs.msdn.com/b/timchapman/archive/2012/09/28/index-rebuild-vs-reorganize-the-transaction-log-edition.aspx https://www.youtube.com/watch?v=p9FlnOPltA8 http://blogs.msdn.com/b/bartd/archive/2007/07/19/are-you-using-sql-s-missing-index-dmvs.aspx http://www.sql-server-performance.com/2009/identify-missing-indexes-using-sql-server-dmvs/ http://www.mssqltips.com/sqlservertip/1634/using-sql-server-dmvs-to-identify-missing-indexes/ PAGE Split: http://www.sqlskills.com/blogs/paul/tracking-page-splits-using-the-transaction-log/ http://sqlblogcasts.com/blogs/tonyrogerson/archive/2007/06/28/what-is-a-page-split-what-happens-why-does-it-happen-why-worry.aspx Livro: http://www.amazon.com/Expert-Performance-Indexing-Server-2012/dp/1430237414 http://www.amazon.com/Server-Query-Performance-Tuning-Experts/dp/1430242035
Dicas de Materiais Grátis Livros: http://www.microsoftvirtualacademy.com/ebooks http://www.fabriciolima.net/blog/2010/12/03/free-ebooks-sobre-sql-server-para-download/ http://www.johnsansom.com/dba-jumpstart/ http://www.red-gate.com/products/dba/dba-bundle/entrypage/2012-how-to-become-an-exceptional-dba?utm_source=simpletalk&utm_medium=weblink&utm_content=st_bradbook200907&utm_campaign=sqlbackupbundle&__hstc=81186632.bdbc59f5f888a85d2c87a85f9b4a38d9.1441479079284.1441479079284.1441479079284.1&__hssc=81186632.1.1441479079284&__hsfp=2767783758 http://www.red-gate.com/community/books/accidental-dba Vídeo Aulas: http://www.microsoftvirtualacademy.com/product-training/sql-server http://www.microsoftvirtualacademy.com/product-training/product-sql-server-pt https://technet.microsoft.com/en-us/dn912438 PodCast do DatabaseCast sobre manutenção de Banco de dados https://www.youtube.com/watch?v=Yvd9b4yRiHE&t=910s Whitepaper SQL https://technet.microsoft.com/en-us/sqlserver/bb671430 Blos que o Fabricio Lima acompanha https://www.fabriciolima.net/blog/2017/03/14/video-blogs-sobre-sql-server-que-o-fabricio-lima-acompanha/
http://www.sqlsaturday.com/618 30/09 – São Paulo 21/10 – Rio de Janeiro 18/11 - Salvador Observação – Convidar os participantes para prestigiarem o próximo SQL Saturday que será em Brasília no dia 19 de Agosto. Assim como, lembrá-los que também acontecerá SQL Saturday em SP, RJ e Salvador.
Contatos contato@fabriciolima.net fabriciolima.net @Fabriciodba www.facebook.com/pages/Fabricio-Lima-Consultoria-SQL-Server/239658476126229 br.linkedin.com/in/FabricioLimaSolucoesEmBD fabriciolima.net @Fabriciodba http://www.fabriciolima.net/blog/
Dúvidas
Apoio