Frage

Ich habe eine Tabelle mit mindestens einer million Einträge.Diese Zeilen wurden erstellt, indem eine benutzerdefinierte app, die liest mehrere SharePoint-Websitesammlungen und speichert den Artikel-urls in der Tabelle.Jetzt, da wir Lesen die Websitesammlungen, die in einer seriellen Art und Weise, die ersten paar tausend Zeilen gehören zu der ersten Website-Sammlung, neben ein paar tausend gehören zur zweiten Websitesammlung, und so auf.

Ich habe eine weitere app, die liest diese Tabelle in einer sequentiellen Weise.Jedoch, diese Art, die ich am Ende senden von HTTP-Anforderungen, um den gleichen Websitesammlung für eine längere Zeit.

Ich weiß, ich könnte Holen Sie sich zufällige Ergebnisse aus der Tabelle in meiner zweiten app.Aber, dass ist nicht eine option.Ich kann nicht ändern, wie die zweite app funktioniert.

Jetzt ist die Frage:Wie kann ich alle Zeilen in der Tabelle, shuffule Sie und speichern Sie Sie zurück in die Tabelle?

Update:SQL Server 2008 R2 ist mein Datenbank-Server

War es hilfreich?

Lösung

Wenn die aufrufende app ist explizit festlegen einer bestimmten Reihenfolge in die Abfrage (wenn Sie mit MSSQL Sie können dies überprüfen, indem Sie ein profiler-Sitzung ausgeführt wird, während die app seine Sache macht, andere DMBSs, werden ähnliche Optionen für die Protokollierung), dann gibt es nichts, was Sie tun können, und wenn nicht, Sie kann nicht vollständig garantiert in keiner bestimmten Reihenfolge.

Wenn keine explizite ORDER BY-Klausel angegeben wird, dann werden die Daten kommen in einer Reihenfolge, die offiziell "undefined" - es wird sein, was auch immer, um den server findet, die meisten convineint.Für eine einzelne Tabelle, Abfrage-diese werden höchstwahrscheinlich die Reihenfolge der Primärschlüssel.In MSSQL wenn Sie einen clustered-index die Ergebnisse werden wahrscheinlich herauskommen, dass, um für einen single-table-Abfrage.Bei multi-table-Abfragen es ist noch weniger klar, wie es hängt davon ab, welche Art rund um den query Planer wählt, um zu gehen, um Ihre Ergebnisse (die ohne expliziten index Hinweise könnte variieren im Laufe der Zeit das Gleichgewicht von Daten in den Tabellen, wie geschätzt durch die index-Statistiken des server hält, verpasst).

Wenn die Tabelle ohne gruppierten index oder primary key-die Daten werden dann wahrscheinlich, dass in beliebiger Reihenfolge so ähnlich wie die, um die Daten eingefügt wurde.In diesem Fall könnten Sie versuchen:

SELECT * INTO temp_table FROM table_to_be_reordered
DELETE table_to_be_reordered
INSERT table_to_be_reordered SELECT * FROM temp_table ORDER BY NEWID()

oder kann dies schneller sein

INSERT table_to_be_reordered SELECT * FROM temp_table ORDER BY NEWID()
DROP TABLE table_to_be_reordered
EXEC sp_rename 'temp_table', 'table_to_be_reordered'

In der oben NEWID() ist MSSQL-Funktion, um einen UUID, und es verwendet zufällige eher als sequenzielle IDs von Standard - in anderen DMBSs sollten Sie eine ähnliche Funktion, die Sie verwenden können.Seien Sie vorsichtig mit Ihrer Wahl der Funktion:zum Beispiel MSSQL unter der RAND () - Funktion ist evaulated einmal pro Abfrage, nicht einmal pro Zeile, also SELECT * FROM somewhere ORDER BY RAND() hätte nicht die desited-Effekt (Sie können sehen, warum, indem Sie ausführen so etwas wie SELECT RAND(), * FROM some_table).

Wenn Sie mit MSSQL (deine Frage nicht Zustand, DBMS, auf das Sie abzielen) und nicht bereits über einen gruppierten index für die Tabelle, und verfügen entweder über eine ausreichend zufällige Spalte (eine UUID-Spalte zum Beispiel) oder hinzufügen könnte man ohne Auswirkungen auf die aufrufende app, könnten Sie einen gruppierten index erstellen, das wäre schneller als die Option SELECT INTO / DELETE / WÄHLEN Sie IN oben.Aber wieder:dieser wird überhaupt keine Wirkung wenn die app explizit zu Fragen, für die Ergebnisse, die in einer bestimmten Reihenfolge und kann keine Wirkung sowieso sonst.

Andere Tipps

Sie geben nicht an, welche Datenbank, aber in Oracle können Sie dies tun, um:

CREATE TABLE RAND_TABLE AS (SELECT * FROM ORIG_TABLE ORDER BY DBMS_RANDOM.RANDOM());

Sie benötigen genügend Platz in Ihrem Temp -Tablespace, um mit der Sortierung fertig zu werden. Wenn Sie möchten, können Sie die Tische umbenennen ORIG_TABLE und RAND_TABLE sie überzutauschen. Ich denke nicht, dass es möglich ist, einen Tisch "an Platz" zu mischen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit dba.stackexchange
scroll top