Ich habe eine Tabelle mit drei Spalten: HashUID1, HashUID2, Address_Name (eine Text-E-Mail-Adresse, und die beiden vorherigen Hash-Spalten sind eine verrückte Kreation, um Ereignisteilnehmertabellen mit E-Mail-Adressen zu verknüpfen. Es ist hässlich, es funktioniert kaum Fokus auf den Adressnamen-Index)
Es hat 78 Millionen Zeilen. Nicht richtig sortiert. Unabhängig davon ist dieser Index auf viele schnelle LUNs aufgeteilt und führt WIRKLICH schnelle Indexsuchen durch.
Ich muss eine Reihe von Abfragen erstellen, um jeweils nur 20.000 "Zeilen pro Seite" zu extrahieren, aber Konflikte oder Dupes zu vermeiden. Gibt es eine einfache Möglichkeit, alle auszuwählen und darin zu blättern, da es keine Identitätsspalte oder leicht zu ordnende Spalte gibt?
Stimmt es, dass ich, wenn ich eine Auswahl * aus hugetablewithemails in eine temporäre Tabelle mache, durch row_number auswähle, dass die Tabelle für die Dauer der Transaktion im Speicher bleibt, was für mich eine übermäßige Menge an Speicherressourcen darstellt ? Dies scheint die bevorzugte Methode zum Paging zu sein. Ich würde lieber nach statistischen Prozentsätzen blättern. :((
Es gibt einen Index, der die E-Mail-Adresse address_name in der richtigen Reihenfolge verwaltet und gut gepflegt ist. In der vergangenen Woche wollte ich diesem anderen Entwickler helfen, indem ich einige Zeit damit verbrachte, einen Prozess zu erstellen, der Bereiche basierend auf Fensterfunktionen basierend auf Statistiken ausspuckt (was ich nicht besonders gut kann, aber diese Abfrage hat mich wirklich interessiert) Geben Sie einen Zeichenbereich von 1 bis (variabel) LINKS WIE Zeichen des Index an, der 20.000 Zeilen entspricht. Aber ich hatte noch nicht einmal Zeit, die Abfrage zu starten ...
Paar Fragen:
Irgendwelche Vorschläge? Nicht auf der Suche nach aktuellem Code, nur einige Hinweise oder Vorschläge, die auf Erfahrungen basieren, möglicherweise Vorbehalte. Ich möchte zusätzliche Index-Scans nach dem ersten Scan vermeiden.
Ist das der richtige Ansatz?
Ich denke daran, die Summe des Index aller E-Mail-Adressen zu brechen, die Anzahl der Zeilen (*) / 20.000 zu erfassen und diese als Fensterfunktion zu verwenden, um die Werte für die minimale / maximale Teilzeichenfolge (1,5) basierend auf den Prozentsätzen der gesamten Zeilenanzahl zu gruppieren Gruppierungsbereiche erstellen. Gedanken?
Dies gilt für einen ETL-Prozess, der keine Quelldatenbanken ändern kann.
Ich hoffe mit einem vollständigen Index-Scan kann ich Folgendes tun:
Abfrage, um einen Histographen basierend auf der Indexverwendung (alphabetisch sortiert) zu erhalten und ihn mit min / max aufzuteilen (mit Fenstern), um einige Bereiche wie diesen zu erstellen, um den benötigten Index leicht zu finden:
A-> AAAX, (z. B. 20.000 Zeilen) AAA-Z, B-> (weitere 20.000), B-> BAAR -> BAAR-> CDEFG -> CDEFH> FAAH usw.
In diesen Datenbanken wird für diesen ETL-Prozess ein Lese-Commit ausgeführt. Wir versuchen nur, es in 20.000 Zeilen zu stapeln, weil die Datenbankadministratoren sagen, dass wir zu viele Netzwerkressourcen verwenden, indem wir Tabellen vollständig abrufen. Wenn sich die Daten geändert haben (was ein Problem darstellt), aktualisieren wir unsere DW- und Staging-Tabellen im laufenden Betrieb.
Ich würde gerne temporäre Tabellen verwenden, aber wenn ich das tun würde, würde ich in tempdb übergehen und von den Datenbankadministratoren per E-Mail Peitschenhiebe erhalten, und dass die Datenbank zu groß ist.