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 / 11689
Accepted
Gnomo
Gnomo
Asked: 2010-09-10 10:31:11 +0800 CST2010-09-10 10:31:11 +0800 CST 2010-09-10 10:31:11 +0800 CST

Interpretando um plano de execução

  • 772

Preciso de ajuda para analisar alguns planos simples de execução do t-sql. Tenho uma tabela [User] com as 3 colunas a seguir:

Id(chave primária), nome de usuário(nvarchar(50)), nome(nvarchar(50))

Eu criei um índice não agrupado exclusivo para a coluna de nome de usuário

O plano de execução para uma filtragem de consulta por FirstName:

select * from [User] where FirstName ='John'

mostra um Clustered Index Scan com um custo total de 0,0033095

O plano de execução para outra filtragem de consulta por nome de usuário:

select * from [User] where Username = 'johndoe'

mostra um loop aninhado contendo um Index Seek seguido por um Clustered Index Seek com um custo total de 0,00657038! isso é o dobro do custo da consulta anterior e não entendi!

Há um índice associado à coluna Username e nenhum índice associado a FirstName, espero que a segunda consulta seja mais rápida.

sql-server index
  • 3 3 respostas
  • 184 Views

3 respostas

  • Voted
  1. SQLMenace
    2010-09-10T10:37:12+08:002010-09-10T10:37:12+08:00

    O custo total quase sempre não é confiável para coisas como esta

    eu usaria STATISTICS IOe STATISTICS TIMEem vez disso

    execute as duas consultas e observe a diferença nas leituras

    SET STATISTICS IO ON
    select * from [User] where FirstName ='John'
    select * from [User] where Username = 'johndoe
    SET STATISTICS IO OFF
    

    e você também pode ver a hora usando este

    SET STATISTICS TIME ON
    select * from [User] where FirstName ='John'
    select * from [User] where Username = 'johndoe'
    SET STATISTICS TIME OFF
    
    • 7
  2. gbn
    2010-09-10T10:52:42+08:002010-09-10T10:52:42+08:00

    Exatamente como esperado... :-)

    A primeira será uma varredura clusterizada/PK direta

    A segunda será uma busca de índice na coluna UserName seguida por uma pesquisa de chave/marcador no índice clusterizado.

    Você normalmente faria o índice em UserName em um índice de cobertura ... o que geralmente é inútil de SELECT *qualquer maneira.

    Perguntas relacionadas ao SO:

    • O que é melhor: Bookmark/Key Lookup ou Index Scan
    • Pesquisa de favoritos do SQL Server 2K
    • 6
  3. Best Answer
    ErikE
    2010-09-10T20:24:17+08:002010-09-10T20:24:17+08:00

    Pela sua pergunta, deduzo que sua mesa é relativamente pequena. À medida que você colocar mais linhas na tabela, descobrirá que a pesquisa de favoritos permanece praticamente a mesma e a verificação leva cada vez mais tempo. Eventualmente, a digitalização custará muitas vezes mais do que a pesquisa de favoritos.

    Como o SQLMenace disse, os custos do plano de execução geralmente não são confiáveis. Use o Query Profiler ou SET STATISTICS para ver quais recursos estão realmente sendo consumidos por cada consulta.

    Por fim, certifique-se de que as estatísticas sejam atualizadas em sua tabela ou o mecanismo poderá fazer escolhas ruins sobre quais índices ou tabelas usar em qual ordem.

    • 4

relate perguntas

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

  • Quanto "Padding" coloco em meus índices?

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

  • O que significa "índice" em RDBMSs? [fechado]

  • Como criar um índice condicional no MySQL?

Sidebar

Stats

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

    Como fazer um mysqldump com um banco de dados de uso no dump

    • 4 respostas
  • Marko Smith

    No MySQL Workbench, insira uma nova coluna no "topo" de uma tabela?

    • 4 respostas
  • Marko Smith

    SQL Server - Tabelas temporárias x físicas

    • 3 respostas
  • Marko Smith

    Quando uma varredura de tabela completa é melhor que uma varredura de índice?

    • 4 respostas
  • Marko Smith

    Qual é a diferença entre Shrink Database e File?

    • 3 respostas
  • Marko Smith

    Problema de coleta de lixo Sql FILESTREAM

    • 1 respostas
  • Marko Smith

    Problemas de DBCC do SQL Server 2008

    • 2 respostas
  • Marko Smith

    Como você para, coloca offline e exclui um banco de dados SQL Server em recuperação?

    • 2 respostas
  • Marko Smith

    Como faço para restaurar um banco de dados do SQL Server 2000 para uma instância do SQL Server 2008?

    • 5 respostas
  • Marko Smith

    Desempenho atingido usando CAST em T-SQL

    • 3 respostas
  • Martin Hope
    user481826 Como fazer um mysqldump com um banco de dados de uso no dump 2010-10-29 16:08:59 +0800 CST
  • Martin Hope
    Will A SQL Server - Tabelas temporárias x físicas 2010-07-05 08:46:10 +0800 CST
  • Martin Hope
    NibblyPig Particionamento de tabelas no SQL 2008 - Por quê? 2010-06-30 00:59:23 +0800 CST
  • Martin Hope
    Gnomo Interpretando um plano de execução 2010-09-10 10:31:11 +0800 CST
  • Martin Hope
    ahsan Quando uma varredura de tabela completa é melhor que uma varredura de índice? 2010-12-10 10:16:54 +0800 CST
  • Martin Hope
    Tom DeMille Devo reduzir regularmente meu banco de dados ou pelo menos meu arquivo de log? 2010-04-24 08:19:19 +0800 CST
  • Martin Hope
    Jango Qual é a diferença entre Shrink Database e File? 2010-08-24 10:25:42 +0800 CST
  • Martin Hope
    CrapHands Como você para, coloca offline e exclui um banco de dados SQL Server em recuperação? 2010-12-18 07:12:36 +0800 CST
  • Martin Hope
    Ryan Delucchi Desempenho atingido usando CAST em T-SQL 2010-07-02 15:11:16 +0800 CST
  • Martin Hope
    Manjot SQL 2005: Podemos determinar quanto o trabalho de manutenção do índice de reconstrução pode aumentar os arquivos de log do banco de dados? 2010-08-12 18:40:44 +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