Fehlenden Index finden

Fehlenden Index finden

am 11.01.2011 12:25:32 von Thomas Guettler

Hallo,

ich bin auf der Suche nach Tabellen, die keinen Index haben.

Dafür habe ich mir folgendes Statement erstellt:

select
relname, seq_scan-idx_scan as too_much_seq, case when seq_scan-idx_scan>0 =
then 'Missing Index?' else 'OK' END,
pg_relation_size(relname) as rel_size, seq_scan, idx_scan from pg_stat_all_=
tables
where schemaname=3D'public' and pg_relation_size(relname)>40000
order by too_much_seq desc;


relname | too_much_seq | case | rel_s=
ize | seq_scan | idx_scan
------------------------------------+--------------+-------- --------+------=
-----+----------+----------
modwork_belegart | 29879747 | Missing Index? | 4=
9152 | 31255169 | 1375422
modwork_emailweiterleitungsadresse | 1395 | Missing Index? | 4=
9152 | 1560 | 165
django_admin_log | 327 | Missing Index? | 11=
4688 | 708 | 381
modwork_notizen_notiz | -138 | OK | 18=
8416 | 876 | 1014
modwork_rdiforms_onlineformular | -1837 | OK | 4=
0960 | 7574 | 9411
modwork_notizen_vertrag | -5366 | OK | 75=
3664 | 1461 | 6827

Bei kleinen Tabellen wird der Index nicht verwendet. Ist modwork_belegart m=
it 49152 so eine Tabelle?

Wie könnte ich die Stelle in meinem Code finden, die bei dieser Tabelle e=
in seq. Scan macht? Gibt
es die Möglichkeit, das Postgres die Anfrage abbricht, sobald auf einer b=
estimmten Tabelle
ein seq. Scan durchgeführt wird?

Das Statement ist von hier inspiriert:
http://www.postgresonline.com/journal/index.php?/archives/65 -How-to-determi=
ne-which-tables-are-missing-indexes.html

Gruß,
Thomas

--=20
Thomas Guettler, http://www.thomas-guettler.de/
E-Mail: guettli (*) thomas-guettler + de

