Es geht um einen Artikelstamm mit ~50000 Artikeln.
Es kann mehrere Artikel mit der gleichen Nummer geben, davon ist aber immer nur einer aktuell. (Deswegen das gueltig_ab)
Das Ganze soll für den Benutzer dynamisch laufen.
Pro eingebener Ziffer nähert sich das Ergebnis an die Artikelnummer an und gibt 11 Einträge zurück.
So sehen die Abfragen aus wenn der Benutzer 12 eintippt
select distinct SUBSTRING(artnr,1,2)
from stammdaten.artikelstamm as a where gueltig_ab = (select gueltig_ab from stammdaten.artikelstamm
where artnr = a.artnr and artnr_zusatz = a.artnr_zusatz order by gueltig_ab desc limit 1) and artnr like ‘1%’ limit 11
select distinct SUBSTRING(artnr,1,3)
from stammdaten.artikelstamm as a where gueltig_ab = (select gueltig_ab from stammdaten.artikelstamm
where artnr = a.artnr and artnr_zusatz = a.artnr_zusatz order by gueltig_ab desc limit 1) and artnr like ‘12%’ limit 11
allerdings dauert es ~5 min bis pg mir ein Ergebnis liefert
Was spräche dagegen, ein extra Feld ‘gueltig’ als BOOL zu machen und einen uniqe Index zu machen?
test=*# \d artikel
Table "public.artikel"
Column | Type | Modifiers
-------------+---------+-----------
nr | text |
bezeichnung | text |
gueltig_ab | date |
gueltig | boolean |
test=*# create unique index idx_art on artikel(nr, gueltig) where gueltig = 't'::bool;
CREATE INDEX
test=*# commit;
COMMIT
test=# select * from artikel ;
nr | bezeichnung | gueltig_ab | gueltig
----+-------------+------------+---------
(0 rows)
test=*# insert into artikel values ('1000', 'art1', '2007-01-01'::date, 'f');
INSERT 0 1
test=*# insert into artikel values ('1000', 'art1', '2007-02-01'::date, 'f');
INSERT 0 1
test=*# insert into artikel values ('1000', 'art1', '2007-03-01'::date, 'f');
INSERT 0 1
test=*# insert into artikel values ('1000', 'art1', '2007-04-01'::date, 't');
INSERT 0 1
test=*# insert into artikel values ('1000', 'art1', '2007-05-01'::date, 't');
ERROR: duplicate key violates unique constraint "idx_art"
test=!#
Damit ist immer nur einer gültig, und Dein Select kann dieses gueltig-Feld nutzen.
So sehen die Abfragen aus wenn der Benutzer 12 eintippt
select distinct SUBSTRING(artnr,1,2)
from stammdaten.artikelstamm as a where gueltig_ab = (select gueltig_ab from stammdaten.artikelstamm
where artnr = a.artnr and artnr_zusatz = a.artnr_zusatz order by gueltig_ab desc limit 1) and artnr like ‘1%’ limit 11
Stringvergleiche sind teuer, vermutlich hast Du auch keinen Index. Was passiert, wenn ein Artikel am selben Tag mehrfach geändert wird?
allerdings dauert es ~5 min bis pg mir ein Ergebnis liefert
Das mit dem boolean könnte ich wohl wahrscheinlich so machen. Zumindest für die jetzigen Anforderungen
Wenn es aber eine Möglichkeit gibt meine Abfrage so zu verändern das es nur noch ~1-2 sec dauert wäre das noch besser.