Frage

In einem aktuellen Projekt der „Leit“ Entwickler entwickelt ein Datenbank-Schema in dem „größeren“ Tabellen mit Blick auf die Hauptdatenbank über zwei separate Datenbanken aufgeteilt würden zusammen die würden Vereinigung die beiden separaten Datenbank-Tabellen. Die Hauptdatenbank ist, was die Anwendung aus der so diesen Tabellen getrieben sah und fühlte sich wie gewöhnliche Tabellen (außer einigen skurrilen Dinge rund um die Aktualisierung). Dies schien wie ein riesiges Leistungsproblem. Wir sehen Probleme mit Leistung um diese Tabellen aber nichts zu ihm seiner Meinung über sein Design machen zu ändern. Nur frage mich, was ist der beste Weg, dies zu tun, oder wenn es sich sogar Mühe wert?

War es hilfreich?

Lösung

Ich glaube nicht, dass Sie wirklich etwas zu gewinnen, indem Partitionierung die Tabelle über mehrere Datenbanken in einem einzigen Server gehen. Alles, was Sie haben im Wesentlichen dort getan mit dem „Tisch“ in erster Linie den Aufwand erhöht wird mehrere Instanzen in der Arbeit von (d offen in zwei verschiedenen DBs) davon unter einer einzigen SQL Server-Instanz.

Wie groß ein Datensatz haben Sie? Ich habe einen Klienten mit 6.000.000 Zeilen Tabelle in SQL Server, die im Wert von Verkaufsdaten 2 Jahre enthalten. Sie benutzen es transaktions und ohne noticiable Geschwindigkeitsprobleme berichten.

die Indizes Tuning und die richtige gruppierten Index Auswahl ist entscheidend für die Leistung natürlich.

Wenn das Dataset wirklich groß ist, und klicken Sie auf das Partitionieren, werden Sie mehr für Ihr Geld bekommen Partitionierung der Tabelle auf physischen Servern.

Andere Tipps

Das Partitionieren ist nicht etwas zu leichte Schulter zu nehmen, da es viele subtile Auswirkungen auf die Leistung sein kann.

Meine erste Frage ist verweisen Sie einfach auf größere Tabellenobjekte in separaten Dateigruppen platzieren (auf separaten Spindeln) oder beziehen Sie sich auf die Datenpartitionierung innerhalb eines Tabellenobjekt?

Ich vermute, dass die beschriebene Situation ist ein Versuch, die physische Speicherung von bestimmten großen Tabellen auf verschiedene Spindeln aus dem Rest der Tabellen zu haben. In diesem Fall Hinzufügen des zusätzlichen Overhead von separaten Datenbanken, verlieren jede Fähigkeit referentielle Integrität über Datenbanken zu erzwingen, und die Auswirkungen auf die Sicherheit ermöglichen Cross-Datenbank Besitz Verkettung bietet keinen Vorteil über mehrere Dateigruppen in einer einzigen Datenbank. Wenn, wie durchaus möglich ist, werden die separaten Datenbanken, die Sie in Ihrer Frage beziehen sich nicht einmal auf separaten Spindeln gespeichert sind aber alle auf der gleichen Spindel gespeichert dann negieren Sie sogar die leichten Leistungsvorteil Sie Ihre Datenträger-Aktivität gewonnen haben, könnte durch physikalische Trennung und haben absolut keinen Vorteil erhalten.

würde ich vorschlagen, anstatt zusätzliche Datenbanken mit großen Tabellen, die Sie in die Dateigruppe in der SQL Server-Online oder für eine schnelle Überprüfung aussehen halten sieht diese Artikel:

Wenn Sie Interesse an Datenpartitionierung (einschließlich Aufteilung in mehrere Dateigruppen) sind dann empfehle ich Artikel von Kimberly Tripp zu lesen, die eine hervorragende Präsentation zum Zeitpunkt SQL Server 2005 gab herauskam über die Verbesserungen dort zur Verfügung. Ein guter Anfang ist dieses White Paper

Welche Version von SQL Server verwenden Sie? SQL Server 2005 hat Tabellen aufgeteilt, aber im Jahr 2000 (oder 7.0) Sie benötigten Partition Ansichten zu verwenden.

Auch, was die Argumentation war für die Tabellenpartitionen in einer separaten Datenbank setzen?

Wenn ich je hatte Tabellen in der Vergangenheit (vor 2005) zu partitionieren, ist es in der Regel von einer Datumsspalte oder etwas ähnliches, mit Blick auf den verschiedenen Partitionen. Bücher online hat einen Abschnitt, der darüber spricht, wie um es auf diese und alle Regeln zu tun. Sie müssen sich an die Regeln, um es, wie funktioniert es soll funktionieren.

Der Schlüssel ist daran zu erinnern ist, dass Ihre Partitionierungsspalte Teil des Primärschlüssels sein muss, und Sie wollen versuchen, immer diese Spalte in jedem Zugriff auf den Tisch zu verwenden, um so, dass der Optimierer Partitionen ignorieren können, die nicht betroffen sein sollten die Abfrage aus.

nachschlagen „partitionierten Tabelle“ in MSDN und Sie sollten eine komplette Tutorial für SQL Server 2005 partitionierten Tabellen sowie Beratung finden können, wie sie für eine maximale Leistung einzustellen.