--=20
Sent via pgsql-de-allgemein mailing list (pgsql-de-allgemein@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-de-allgemein

Re: Fehlenden Index finden

am 11.01.2011 14:36:48 von Andreas Kretschmer

Am 11.01.2011 12:25, schrieb Thomas Guettler:
> Hallo,
>=20
> ich bin auf der Suche nach Tabellen, die keinen Index haben.

Das ist per se nix schlechtes.



>=20
> Bei kleinen Tabellen wird der Index nicht verwendet. Ist modwork_belega=
rt mit 49152 so eine Tabelle?

Ob ein Index verwendet wird, hängt von der Abfrage ab. Nochmals: ein
Seq-Scan ist per se nix schlimmes.


>=20
> Wie könnte ich die Stelle in meinem Code finden, die bei dieser Tabel=
le ein seq. Scan macht? Gibt

Du solltest lang laufende Abfragen mitloggen (log_min_duration passend
setzen). Dann kannst Du Dir solche Abfragen anschauen, und zwar mit
explain analyse . Je nach Abfrage können Indexe helfen,
müssen aber nicht. Dein Versuch, fehlende Indexe automatisiert zu
finden, ist, sorry, naiv. Manchmal helfen z.B. funktionale oder
konditionale Indexe. Diese wirst Du nicht automatisiert finden.

Nochmal: Indexe müssen zur Abfrage passen.


> es die Möglichkeit, das Postgres die Anfrage abbricht, sobald auf ein=
er bestimmten Tabelle
> ein seq. Scan durchgeführt wird?

Nein. Du kannst seq-scans disablen, aber dadurch bekommen diese auch nur
eine sehr hohe Kostenschätzung. Ist Dir das Kostenmodell bekannt?



Andreas
--=20
Andreas Kretschmer
http://internet24.de

--=20
Sent via pgsql-de-allgemein mailing list (pgsql-de-allgemein@postgresql.o=
rg)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-de-allgemein

Re: Fehlenden Index finden

am 11.01.2011 15:28:28 von Thomas Guettler

Hallo Andreas,=09

Andreas Kretschmer wrote:
> Am 11.01.2011 12:25, schrieb Thomas Guettler:
>> Hallo,
>>
>> ich bin auf der Suche nach Tabellen, die keinen Index haben.
>=20
> Das ist per se nix schlechtes.
>=20
>> Bei kleinen Tabellen wird der Index nicht verwendet. Ist modwork_belegar=
t mit 49152 so eine Tabelle?
>=20
> Ob ein Index verwendet wird, hängt von der Abfrage ab. Nochmals: ein
> Seq-Scan ist per se nix schlimmes.

In kleinen Tabellen ist es OK, ab ein paar tausend Zeilen ist es aber in
der Regel nicht angebracht (aus meiner Sicht, du hast sicherlich mehr Erfah=
rung).

>=20
>=20
>> Wie könnte ich die Stelle in meinem Code finden, die bei dieser Tabell=
e ein seq. Scan macht? Gibt
>=20
> Du solltest lang laufende Abfragen mitloggen (log_min_duration passend
> setzen). Dann kannst Du Dir solche Abfragen anschauen, und zwar mit
> explain analyse . Je nach Abfrage können Indexe helfen,
> müssen aber nicht.

"explain analyze" kenne ich und log_min_duration auch. Wenn aber eine Abfra=
ge
ständig zB 2s braucht und log_min_duration bei 3s, fällt es nicht auf.

> Dein Versuch, fehlende Indexe automatisiert zu
> finden, ist, sorry, naiv. Manchmal helfen z.B. funktionale oder
> konditionale Indexe. Diese wirst Du nicht automatisiert finden.

Große seq. Scans würden mit dieser Methode auf jeden Fall auffallen. Na=
iv wäre
es, wenn man denkt, dass dann alles perfekt wäre. Aber ein Fehler ist die=
se Abfrage
sicherlich nicht.

>> es die Möglichkeit, das Postgres die Anfrage abbricht, sobald auf eine=
r bestimmten Tabelle
>> ein seq. Scan durchgeführt wird?
>=20
> Nein. Du kannst seq-scans disablen, aber dadurch bekommen diese auch nur
> eine sehr hohe Kostenschätzung. Ist Dir das Kostenmodell bekannt?

Ich kenne das Vorgehen von Postgres im Groben. Das regelmäßige ANALYZE =
wird auch
durchgeführt.

Thomas


PS: Bist du im März wieder in Chemnitz?
http://chemnitzer.linux-tage.de/2011/

--=20
Thomas Guettler, http://www.thomas-guettler.de/
E-Mail: guettli (*) thomas-guettler + de

--=20
Sent via pgsql-de-allgemein mailing list (pgsql-de-allgemein@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-de-allgemein

Re: Fehlenden Index finden

am 11.01.2011 15:56:38 von Andreas Kretschmer

Am 11.01.2011 15:28, schrieb Thomas Guettler:
> Hallo Andreas,=09
>=20
> Andreas Kretschmer wrote:
>> Am 11.01.2011 12:25, schrieb Thomas Guettler:
>>> Hallo,
>>>
>>> ich bin auf der Suche nach Tabellen, die keinen Index haben.
>>
>> Das ist per se nix schlechtes.
>>
>>> Bei kleinen Tabellen wird der Index nicht verwendet. Ist modwork_bele=
gart mit 49152 so eine Tabelle?
>>
>> Ob ein Index verwendet wird, hängt von der Abfrage ab. Nochmals: ein
>> Seq-Scan ist per se nix schlimmes.
>=20
> In kleinen Tabellen ist es OK, ab ein paar tausend Zeilen ist es aber i=
n
> der Regel nicht angebracht (aus meiner Sicht, du hast sicherlich mehr E=
rfahrung).

Indexe nützen z.B. exakt gar nix, wenn die komplette Tabelle als
Resultat dient. Oder zumindest sehr große Teile daraus. Falls Du also
Abfragen auf große Tabellen hast, die eh immer die komplette Tabelle
liefern, dann bremsen Indexe lediglich schreibende Zugriffe.

Und Indexe auf Spalte A nützen für Abfragen, wo Spalte B im WHERE ist=
,
auch nix.

Du siehst, Deine Frage bzgl Deine Tabelle modwork_belegart ist ohne
Detailwissen zur Abfrage selbst nicht beantwortbar.




> PS: Bist du im März wieder in Chemnitz?
> http://chemnitzer.linux-tage.de/2011/

Ja.


Andreas
--=20
Andreas Kretschmer
http://internet24.de

--=20
Sent via pgsql-de-allgemein mailing list (pgsql-de-allgemein@postgresql.o=
rg)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-de-allgemein