Perché la scansione SEQ può essere molto più veloce della scansione dell'indice e della scansione dell'indice in questa semplice query?

dba.stackexchange https://dba.stackexchange.com/questions/108129

Domanda

Sto usando PostgreSQL 9.4.4.Ho una query come questa:

 SELECT COUNT(*) FROM A,B WHERE A.a = B.b
.

A e B sono le chiavi principali delle tabelle A e B, quindi ci sono indici B su A & B

Per impostazione predefinita, PostgreSQL utilizzerà SEQ-Scan On AB e utilizzare Hash Iscriviti, lo costringerò a eseguire la scansione dell'indice e la scansione dell'Indice.

Il risultato ha dimostrato che, la scansione Seq è molto più veloce degli altri due, ci vuole più tempo per eseguire la scansione completa su A, B per la scansione dell'indice e la scansione dell'Indice.

Spiega Analyze Select Count (*) da Journal, carta in cui Journal.paper_id= Paper.Paper_id;

 Inserire l'immagine Descrizione qui

Qualcuno può spiegarlo?

Grazie mille!

È stato utile?

Soluzione 2

Conosco il motivo ora.

Ho bisogno di aspirare le tabelle prima di utilizzare la scansione solo dell'indice, altrimenti, se un numero sufficientemente elevato di pagine heap dove modificata dall'ultimo vuoto, il pianificatore non sceglie di utilizzare la scansione solo sull'indice.Quando è stata modificata solo una piccola quantità di pagine, potrebbe verificarsi una scansione di sola indice, che quindi coinvolge le recuperazioni del mucchio.

Se lo costringi a utilizzare solo la scansione dell'indice, remetterà i dati dalla tabella per ogni tupla scansionata, che può causare un ottimo costo.

Altri suggerimenti

Questa è una query abbastanza comune (perdonare il gioco del gioco! :-)) da persone che eseguono query che eseguono le scansioni della tabella completa (FTS), quando il poster ritiene che il sistema dovrebbe utilizzare l'indice (ES). .

Fondamentalmente, si riduce alla spiegazione data qui . Se i tavoli sono così piccoli, l'ottimizzatore dirà che "non vale la pena di andare in indice, facendo una ricerca e poi recuperando i dati, invece, continuerò solo in tutti i dati e scelgo quello di cui ho bisogno ", vale a dire eseguire un FTS.

[Modifica in risposta a @ Commento di @ TXSing]

per un MVCC ( Controllo concorrenza multi-versione ) Database, devi attraversare ogni Registra per un conteggio in un dato momento - Ecco perché, ad esempio, un conteggio (*) è molto più costoso per l'InnoDb di MySQL piuttosto che Myisam.

Un explanzamento eccellente (per PostgreSQL) è disponibile qui . Il ragazzo che ha scritto questo post è un "< Contributore principale " a PostgreSQL (grazie a @Dezso per portarmi a quel post).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a dba.stackexchange
scroll top