wie dupliziere ich eine riesige postgres-tabelle?
<p>ich habe eine riesige postgres-tabelle (10 gb daten - 160 millionen datensätze). die tabelle ist statisch und es werden keine schreibvorgänge ausgeführt. ich möchte es duplizieren, schreibvorgänge ausführen, neu indizieren und dann mit einer einzigen schnellen transaktion die alte löschen und die neue in den ursprünglichen namen umbenennen.</p><p>was ist der schnellste weg, um solch eine riesige tabelle zu duplizieren?</p>
<p>im allgemeinen ist der schnellste weg, eine tabelle zu duplizieren, einfach:</p><pre><code>create table table2 as select * from table1; </code></pre><p>parallele inserts sind möglicherweise schneller, jedoch nur mit einem sehr schnellen festplattensubsystem (wenn daten auf vielen laufwerken verschachtelt sind). andernfalls ist dies langsamer.</p><p>sobald sie mit dem ändern von <code>table2</code> fertig sind, kann es den neuen namen annehmen mit:</p><pre><code>begin; drop table table1; alter table table2 rename to table1; commit; </code></pre><p>der befehl <code>drop table</code> benötigt eine exklusive sperre, die sich auf gleichzeitige leser auf eine weise auswirkt, die sie vielleicht vorhersehen möchten:</p><ul> <li><code>drop</code> wartet, bis alle ausstehenden lesevorgänge anderer transaktionen in der tabelle abgeschlossen sind.</li> <li>jede neue transaktion, die in der zwischenzeit versucht, diese tabelle zu lesen, wird gewartet und schlägt dann fehl, da das ursprüngliche <code>table1</code> nicht mehr vorhanden ist. der fehler würde so aussehen: "beziehung mit oid <em>oid</em> konnte nicht geöffnet werden")</li> </ul><p>um das zweite problem zu vermeiden, können sie <code>table1</code> in <code>old\_table1</code> umbenennen, anstatt es zu löschen, und es dann erst später außerhalb der transaktion löschen, wenn diese leser damit fertig sind. die obige sequenz würde also werden:</p><pre><code>begin; alter table table1 rename to old\_table1; alter table table2 rename to table1; commit; ... drop table old\_table1; </code></pre>
<p>es gibt optionen, die ihnen dabei helfen:</p><pre><code> --insert-ignore insert rows with insert ignore. --replace use replace into instead of insert into. -t, --no-create-info don't write table creation info. </code></pre><p>denken sie an dieses paradigma</p><ul> <li>mysqldump alles von db1 in dump1</li> <li>laden sie dump1 in db3</li> <li>mysqldump alles aus db2 mit --replace (oder --insert-ignore) und --no-create-info in dump2</li> <li>laden sie dump2 in db3</li> </ul> Du klickst den zu kopierenden Tab mit der linken Maustaste an, hältst sie gedrückt, verschiebst den Tab zur Seite, drückst dann auf der Tastatur die "Strg"-Taste, lässt die Maustaste los und danach die "Strg"-Taste. weiß nicht, obs klappt, Diagramme sind auch meine Stärke nicht, im Kopf schon gleich gar nicht, aber versuch doch mal, die x-Achse manuell fallend festzulegen, also nicht von zB min 0..max100, sondern von 100..0


Oder Du manipulierst die Werte: in A11: =max($A10:$E10)-A10, rüberziehen.  

(oder =100-A10). Wäre **alternativ** auch für y denkbar (nicht beides gleichzeitig!).
Auch -A10 könnte gehen, wenn Dich das negative Vorzeichen nicht stört. 


Dabei kannst Du vor E:E immer wieder eine Spalte einsetzen. das Diagramm übernimmt das aber nur vielleicht, wenn Du schreibst **"='Tabelle1'!$A$10:$E$10"** . Alle anderen Bezüge entsprechend. Hallo,


spontan fallen mir hier zwei Wege ein, die zum Ziel führen:


1. Man könnte das Problem über **Verzeichniseintragsfelder** (TC-Felder) lösen. Ist halt ein bisschen umständlich, diese erst im Nachhinein anzulegen, wenn man schon einige Überschriften bzw. Gliederungspunkte im Dokument hat. Wie man mit Verzeichniseintragsfeldern arbeitet, steht [hier](http://www.borkpc.de/Word/wd_inhver3.html) beschrieben.
2. Eine Alternative wäre, das komplett fertige **Inhaltsverzeichnis** im Nachhinein bzw. vor dem Drucken **in statischen Text** zu **konvertieren** und dann mit Suchen-und-Ersetzen die Nummerierung bzw. die Aufzählungszeichen zu entfernen.


Eine Rückmeldung wäre nett.


Gruß, BerchGerch Es gibt auch Systeme, bei denen man nur die Wiederholungsgeschwindigkeit in der Systemsteuerung einstellen kann ==> da dann einfach auf ganz langsam stellen => Ergebnis: Wenn Du auf einer Taste draufbleibst, wird diese dann langsam und gut kontrollierbar wiederholt. <p>hinweis: ab azure sql database v12 gelten diese einschränkungen nicht mehr.</p><p>das ist kein "primärindex". es gibt so etwas wie einen "primärschlüssel" und es gibt auch so etwas wie einen "clustered index". unterschiedliche konzepte, oft verwirrt. lassen sie uns angesichts dieser unterscheidung die frage noch einmal betrachten:</p><p>q1) kann der clustered-index in einer sql azure-tabelle geändert werden?<br> a: ja. verwenden sie <code>with (drop\_existing=on)</code>:</p><pre><code>create table friend ( userid int not null, id int not null); go create clustered index cdxfriend on friend (userid, id); go create clustered index cdxfriend on friend (id, userid) with (drop\_existing=on); go </code></pre><p>f2) kann der clustered-index einer tabelle mit einer primärschlüsseleinschränkung geändert werden?<br> a: ja, wie oben, solange die primärschlüsseleinschränkung nicht über den clustered-index erzwungen wird:</p><pre><code>create table friend ( userid int not null, id int not null identity(1,1), constraint pk\_friend primary key nonclustered (id)); create clustered index cdxfriend on friend (userid, id); go create clustered index cdxfriend on friend (id, userid) with (drop\_existing=on); go </code></pre><p>f3) kann die primärschlüsseleinschränkung einer tabelle geändert werden?<br> a: ja, solange die primäre einschränkung nicht über den clustered-index erzwungen wird:</p><pre><code>create table friend ( userid int not null, id int not null identity(1,1), constraint pk\_friend primary key nonclustered (id)); go create clustered index cdxfriend on friend (userid, id); go alter table friend drop constraint pk\_friend; alter table friend add constraint pk\_friend primary key nonclustered (userid) go </code></pre><p>f4) kann der primärschlüssel einer tabelle geändert werden, wenn er über den clustered-index erzwungen wird?<br> a: ja, wenn die tabelle nie zeilen hatte:</p><pre><code>create table friend ( userid int not null, id int not null identity(1,1), constraint pk\_friend primary key clustered (userid, id)); go alter table friend drop constraint pk\_friend; alter table friend add constraint pk\_friend primary key clustered (id, userid) go </code></pre><p>f5) kann der primärschlüssel einer tabelle geändert werden, wenn er über den clustered-index erzwungen wird, wenn die tabelle gefüllt ist?<br> a: nein. jede operation, die einen aufgefüllten clustered-index in einen heap konvertiert, wird in sql azure blockiert <em>, auch wenn die tabelle leer ist </em>:</p><pre><code>create table friend ( userid int not null, id int not null identity(1,1), constraint pk\_friend primary key clustered (userid, id)); go insert into friend (userid) values (1); delete from friend; go alter table friend drop constraint pk\_friend; </code></pre><p>als randnotiz: die einschränkung kann geändert werden, wenn die tabelle <em> abgeschnitten ist </em>.</p><p>die problemumgehung zum ändern der pk-einschränkung einer aufgefüllten tabelle besteht darin, das gute alte <a href="http://msdn.microsoft.com/en-us/library/ms188351.aspx"><code>sp\_rename</code></a> trick:</p><pre><code>create table friend ( userid int not null, id int not null identity(1,1), constraint pk\_friend primary key clustered (userid, id)); go insert into friend (userid) values (1); go create table friendnew ( userid int not null, id int not null identity(1,1), constraint pk\_friend\_new primary key clustered (id, userid)); go set identity\_insert friendnew on; insert into friendnew (userid, id) select userid, id from friend; set identity\_insert friendnew off; go begin transaction exec sp\_rename 'friend', 'friendold'; exec sp\_rename 'friendnew', 'friend'; commit; go sp\_help 'friend'; </code></pre><p>das <code>sp\_rename</code> ansatz hat einige probleme, vor allem, dass berechtigungen für die tabelle während des umbenennens nicht übertragen werden, sowie fremdschlüsseleinschränkungen.</p> <p>wenn dies meine entwurfsentscheidung wäre, würde ich wahrscheinlich eher eine option c (modifizierte option a) wählen.</p><h3>erstens, warum nicht 'option b':</h3><p>zum einen gefällt mir die klarheit, dass jedes produkt seinen eigenen tisch hat. wenn es sich nur um eine große tabelle mit einem feld zur bestimmung des typs handelt, ist die beziehung nicht so klar.</p><p>zum anderen würde die indizierungsstrategie immer erfordern, dass dieses typfeld aufgelistet wird. da es sich nur um 4 typen handelt, ist die indexkardinalität extrem niedrig (<code>select * from product\_table where type='x'</code> führt im grunde sowieso einen vollständigen tabellenscan durch)</p><h3>option c.</h3><ul> <li>erstellen sie eine übergeordnete tabelle, die nur die spalten enthält, die alle typen gemeinsam nutzen</li> <li>erstellen sie jeden produkttyp als eigene tabelle mit ihren einzelnen spalten, mit einem zusätzlichen: ein link zur übergeordneten tabelle</li> <li>erstellen sie jede 'link'-tabelle: product\_option, model\_option usw. mit links zu den jeweiligen schlüsseln.</li> <li>für diejenigen mit wechselseitigen links (model\_option, option\_model) erstellen sie auch diese tabellen. dies erhöht die klarheit ihrer joins für alle, die sich das ansehen.</li> </ul><p>der nachteil ist die komplexität, sicherzustellen, dass waisen vermieden werden, wenn dinge aktualisiert/gelöscht werden, und zunächst die abfragen zu entwerfen, die diese tabellen verwenden.</p> > im selben schritt noch die II - 1/2 * III rechnen