Sind Sie fragen über die besten Praktiken in Bezug auf die Datenbank-Design, oder davon zu überzeugen, Ihre Führung seine Meinung zu ändern? :)

In Bezug auf Design ... Zurück in dem Goode olde Tagen wurde vertikale Partitionierung manchmal benötigt um Datenbank-Engine Einschränkungen zu arbeiten, wo die Anzahl der Spalten in einer Tabelle eine harte Grenze war, wie 255 Spalten. In diesen Tagen die wichtigsten Vorteile sind rein für die Leistung: Putting selten verwendet Spalten oder Kleckse auf einem separaten Datenträger-Array. Aber wenn Sie regelmäßig Dinge aus beiden Tabellen ziehen wird es wahrscheinlich ein Verlust. Es klingt wie Ihre Führung wird von einem Fall der vorzeitigen Optimierung leiden.

Im Hinblick auf die sagen, Ihre Führung ist falsch ... das erfordert Diplomatie. Wenn er von Gemurmel der Unzufriedenheit in Bezug auf Leistung bewusst ist, ein Benchmark ist wahrscheinlich der beste Weg, um den Unterschied zu zeigen.

Erstellen Sie eine neue physische Tabelle irgendwo mit ‚create table t1 als select * from view1‘ und dann mit der vertikal partitionierten Tabelle und Ihre neuen Tabelle etwas langwierigen Batch-Lauf. Wenn es so schlimm ist, wie Sie sagen, sollte der Unterschied deutlich.

Aber auch das kann eine vorzeitige Optimierung sein. Finden Sie heraus, was die Endnutzer der Leistung denken. Wenn die Leistung gut genug ist, für einige Definition gut, dann fix nicht, was kaputt ist es nicht.

Es ist ein klarer Vorteil für die Tabellenpartitionierung (unabhängig davon, ob sie auf gleiche oder unterschiedliche Dateigruppen / disks ist). Wenn die Partition Spalte richtig gewählt ist, werden Sie feststellen, dass Ihre Abfragen nur die gewünschte Partition treffen wird. So vorstellen, wenn Sie 100 Millionen Platten haben (ich habe partitionierten Tabellen viel größer als das - etwa 20+ Milliarden Zeilen) und wenn in den meisten Fällen mehr als 70% Ihres Datenzugriff ist nur eine bestimmte Kategorie oder Timeline oder die Art der Daten dann hilft es, die am meisten abgerufenen Daten in einer separaten Partition zu halten. Darüber hinaus können Sie die Partition mit separaten Dateigruppen mit verschiedenen Arten von Festplatten (SATA, Fibre Channel, SSDs) so ausrichten, dass die meisten zugegriffen / Gebucht-Daten auf dem schnellsten Speicher sind und die am wenigsten / selten zugegriffen sind praktisch auf langsameren Festplatten.

Obwohl in SQL Server gibt es begrenzte Partitionierung Fähigkeit, im Gegensatz zu Oracle. Sie können nur eine Spalte für die Partitionierung (auch in SQL 2008) wählen. So haben Sie eine Spalte mit Bedacht zu wählen, wo diese Spalte auch Bestandteil der meisten Ihrer häufigen Anfragen ist. Zum größten Teil finden die Menschen es einfach durch eine Datumsspalte zu partitionieren zu wählen. Doch obwohl es logisch scheint, so zu partitionieren, wenn Ihre Fragen nicht, dass die Spalte als Teil der Bedingung haben, werden Sie nicht ausreichend profitiert von Partitionierungs gewinnen werden (in anderen Worten, wird Ihre Anfrage schlagen alle die Partition unabhängig).

Es ist viel einfacher, für Data Warehouse / Data-Mining-Typ-Datenbanken als OLTP zu partitionieren, da die meisten DW Datenbankabfragen nach Zeitraum beschränkt sind.

Das ist, warum in diesen Tagen aufgrund der Datenmenge von Datenbanken umgegangen werden, ist es ratsam, die Anwendung so zu gestalten, dass jemals Abfrage durch eine breitere Gruppe beschränkt ist, wie Zeit, geographische Lage oder solche, so dass, wenn solche Spalten werden so gewählt, zum Partitionieren Sie maximalen Nutzen gewinnen werden.

Ich würde mit der Annahme nicht einverstanden, dass nichts durch Partitionierung gewonnen werden kann.

Wenn die Partition Daten physisch und logisch ausgerichtet ist, dann sollte das Potential IO von Anfragen drastisch reduziert werden.

Zum Beispiel haben wir eine Tabelle, die das Stapelfeld als INT hat einen INT darstellt.

Wenn wir die Daten durch dieses Feld partitionieren und dann eine Abfrage für eine bestimmte Charge erneut ausführen, sollten wir in der Lage sein Set-Statistiken laufen io ON vor und nach der Partitionierung und sieht eine Reduzierung der IO,

Wenn wir eine Million Zeilen pro Partition und jede Partition auf ein separates Gerät geschrieben. Die Abfrage sollte die nicht-essentiellen Partitionen beseitigen können.

Ich habe nicht viel Partitionierung auf SQL Server getan, aber ich habe Erfahrung der Partitionierung auf Sybase ASE, und dies wird als Partition eliminiation bekannt. Wenn ich Zeit habe werde ich das Szenario auf einem SQL Server 2005-Computer testen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top