Lists: | pgsql-de-allgemein |
---|
From: | Guenther Boelter <gboelter(at)gmail(dot)com> |
---|---|
To: | pgsql-de-allgemein(at)postgresql(dot)org |
Subject: | Datensatz an vorbestimmter Stelle einfuegen. |
Date: | 2014-02-03 14:03:13 |
Message-ID: | 52EFA1A1.2030305@gmail.com |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Lists: | pgsql-de-allgemein |
Zunaechst mal ein herzliches Hello aus der Waerme in die kalte Heimat.
Und natuerlich habe ich mal wieder eine ganz 'einfache' Frage ...
Gibt es unter PostgreSQL die Moeglichkeit einen Datensatz an einer
bestimmten Stelle in die Datenbank (Tabelle) einzufuegen, also z. B. als
10. Datensatz wobei evtl. vorhandene Datensaetze dann entsprechend um 1
nach hinten verschoben werden?
Sinn und Zweck ist es, die Daten dann spaeter ohne weiteren Aufwand in
eben genau in der Reihenfolge auch wieder auszugeben. Es geht hier bei
der Ausgabe immer nur um wenige Datensaetze.
Danke im voraus fuer eure Muehe.
Guenther
Davao City, Philippines, Planet Earth, 28.0 °C (im Schatten!)
-- DavaoSOFT, the home of ERPel ERPel, das deutsche
Warenwirtschaftssystem fuer LINUX http://www.davaosoft.com
From: | Michael Renner <michael(dot)renner(at)amd(dot)co(dot)at> |
---|---|
To: | Guenther Boelter <gboelter(at)gmail(dot)com> |
Cc: | "pgsql-de-allgemein(at)postgresql(dot)org Allgemein" <pgsql-de-allgemein(at)postgresql(dot)org> |
Subject: | Re: Datensatz an vorbestimmter Stelle einfuegen. |
Date: | 2014-02-03 14:06:11 |
Message-ID: | 43961C5E-D4D3-4DAE-958C-C3DFE293CCC2@amd.co.at |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Lists: | pgsql-de-allgemein |
Nein, automatisch gibt’s das (noch?) nicht - wenn du möchtest dass Tables in einer gewissen Reihenfolge auf dem Dateisystem liegen musst du händisch CLUSTER ausführen: http://www.postgresql.org/docs/current/static/sql-cluster.html. Das ist eine blockierende Operation.
lg,
Michael
On 03.02.2014, at 15:03 , Guenther Boelter <gboelter(at)gmail(dot)com> wrote:
> Zunaechst mal ein herzliches Hello aus der Waerme in die kalte Heimat.
>
> Und natuerlich habe ich mal wieder eine ganz 'einfache' Frage ...
>
> Gibt es unter PostgreSQL die Moeglichkeit einen Datensatz an einer
> bestimmten Stelle in die Datenbank (Tabelle) einzufuegen, also z. B. als
> 10. Datensatz wobei evtl. vorhandene Datensaetze dann entsprechend um 1
> nach hinten verschoben werden?
>
> Sinn und Zweck ist es, die Daten dann spaeter ohne weiteren Aufwand in
> eben genau in der Reihenfolge auch wieder auszugeben. Es geht hier bei
> der Ausgabe immer nur um wenige Datensaetze.
>
> Danke im voraus fuer eure Muehe.
>
> Guenther
> Davao City, Philippines, Planet Earth, 28.0 °C (im Schatten!)
>
>
> -- DavaoSOFT, the home of ERPel ERPel, das deutsche
> Warenwirtschaftssystem fuer LINUX http://www.davaosoft.com
>
>
>
> --
> Sent via pgsql-de-allgemein mailing list (pgsql-de-allgemein(at)postgresql(dot)org)
> To make changes to your subscription:
> http://www.postgresql.org/mailpref/pgsql-de-allgemein
>
From: | Thomas Markus <t(dot)markus(at)proventis(dot)net> |
---|---|
To: | Guenther Boelter <gboelter(at)gmail(dot)com>, pgsql-de-allgemein(at)postgresql(dot)org |
Subject: | Re: Datensatz an vorbestimmter Stelle einfuegen. |
Date: | 2014-02-03 14:06:58 |
Message-ID: | 52EFA282.30005@proventis.net |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Lists: | pgsql-de-allgemein |
Hi Guenther,
eine Reihenfolge ist nicht definiert ausser du tust es selbst (per ORDER
BY). Z.B. mit einer extra Spalte zum Sortieren
Gruss
Thomas
Am 03.02.2014 15:03, schrieb Guenther Boelter:
> Zunaechst mal ein herzliches Hello aus der Waerme in die kalte Heimat.
>
> Und natuerlich habe ich mal wieder eine ganz 'einfache' Frage ...
>
> Gibt es unter PostgreSQL die Moeglichkeit einen Datensatz an einer
> bestimmten Stelle in die Datenbank (Tabelle) einzufuegen, also z. B. als
> 10. Datensatz wobei evtl. vorhandene Datensaetze dann entsprechend um 1
> nach hinten verschoben werden?
>
> Sinn und Zweck ist es, die Daten dann spaeter ohne weiteren Aufwand in
> eben genau in der Reihenfolge auch wieder auszugeben. Es geht hier bei
> der Ausgabe immer nur um wenige Datensaetze.
>
> Danke im voraus fuer eure Muehe.
>
> Guenther
> Davao City, Philippines, Planet Earth, 28.0 °C (im Schatten!)
>
>
> -- DavaoSOFT, the home of ERPel ERPel, das deutsche
> Warenwirtschaftssystem fuer LINUX http://www.davaosoft.com
>
>
>
From: | Markus Winand <markus(dot)winand(at)winand(dot)at> |
---|---|
To: | Guenther Boelter <gboelter(at)gmail(dot)com> |
Cc: | pgsql-de-allgemein(at)postgresql(dot)org |
Subject: | Re: Datensatz an vorbestimmter Stelle einfuegen. |
Date: | 2014-02-03 14:13:04 |
Message-ID: | 01A6FEFB-677F-45DE-88CA-BD96734310F0@winand.at |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Lists: | pgsql-de-allgemein |
Du könntest einen Index mit der entsprechend der ORDER BY-Klausel anlegen. Die Daten darin verhalten sich dann wie von dir gewünscht (samt dem extra aufwand die Reihenfolge zu wahren).
Ein Index ist natürlich eine Extra-Struktur - die Tabelle selbst bleibt davon unberührt (ausser eben CLUSTER). Falls nötig könntest du den Index für einen Index-Only Scan auslegen, damit hättest du zumindest die lese-performance wie von dir gewünscht.
mfg,
Markus Winand
markus(dot)winand(at)winand(dot)at
T +43 1 9444047
+++ Das Wichtigste in 140 Zeichen. Unsere SQL Performance Tipps gibt's jetzt auch auf Deutsch:
https://twitter.com/SQLPerfTipps/
Maderspergerstr. 1-3/9/11
1160 Wien
AUSTRIA
On 2014-02-3, at 15:06 , Thomas Markus wrote:
> Hi Guenther,
>
> eine Reihenfolge ist nicht definiert ausser du tust es selbst (per ORDER BY). Z.B. mit einer extra Spalte zum Sortieren
>
>
> Gruss
> Thomas
>
>
> Am 03.02.2014 15:03, schrieb Guenther Boelter:
>> Zunaechst mal ein herzliches Hello aus der Waerme in die kalte Heimat.
>>
>> Und natuerlich habe ich mal wieder eine ganz 'einfache' Frage ...
>>
>> Gibt es unter PostgreSQL die Moeglichkeit einen Datensatz an einer
>> bestimmten Stelle in die Datenbank (Tabelle) einzufuegen, also z. B. als
>> 10. Datensatz wobei evtl. vorhandene Datensaetze dann entsprechend um 1
>> nach hinten verschoben werden?
>>
>> Sinn und Zweck ist es, die Daten dann spaeter ohne weiteren Aufwand in
>> eben genau in der Reihenfolge auch wieder auszugeben. Es geht hier bei
>> der Ausgabe immer nur um wenige Datensaetze.
>>
>> Danke im voraus fuer eure Muehe.
>>
>> Guenther
>> Davao City, Philippines, Planet Earth, 28.0 °C (im Schatten!)
>>
>>
>> -- DavaoSOFT, the home of ERPel ERPel, das deutsche
>> Warenwirtschaftssystem fuer LINUX http://www.davaosoft.com
>>
>>
>>
>
>
>
> --
> Sent via pgsql-de-allgemein mailing list (pgsql-de-allgemein(at)postgresql(dot)org)
> To make changes to your subscription:
> http://www.postgresql.org/mailpref/pgsql-de-allgemein
From: | Katharina Büchse <katharina(dot)buechse(at)uni-jena(dot)de> |
---|---|
To: | pgsql-de-allgemein(at)postgresql(dot)org |
Subject: | Datensatz an vorbestimmter Stelle einfuegen - Nachfrage |
Date: | 2014-02-03 14:16:30 |
Message-ID: | 52EFA4BE.4000205@uni-jena.de |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Lists: | pgsql-de-allgemein |
Kann man sich in Postgres denn überhaupt darauf verlassen, dass die
Daten in der Reihenfolge ausgegeben werden, wie sie auf Platte stehen?
Von der reinen Lehre her sind SQL-Befehle Anweisungen gegen Mengen, die
erst mal keine bestimmte Reihenfolge besitzen, außer man sortiert sie
mit order-by ...
On 03.02.2014 15:03, Guenther Boelter wrote:
> Zunaechst mal ein herzliches Hello aus der Waerme in die kalte Heimat.
>
> Und natuerlich habe ich mal wieder eine ganz 'einfache' Frage ...
>
> Gibt es unter PostgreSQL die Moeglichkeit einen Datensatz an einer
> bestimmten Stelle in die Datenbank (Tabelle) einzufuegen, also z. B. als
> 10. Datensatz wobei evtl. vorhandene Datensaetze dann entsprechend um 1
> nach hinten verschoben werden?
>
> Sinn und Zweck ist es, die Daten dann spaeter ohne weiteren Aufwand in
> eben genau in der Reihenfolge auch wieder auszugeben. Es geht hier bei
> der Ausgabe immer nur um wenige Datensaetze.
>
> Danke im voraus fuer eure Muehe.
>
> Guenther
> Davao City, Philippines, Planet Earth, 28.0 °C (im Schatten!)
>
>
> -- DavaoSOFT, the home of ERPel ERPel, das deutsche
> Warenwirtschaftssystem fuer LINUX http://www.davaosoft.com
>
>
>
--
Dipl.-Math. Katharina Büchse
Friedrich-Schiller-Universität Jena
Institut für Informatik
Lehrstuhl für Datenbanken und Informationssysteme
Ernst-Abbe-Platz 2
07743 Jena
Telefon 03641/946367
Webseite http://users.minet.uni-jena.de/~re89qen/
From: | Thomas Markus <t(dot)markus(at)proventis(dot)net> |
---|---|
To: | Markus Winand <markus(dot)winand(at)winand(dot)at>, Guenther Boelter <gboelter(at)gmail(dot)com> |
Cc: | pgsql-de-allgemein(at)postgresql(dot)org |
Subject: | Re: Datensatz an vorbestimmter Stelle einfuegen. |
Date: | 2014-02-03 14:17:02 |
Message-ID: | 52EFA4DE.1000803@proventis.net |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Lists: | pgsql-de-allgemein |
Hi Markus,
das ist mit einem Index nicht zu lösen.
Test:
create temp table test(id int);
create index test1 on test(id asc);
insert into test values (1),(2),(3);
select * from test;
delete from test where id=2;
insert into test values (2);
select * from test;
Gruss
Thomas
Am 03.02.2014 15:13, schrieb Markus Winand:
> Du könntest einen Index mit der entsprechend der ORDER BY-Klausel anlegen. Die Daten darin verhalten sich dann wie von dir gewünscht (samt dem extra aufwand die Reihenfolge zu wahren).
>
> Ein Index ist natürlich eine Extra-Struktur - die Tabelle selbst bleibt davon unberührt (ausser eben CLUSTER). Falls nötig könntest du den Index für einen Index-Only Scan auslegen, damit hättest du zumindest die lese-performance wie von dir gewünscht.
>
> mfg,
>
> Markus Winand
> markus(dot)winand(at)winand(dot)at
> T +43 1 9444047
>
> +++ Das Wichtigste in 140 Zeichen. Unsere SQL Performance Tipps gibt's jetzt auch auf Deutsch:
> https://twitter.com/SQLPerfTipps/
>
> Maderspergerstr. 1-3/9/11
> 1160 Wien
> AUSTRIA
>
>
>
>
>
>
>
> On 2014-02-3, at 15:06 , Thomas Markus wrote:
>
>> Hi Guenther,
>>
>> eine Reihenfolge ist nicht definiert ausser du tust es selbst (per ORDER BY). Z.B. mit einer extra Spalte zum Sortieren
>>
>>
>> Gruss
>> Thomas
>>
>>
>> Am 03.02.2014 15:03, schrieb Guenther Boelter:
>>> Zunaechst mal ein herzliches Hello aus der Waerme in die kalte Heimat.
>>>
>>> Und natuerlich habe ich mal wieder eine ganz 'einfache' Frage ...
>>>
>>> Gibt es unter PostgreSQL die Moeglichkeit einen Datensatz an einer
>>> bestimmten Stelle in die Datenbank (Tabelle) einzufuegen, also z. B. als
>>> 10. Datensatz wobei evtl. vorhandene Datensaetze dann entsprechend um 1
>>> nach hinten verschoben werden?
>>>
>>> Sinn und Zweck ist es, die Daten dann spaeter ohne weiteren Aufwand in
>>> eben genau in der Reihenfolge auch wieder auszugeben. Es geht hier bei
>>> der Ausgabe immer nur um wenige Datensaetze.
>>>
>>> Danke im voraus fuer eure Muehe.
>>>
>>> Guenther
>>> Davao City, Philippines, Planet Earth, 28.0 °C (im Schatten!)
>>>
>>>
>>> -- DavaoSOFT, the home of ERPel ERPel, das deutsche
>>> Warenwirtschaftssystem fuer LINUX http://www.davaosoft.com
>>>
>>>
>>>
>>
>>
>> --
>> Sent via pgsql-de-allgemein mailing list (pgsql-de-allgemein(at)postgresql(dot)org)
>> To make changes to your subscription:
>> http://www.postgresql.org/mailpref/pgsql-de-allgemein
>
>
--
===================================================================
proventis GmbH | Neue Grünstrasse 25-26 | D-10179 Berlin |
Tel +49 30 29 36 399 22 | Fax -50 | t(dot)markus(at)proventis(dot)net
-------------------------------------------------------------------
Geschäftsführer: Norman Frischmuth | Sitz: Berlin
Handelsregister: AG Berlin-Charlottenburg, HRB 82917
-------------------------------------------------------------------
Blue Ant - webbasiertes Multi-Projektmanagement - mehr Infos unter:
Veranstaltungen
http://www.proventis.net/de/blue-ant/veranstaltungen.html
Support
http://www.proventis.net/de/blue-ant/support.html
Blue Ant auf Facebook
http://www.facebook.com/Multi.Projektmanagement.Software.BlueAnt
===================================================================
From: | Thomas Markus <t(dot)markus(at)proventis(dot)net> |
---|---|
To: | pgsql-de-allgemein(at)postgresql(dot)org |
Subject: | Re: Datensatz an vorbestimmter Stelle einfuegen - Nachfrage |
Date: | 2014-02-03 14:19:14 |
Message-ID: | 52EFA562.3070507@proventis.net |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Lists: | pgsql-de-allgemein |
Hi Katharina,
nein kann man nicht. Die Reihenfolge ist nicht definiert und wird von
der DB selbst bestimmt. Da haben die Entwickler die reine Lehre befolgt
... ;)
Gruss
Thomas
Am 03.02.2014 15:16, schrieb Katharina Büchse:
> Kann man sich in Postgres denn überhaupt darauf verlassen, dass die
> Daten in der Reihenfolge ausgegeben werden, wie sie auf Platte stehen?
> Von der reinen Lehre her sind SQL-Befehle Anweisungen gegen Mengen,
> die erst mal keine bestimmte Reihenfolge besitzen, außer man sortiert
> sie mit order-by ...
>
> On 03.02.2014 15:03, Guenther Boelter wrote:
>> Zunaechst mal ein herzliches Hello aus der Waerme in die kalte Heimat.
>>
>> Und natuerlich habe ich mal wieder eine ganz 'einfache' Frage ...
>>
>> Gibt es unter PostgreSQL die Moeglichkeit einen Datensatz an einer
>> bestimmten Stelle in die Datenbank (Tabelle) einzufuegen, also z. B. als
>> 10. Datensatz wobei evtl. vorhandene Datensaetze dann entsprechend um 1
>> nach hinten verschoben werden?
>>
>> Sinn und Zweck ist es, die Daten dann spaeter ohne weiteren Aufwand in
>> eben genau in der Reihenfolge auch wieder auszugeben. Es geht hier bei
>> der Ausgabe immer nur um wenige Datensaetze.
>>
>> Danke im voraus fuer eure Muehe.
>>
>> Guenther
>> Davao City, Philippines, Planet Earth, 28.0 °C (im Schatten!)
>>
>>
>> -- DavaoSOFT, the home of ERPel ERPel, das deutsche
>> Warenwirtschaftssystem fuer LINUX http://www.davaosoft.com
>>
>>
>>
>
>
From: | Michael Renner <michael(dot)renner(at)amd(dot)co(dot)at> |
---|---|
To: | Katharina Büchse <katharina(dot)buechse(at)uni-jena(dot)de> |
Cc: | "pgsql-de-allgemein(at)postgresql(dot)org Allgemein" <pgsql-de-allgemein(at)postgresql(dot)org> |
Subject: | Re: Datensatz an vorbestimmter Stelle einfuegen - Nachfrage |
Date: | 2014-02-03 14:33:37 |
Message-ID: | 68BF299A-469B-4432-836F-E038C0F5219B@amd.co.at |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Lists: | pgsql-de-allgemein |
On 03.02.2014, at 15:16 , Katharina Büchse <katharina(dot)buechse(at)uni-jena(dot)de> wrote:
> Kann man sich in Postgres denn überhaupt darauf verlassen, dass die Daten in der Reihenfolge ausgegeben werden, wie sie auf Platte stehen? Von der reinen Lehre her sind SQL-Befehle Anweisungen gegen Mengen, die erst mal keine bestimmte Reihenfolge besitzen, außer man sortiert sie mit order-by ...
Was Thomas geschrieben hat. Prinzipiell liefert ein Sequential Scan die Tuple schon in Table Order zurück, allerdings ist der Startpunkt im Table auch nicht fix wenn’s mehrere parallele Leser gibt: http://www.postgresql.org/docs/9.3/static/runtime-config-compatible.html#GUC-SYNCHRONIZE-SEQSCANS
Man kann sich also die Result Sets mit Seiteneffekten schon hinbiegen, Verlass ist allerdings keiner wenn kein explizites ORDER BY im Query drin ist.
lg,
Michael
From: | Nicolas Barbier <nicolas(dot)barbier(at)gmail(dot)com> |
---|---|
To: | Guenther Boelter <gboelter(at)gmail(dot)com> |
Cc: | PostgreSQL <pgsql-de-allgemein(at)postgresql(dot)org> |
Subject: | Re: Datensatz an vorbestimmter Stelle einfuegen. |
Date: | 2014-02-03 14:48:19 |
Message-ID: | CAP-rdTZOPDu+rq6o2SkAsPKDjSjbdVWxdtOcG7FfLQyaf22Xmg@mail.gmail.com |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Lists: | pgsql-de-allgemein |
Am 3. Februar 2014 15:03 schrieb Guenther Boelter <gboelter(at)gmail(dot)com>:
> Gibt es unter PostgreSQL die Moeglichkeit einen Datensatz an einer
> bestimmten Stelle in die Datenbank (Tabelle) einzufuegen, also z. B. als
> 10. Datensatz wobei evtl. vorhandene Datensaetze dann entsprechend um 1
> nach hinten verschoben werden?
>
> Sinn und Zweck ist es, die Daten dann spaeter ohne weiteren Aufwand in
> eben genau in der Reihenfolge auch wieder auszugeben. Es geht hier bei
> der Ausgabe immer nur um wenige Datensaetze.
SQL-Datenbanken haben kein impliziertes Konzept der Reihenfolge der
Zeilen einer Tabelle. Wenn man die Zeilen in einer bestimmen
Reihenfolge zurückbekommen will, soll man das immer mit einer ORDER
BY-Klausel erzwingen. Diese ORDER BY-Klausel kann z. B. eine
„Index“-Spalte benutzen, die die Reihenfolge bestimmt.
Eine Zeile in der Mitte einfügen, macht man dann z. B. indem man die
„späteren“ Zeile verschiebt (also die Index-Werte eins erhöht) und die
neue Zeile „dazwischensteckt“ (also mit dem richtigen Index-Wert, der
nach der Verschiebung nicht mehr benutzt wird).
Grüße aus Belgien,
Nicolas
--
A. Because it breaks the logical sequence of discussion.
Q. Why is top posting bad?
From: | "Gunnar \"Nick\" Bluth" <gunnar(dot)bluth(at)pro-open(dot)de> |
---|---|
To: | Nicolas Barbier <nicolas(dot)barbier(at)gmail(dot)com>, Guenther Boelter <gboelter(at)gmail(dot)com> |
Cc: | PostgreSQL <pgsql-de-allgemein(at)postgresql(dot)org> |
Subject: | Re: Datensatz an vorbestimmter Stelle einfuegen. |
Date: | 2014-02-03 18:59:22 |
Message-ID: | 52EFE70A.6090408@pro-open.de |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Lists: | pgsql-de-allgemein |
Am 03.02.2014 15:48, schrieb Nicolas Barbier:
> Am 3. Februar 2014 15:03 schrieb Guenther Boelter <gboelter(at)gmail(dot)com>:
>
>> Gibt es unter PostgreSQL die Moeglichkeit einen Datensatz an einer
>> bestimmten Stelle in die Datenbank (Tabelle) einzufuegen, also z. B. als
>> 10. Datensatz wobei evtl. vorhandene Datensaetze dann entsprechend um 1
>> nach hinten verschoben werden?
>>
>> Sinn und Zweck ist es, die Daten dann spaeter ohne weiteren Aufwand in
>> eben genau in der Reihenfolge auch wieder auszugeben. Es geht hier bei
>> der Ausgabe immer nur um wenige Datensaetze.
> SQL-Datenbanken haben kein impliziertes Konzept der Reihenfolge der
> Zeilen einer Tabelle. Wenn man die Zeilen in einer bestimmen
> Reihenfolge zurückbekommen will, soll man das immer mit einer ORDER
> BY-Klausel erzwingen. Diese ORDER BY-Klausel kann z. B. eine
> „Index“-Spalte benutzen, die die Reihenfolge bestimmt.
>
> Eine Zeile in der Mitte einfügen, macht man dann z. B. indem man die
> „späteren“ Zeile verschiebt (also die Index-Werte eins erhöht) und die
> neue Zeile „dazwischensteckt“ (also mit dem richtigen Index-Wert, der
> nach der Verschiebung nicht mehr benutzt wird).
Generell ist es so (auch dokumentiert), dass die Zeilen in der
Reihenfolge kommen in der sie in der Page / den Pages liegen. Das ist
letztlich bei allen DBMS so (dafür gibt es ja ORDER BY ;-).
Die einfache Lösung ist wie beschrieben eine "ID"-Spalte; nicht schwer
zu implementieren, aber du kannst mit der concurrency Probleme bekommen.
Mir kam eben noch der Gedanke, ob man mit rekursiven CTEs eine "linked
list" implementieren könnte (wobei das erste Element dasjenige sein
müsste, das keinen Folge-/Vorgängerverweis hat), also sowas wie:
CREATE TABLE meine_liste (feld varchar not null, vorgaenger varchar);
Das bringt aber wieder ganz eigene Probleme mit sich:
- constraint auf "vorgaenger": muss NULL oder "in (select feld from
meine_liste)" sein
- die CTE versteht niemand ;-)
- feld muss UNIQUE sein
- Updates sind zwar potentiell konfliktfrei (Einfügen in eine linked
list ist ja gut erforscht ;), aber eben nicht 100%ig
Ich hab versucht, das CTE zu schreiben, und verweise daher auf
http://practiceovertheory.com/blog/2013/07/12/recursive-query-is-recursive/
Alles in allem würde ich ganz stiekum sagen: mach's über ein ID-Feld mit
"ORDER BY ID ASC". Achtung: UNIQUE INDEX mit "|DEFERRABLE INITIALLY
DEFERRED" anlegen!
Aber spannendes Thema ;-)
Gruß aus Oberursel,
|
--
Gunnar "Nick" Bluth
RHCE/SCLA
Mobil +49 172 8853339
Email: gunnar(dot)bluth(at)pro-open(dot)de
__________________________________________________________________________
In 1984 mainstream users were choosing VMS over UNIX. Ten years later
they are choosing Windows over UNIX. What part of that message aren't you
getting? - Tom Payne
From: | Markus Winand <markus(dot)winand(at)winand(dot)at> |
---|---|
To: | Thomas Markus <t(dot)markus(at)proventis(dot)net> |
Cc: | Guenther Boelter <gboelter(at)gmail(dot)com>, pgsql-de-allgemein(at)postgresql(dot)org |
Subject: | Re: Datensatz an vorbestimmter Stelle einfuegen. |
Date: | 2014-02-04 07:59:29 |
Message-ID: | 1EE30B27-3542-466E-8DB0-CF8B89ED970F@winand.at |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Lists: | pgsql-de-allgemein |
Hallo,
So war es natürlich auch nicht gemeint. Das ORDER BY ist natürlich Voraussetzung.
Wie es aussieht, zielte die ursprüngliche Frage darauf ab, wie man beim auslesen eine bestimmte Reihenfolge erhält — also auf ORDER BY. Durch die Formulierung der Frage habe ich mich (und auch andere) verleiten lassen.
Zusammenfassend würde ich nun so antworten:
Grundsätzlich hat es den Benutzer einer Datenbank nicht zu interessieren, wie die Daten gespeichert werden. Wenn man die Daten in einer gewissen Reihenfolge auslesen will, kann man sich mit ORDER BY einen Reihenfolge beim SELECT wünschen. Soweit SQL — hat alles noch nichts mit PostgreSQL zu tun.
Manchmal kann es aus Performance gründen sinnvoll sein, die Daten sehr wohl in einer bestimmten Reihenfolge abzuspeichern (weil sequenzielles lesen schneller geht). Dafür bietet PostgreSQL die Möglichkeit mit CLUSTER (muss regelmäßig gemacht werden) oder eben Indizes (B-Tree um genau zu sein).
Für letzteres gibt es Beispiele und Erklärungen auf meiner Seite: http://use-the-index-luke.com/de/sql/sortieren-gruppieren/indexed-order-by
mfg,
Markus Winand
markus(dot)winand(at)winand(dot)at
T +43 1 9444047
+++ Already registered for our next online training?
http://winand.at/services/sql-performance-training-online
Maderspergerstr. 1-3/9/11
1160 Wien
AUSTRIA
On 2014-02-3, at 15:17 , Thomas Markus wrote:
> Hi Markus,
>
> das ist mit einem Index nicht zu lösen.
>
> Test:
>
> create temp table test(id int);
> create index test1 on test(id asc);
>
> insert into test values (1),(2),(3);
> select * from test;
>
> delete from test where id=2;
> insert into test values (2);
> select * from test;
>
>
>
> Gruss
> Thomas
>
> Am 03.02.2014 15:13, schrieb Markus Winand:
>> Du könntest einen Index mit der entsprechend der ORDER BY-Klausel anlegen. Die Daten darin verhalten sich dann wie von dir gewünscht (samt dem extra aufwand die Reihenfolge zu wahren).
>>
>> Ein Index ist natürlich eine Extra-Struktur - die Tabelle selbst bleibt davon unberührt (ausser eben CLUSTER). Falls nötig könntest du den Index für einen Index-Only Scan auslegen, damit hättest du zumindest die lese-performance wie von dir gewünscht.
>>
>> mfg,
>>
>> Markus Winand
>>
>> markus(dot)winand(at)winand(dot)at
>>
>> T +43 1 9444047
>>
>> +++ Das Wichtigste in 140 Zeichen. Unsere SQL Performance Tipps gibt's jetzt auch auf Deutsch:
>>
>> https://twitter.com/SQLPerfTipps/
>>
>>
>> Maderspergerstr. 1-3/9/11
>> 1160 Wien
>> AUSTRIA
>>
>>
>>
>>
>>
>>
>>
>> On 2014-02-3, at 15:06 , Thomas Markus wrote:
>>
>>
>>> Hi Guenther,
>>>
>>> eine Reihenfolge ist nicht definiert ausser du tust es selbst (per ORDER BY). Z.B. mit einer extra Spalte zum Sortieren
>>>
>>>
>>> Gruss
>>> Thomas
>>>
>>>
>>> Am 03.02.2014 15:03, schrieb Guenther Boelter:
>>>
>>>> Zunaechst mal ein herzliches Hello aus der Waerme in die kalte Heimat.
>>>>
>>>> Und natuerlich habe ich mal wieder eine ganz 'einfache' Frage ...
>>>>
>>>> Gibt es unter PostgreSQL die Moeglichkeit einen Datensatz an einer
>>>> bestimmten Stelle in die Datenbank (Tabelle) einzufuegen, also z. B. als
>>>> 10. Datensatz wobei evtl. vorhandene Datensaetze dann entsprechend um 1
>>>> nach hinten verschoben werden?
>>>>
>>>> Sinn und Zweck ist es, die Daten dann spaeter ohne weiteren Aufwand in
>>>> eben genau in der Reihenfolge auch wieder auszugeben. Es geht hier bei
>>>> der Ausgabe immer nur um wenige Datensaetze.
>>>>
>>>> Danke im voraus fuer eure Muehe.
>>>>
>>>> Guenther
>>>> Davao City, Philippines, Planet Earth, 28.0 °C (im Schatten!)
>>>>
>>>>
>>>> -- DavaoSOFT, the home of ERPel ERPel, das deutsche
>>>> Warenwirtschaftssystem fuer LINUX
>>>> http://www.davaosoft.com
>>>>
>>>>
>>>>
>>>>
>>>>
>>>
>>>
>>> --
>>> Sent via pgsql-de-allgemein mailing list (
>>> pgsql-de-allgemein(at)postgresql(dot)org
>>> )
>>> To make changes to your subscription:
>>>
>>> http://www.postgresql.org/mailpref/pgsql-de-allgemein
>>
>>
>>
>
> --
> ===================================================================
> proventis GmbH | Neue Grünstrasse 25-26 | D-10179 Berlin |
> Tel +49 30 29 36 399 22 | Fax -50 |
> t(dot)markus(at)proventis(dot)net
>
> -------------------------------------------------------------------
> Geschäftsführer: Norman Frischmuth | Sitz: Berlin
> Handelsregister: AG Berlin-Charlottenburg, HRB 82917
> -------------------------------------------------------------------
> Blue Ant - webbasiertes Multi-Projektmanagement - mehr Infos unter:
>
> Veranstaltungen
>
> http://www.proventis.net/de/blue-ant/veranstaltungen.html
>
>
> Support
>
> http://www.proventis.net/de/blue-ant/support.html
>
>
> Blue Ant auf Facebook
>
> http://www.facebook.com/Multi.Projektmanagement.Software.BlueAnt
>
> ===================================================================
>
> <gadiceba.png>
From: | "Andreas Kretschmer - internet24 GmbH" <kretschmer(at)internet24(dot)de> |
---|---|
To: | "'Markus Winand'" <markus(dot)winand(at)winand(dot)at>, "'Thomas Markus'" <t(dot)markus(at)proventis(dot)net> |
Cc: | "'Guenther Boelter'" <gboelter(at)gmail(dot)com>, <pgsql-de-allgemein(at)postgresql(dot)org> |
Subject: | Re: Datensatz an vorbestimmter Stelle einfuegen. |
Date: | 2014-02-04 08:46:46 |
Message-ID: | 020101cf2185$a3095ae0$e91c10a0$@internet24.de |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Lists: | pgsql-de-allgemein |
>
> Manchmal kann es aus Performance gründen sinnvoll sein, die Daten sehr
> wohl in einer bestimmten Reihenfolge abzuspeichern (weil sequenzielles
> lesen schneller geht). Dafür bietet PostgreSQL die Möglichkeit mit
> CLUSTER (muss regelmäßig gemacht werden) oder eben Indizes (B-Tree um
> genau zu sein).
Ich gehe aber nach wie vor davon aus, daß auch dann die Reihenfolge nicht garantiert ist.
Wenn N User knapp versetzt ein select * ohne order by machen, dann wird PG das schon genannte Feature der synch. par. Scans
anwenden - es hat keinen Grund (weil kein ORDER BY) dies nicht zu tun.
Das CLUSTER mag hilfreich sein, wenn ein ORDER BY kommt und ein Clustered Index passend vorliegt und PG anhand seiner Statistiken
erkennen kann, daß die Daten passend vorliegen.
Andreas
From: | Markus Winand <markus(dot)winand(at)winand(dot)at> |
---|---|
To: | "Andreas Kretschmer - internet24 GmbH" <kretschmer(at)internet24(dot)de> |
Cc: | "'Thomas Markus'" <t(dot)markus(at)proventis(dot)net>, "'Guenther Boelter'" <gboelter(at)gmail(dot)com>, <pgsql-de-allgemein(at)postgresql(dot)org> |
Subject: | Re: Datensatz an vorbestimmter Stelle einfuegen. |
Date: | 2014-02-04 09:06:02 |
Message-ID: | 423146DC-9E87-4C21-A8A7-C5ABDD8CB150@winand.at |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Lists: | pgsql-de-allgemein |
Wiederrum: so war es nicht gemeint ;)
CLUSTER bzw. Index können der Datenbank das leben leichter machen, die Daten in der geforderten Reihenfolge zu liefern. Das ist alles. Du Reihenfolge musst du immer mit ORDER BY spezifizieren.
Unter keinen umständen wollte ich jemals andeuten, dass man ORDER BY weglassen könnte. Offenbar habe ich es versehentlich doch angedeutet -> my bad.
-markus
Markus Winand
markus(dot)winand(at)winand(dot)at
T +43 1 9444047
+++ Already registered for our next online training?
http://winand.at/services/sql-performance-training-online
Maderspergerstr. 1-3/9/11
1160 Wien
AUSTRIA
On 2014-02-4, at 09:46 , Andreas Kretschmer - internet24 GmbH wrote:
>>
>> Manchmal kann es aus Performance gründen sinnvoll sein, die Daten sehr
>> wohl in einer bestimmten Reihenfolge abzuspeichern (weil sequenzielles
>> lesen schneller geht). Dafür bietet PostgreSQL die Möglichkeit mit
>> CLUSTER (muss regelmäßig gemacht werden) oder eben Indizes (B-Tree um
>> genau zu sein).
>
>
> Ich gehe aber nach wie vor davon aus, daß auch dann die Reihenfolge nicht garantiert ist.
> Wenn N User knapp versetzt ein select * ohne order by machen, dann wird PG das schon genannte Feature der synch. par. Scans
> anwenden - es hat keinen Grund (weil kein ORDER BY) dies nicht zu tun.
>
> Das CLUSTER mag hilfreich sein, wenn ein ORDER BY kommt und ein Clustered Index passend vorliegt und PG anhand seiner Statistiken
> erkennen kann, daß die Daten passend vorliegen.
>
> Andreas
From: | Guenther Boelter <gboelter(at)gmail(dot)com> |
---|---|
To: | "pgsql-de-allgemein(at)postgresql(dot)org Allgemein" <pgsql-de-allgemein(at)postgresql(dot)org> |
Subject: | Re: Datensatz an vorbestimmter Stelle einfuegen. |
Date: | 2014-02-05 13:33:19 |
Message-ID: | 52F23D9F.1090600@gmail.com |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Lists: | pgsql-de-allgemein |
On 02/03/2014 10:48 PM, Nicolas Barbier wrote:
> Am 3. Februar 2014 15:03 schrieb Guenther Boelter <gboelter(at)gmail(dot)com>:
>
>> Gibt es unter PostgreSQL die Moeglichkeit einen Datensatz an einer
>> bestimmten Stelle in die Datenbank (Tabelle) einzufuegen, also z. B. als
>> 10. Datensatz wobei evtl. vorhandene Datensaetze dann entsprechend um 1
>> nach hinten verschoben werden?
>>
>> Sinn und Zweck ist es, die Daten dann spaeter ohne weiteren Aufwand in
>> eben genau in der Reihenfolge auch wieder auszugeben. Es geht hier bei
>> der Ausgabe immer nur um wenige Datensaetze.
> SQL-Datenbanken haben kein impliziertes Konzept der Reihenfolge der
> Zeilen einer Tabelle. Wenn man die Zeilen in einer bestimmen
> Reihenfolge zurückbekommen will, soll man das immer mit einer ORDER
> BY-Klausel erzwingen. Diese ORDER BY-Klausel kann z. B. eine
> „Index“-Spalte benutzen, die die Reihenfolge bestimmt.
>
> Eine Zeile in der Mitte einfügen, macht man dann z. B. indem man die
> „späteren“ Zeile verschiebt (also die Index-Werte eins erhöht) und die
> neue Zeile „dazwischensteckt“ (also mit dem richtigen Index-Wert, der
> nach der Verschiebung nicht mehr benutzt wird).
>
> Grüße aus Belgien,
>
> Nicolas
Nochmal vielen, vielen Dank fuer die Muehe, dir ihr euch da draussen
gemacht habt.
Und es tut mir natuerlich sehr leid, wenn ich mich in meiner
Fragestellung ungluecklich ausgedrueckt und dadurch ein wenig Verwirrung
gestiftet habe. Es ging mir tatsaechlich nicht um das Speichern an einer
vorbestimmten Stelle sondern nur um die Reihenfolge, in der die Daten
spaeter dann auch wieder ausgegeben werden.
Ich hab's jetzt genau so geloest, wie Nicolas es vorgeschlagen hat und
es klappt prima.
Gruss
Guenther
Davao City, Philippines, Planet Earth bei aktuell lausigen 26.0 °C im
Schatten!!
--
DavaoSOFT, the home of ERPel
ERPel, das deutsche Warenwirtschaftssystem fuer LINUX
http://www.davaosoft.com
From: | "Andreas Kretschmer - internet24 GmbH" <kretschmer(at)internet24(dot)de> |
---|---|
To: | "'Guenther Boelter'" <gboelter(at)gmail(dot)com>, <pgsql-de-allgemein(at)postgresql(dot)org> |
Subject: | Re: Datensatz an vorbestimmter Stelle einfuegen. |
Date: | 2014-02-05 13:35:08 |
Message-ID: | 028801cf22777c963075c290$@internet24.de |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Lists: | pgsql-de-allgemein |
>
> Und es tut mir natuerlich sehr leid, wenn ich mich in meiner
> Fragestellung ungluecklich ausgedrueckt und dadurch ein wenig Verwirrung
>
> Guenther
> Davao City, Philippines, Planet Earth bei aktuell lausigen 26.0 °C im
> Schatten!!
Kannst uns ja mal alle einladen ;-)