Dann hätte man tatsächlich eine zweite Nullzeile.

Man darf aber in einem Schritt nur eine Umformung machen.

Man darf zwei Schritte zu einem Schritt zusammenfassen, wenn sie hintereinanderausgeführt das gleiche Ergebnis liefern würden. Zum Beispiel dürftest du gleichzeitig mit III - 2*II auch II - 2*I machen. Hallo Luca
* Falls du Entfernungsanträge gestellt hast, nimm diese zurück.
* Und schau beim URL Test in der SC genau ob G. eventuell ein Duplikat kennt.


 
Ansonsten kannst du leider gar nichts tun, außer warten bis sich G. bequemt nochmals vorbeizukommen. Das ist leider immer wieder bei WP CMS der Fall durch dieses unsinnige auf "Noindex" stellen, das Google danach für lange Zeit immer von einem Noindex ausgeht, da hilft auch ein Antrag auf Neuindexierung wenig.
 
lg
PeVy <p>sie können das meiste davon tun, indem sie eine login.sql verwenden. login.sql wird während der - überraschenden - anmeldung ausgeführt und aus ihrem sqlpath oder dem aktuellen verzeichnis geladen. für die beispiele, die sie gegeben haben, haben sie wirklich den schlimmsten fall gewählt.</p><p>problem ist der sqlterminator. was auch immer sie dort eingeben, der schrägstrich wird als kostenloser sql-minator beibehalten. daneben sucht sqlplus zuerst nach dem sqlterminator und führt dies vor dem scannen zum string-terminator durch. ein fehler, wenn sie mich fragen. der schrägstrich kann in einer zeichenfolge verwendet werden, solange er nicht allein in einer separaten zeile steht. sobald sqlplus das als sqlterminator angegebene zeichen findet, ignoriert es alles andere und hört auf zu lesen.</p><p>der schrägstrich kann behandelt werden, solange er nicht alleine in einer zeile steht.</p><p>login.sql enthält:</p><pre><code>prompt run login.sql show sqlterminator show sqlblanklines set sqlblanklines on set sqlterminator ';' show sqlterminator show sqlblanklines prompt ready login.sql set echo on </code></pre><p>leigh.sql enthält:</p><pre><code>insert into t1 values ('fail bc semicolon a;a / '); insert into t1 values ('fail bc solo / aa / '); insert into t1 values ('ok / not solo aa /a '); delete from t1 where a = 'c a/ '; </code></pre><p>führen sie das skript aus:</p><pre><code>sqlplus leigh/leigh@orcl @leigh sql*plus: release 10.2.0.4.0 - production on thu aug 9 22:36:20 2012 copyright (c) 1982, 2007, oracle. all rights reserved. connected to: oracle database 11g enterprise edition release 11.2.0.3.0 - 64bit production with the partitioning, real application clusters, automatic storage management, olap, data mining and real application testing options run login.sql sqlterminator ";" (hex 3b) sqlblanklines off sqlterminator ";" (hex 3b) sqlblanklines on ready login.sql sql&gt; insert into t1 values ('fail bc semicolon 2 a;a 3 / error: ora-01756: quoted string not properly terminated sql&gt; '); sp2-0042: unknown command "')" - rest of line ignored. sql&gt; sql&gt; insert into t1 values ('fail bc solo / 2 3 4 aa 5 / error: ora-01756: quoted string not properly terminated sql&gt; '); sp2-0042: unknown command "')" - rest of line ignored. sql&gt; sql&gt; insert into t1 values ('ok / not solo 2 3 4 aa 5 /a 6 '); 1 row created. sql&gt; sql&gt; delete from t1 where a = 'c 2 3 4 a/ 5 '; 0 rows deleted. </code></pre><p>sie müssen nicht mit start-/endblöcken herumspielen. der befehl sqlterminator innerhalb des befehls kann nicht verarbeitet werden, unabhängig davon, wo er sich in einer zeichenfolge befindet oder nicht. er kann keine zeilen mit schrägstrich allein in einer zeile in einer zeichenfolge verarbeiten.</p>