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 / 140425
Accepted
Jonesome Reinstate Monica
Jonesome Reinstate Monica
Asked: 2016-06-05 23:32:12 +0800 CST2016-06-05 23:32:12 +0800 CST 2016-06-05 23:32:12 +0800 CST

Qual índice será usado neste cenário?

  • 772

SQL Server 2014 Standard Edition

Preciso encontrar o número de voos de e para cidades específicas em determinados meses. Por exemplo

select count(*) 
from flights 
where flightTo_AirportCode = 'aaaa' 
and flightFrom_Airportcode = 'bbbb' 
and flightdate < '2016-04-01' 
and flightdate > '2016-02-28' ;

O esquema da tabela está abaixo.

Estou tentando estimar se o modelo de índiceA ou o modelo de índiceB (abaixo) é preferível (leva muitas horas para construir o índice e o espaço em disco permite que apenas um exista por vez, então estou tentando olhar antes de saltar).

Pela minha experiência, qualquer um dos índices serve. Estou certo?

  create index [modelA] on flights (flightTo_AirportCode, flightFrom_AirportCode, flightDate)

  create index [modelB] on flights (flightDate, flightTo_AirportCode, flightFrom_AirportCode)

(Ou, melhor, existe um índice binário ou mecanismo avançado que posso usar para abordar isso?)

CREATE TABLE [dbo].[flights](
    [flightId] [uniqueidentifier] NOT NULL,
    [accountId] [uniqueidentifier] NULL,
    [flightDate] [datetime] NULL,
    [flightTo_AirportCode] [nvarchar](30) NULL,
    [flightFrom_AirportCode] [nvarchar](30) NULL,
    -- ... 45 more fields
    CONSTRAINT [PK_flight] PRIMARY KEY CLUSTERED 
(
    [flightId] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 70) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
sql-server sql-server-2014
  • 1 1 respostas
  • 461 Views

1 respostas

  • Voted
  1. Best Answer
    ypercubeᵀᴹ
    2016-06-05T23:43:57+08:002016-06-05T23:43:57+08:00

    O índice A é melhor para esta consulta. Quando todas as condições no WHEREforem verificações de igualdade, exceto uma que esteja usando uma condição de intervalo ou INoperador em uma coluna, a última coluna deverá ser a última no índice, depois de todas as colunas que tiverem uma verificação de igualdade.

    Isso permite que o otimizador use uma busca de índice para a primeira linha que corresponda às condições e, em seguida, atravesse o índice até encontrar uma linha que não corresponda a ela. Todas as linhas intermediárias também correspondem.

    Portanto, o melhor índice para esta consulta seria (to, from, date)(seu modelo A) ou (from, to, date).

    O índice do modelo B tem a data primeiro, portanto não é o melhor, embora ainda seja um índice de cobertura para a consulta. Se isso fosse usado, o plano de consulta seria quase o mesmo. Um índice procura encontrar a primeira linha que corresponde à condição de intervalo ( date > '2016-02-28') e, em seguida, percorre o índice até encontrar uma linha que não corresponda ao date < '2016-04-01'. Mas todas as linhas intermediárias não correspondem necessariamente às outras 2 condições, portanto, elas teriam que ser verificadas em relação a essas condições e (possivelmente muitas delas) rejeitadas.

    Portanto, embora os planos sejam semelhantes, o plano do modelo A teria que passar apenas pela parte do índice que possui todas as linhas necessárias e apenas elas, enquanto o plano do modelo B passaria por uma parte (possivelmente muito) maior do índice.


    • Também seria melhor usar um formato 100% seguro para datas ( YYYYMMDD).

    • E se você quiser as datas em março, deve usar um cheque inclusivo-exclusivo:

      AND flightdate >= '20160301' AND flightdate < '20160401' 
      

      Garantido para trabalhar com tipos de data e data e hora. Sua consulta atual incluirá também qualquer linha que tenha '2016-02-28'apenas um horário diferente de '00:00:00'(você pode garantir que não há nenhum?) que presumo que você não queira. O método inclusivo-exclusivo também funcionará em anos bissextos (lembrando que 2016 é um ano bissexto, então havia uma data de 29 de fevereiro também que sua consulta retornará).

    Leia também estas postagens de blog de Aaron Bertrand:

    • O que ENTRE e o diabo têm em comum?
    • Maus hábitos para eliminar: manipulação incorreta de consultas de data/intervalo
    • 18

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