Hinzufügen eines Clustered-Index zu einer HEAP-Tabelle in der App einer anderen Person

7

Wir verwenden eine proprietäre Anwendung, die auf SQL Server 2005 basiert und viele HEAP-basierte Tabellen enthält (dh keinen Clustered-Index). Im Laufe der Jahre sind diese Tabellen stark fragmentiert (z. B. 99% Fragmentierung). Ich muss sie defragmentieren.

In SQL Server 2005 gibt es keine Möglichkeit, dies direkt zu tun. Ich kann entweder:

  1. Erstellen Sie einen Clustered-Index für ein bereits vorhandenes Feld und behalten Sie ihn bei
  2. Erstellen Sie diesen Index, erstellen Sie die Tabelle neu und löschen Sie sie dann
  3. Mein eigenes Feld hinzufügen (zB Autoincrement-Schlüssel)

Dies ist eine große App, die von einem Anbieter geschrieben wurde - eine riesige Black Box. Ich bin nicht bestrebt, mit ihren Sachen herumzuspielen. Ich weiß nicht viel darüber, wie die Tabellen verwendet werden. Was ist die geringste Auswirkung, um dies zu tun?

Und als Folge: Es gibt viele dieser HEAP-basierten Tabellen, über ein Dutzend Datenbanken, die von der Anwendung verwendet werden. Gibt es eine Möglichkeit, Auswahl 2 oder 3 zu automatisieren? Oder wie soll ich auswählen, welche Tabellen geändert werden sollen?


UPDATE:
Um die Fragen zu beantworten, die sich aus den (sehr hilfreichen) Antworten ergeben:

  • Die Leistung war nicht akzeptabel. Der Anbieter teilte meinem Kunden mit, dass dies daran liegt, dass die Tabellen extrem fragmentiert sind und es in der Verantwortung des Kunden liegt, sie regelmäßig zu defragmentieren
  • Wir haben zwei Instanzen der Anwendung: eine Testinstanz und eine Produktionsinstanz
  • Ich habe zuerst alle Clustered-Tabellen defragmentiert, wodurch die Leistung erheblich verbessert wird
  • Das Support-Team des Anbieters war sehr wenig hilfreich. Sie haben uns gesagt, dass es unsere Verantwortung ist, die Tische zu defragmentieren. Wenn ich sie gefragt habe, wie sie die Defragmentierung von HEAP-basierten Tabellen empfehlen, sollte ich einen Clustered-Index hinzufügen? - Sie haben nur geantwortet "Das ist eine Microsoft-Frage".

Kurz gesagt, das Kundenserviceteam hat klargestellt: Sie müssen die Tabellen defragmentieren, wie Sie es tun, ist Ihr Geschäft.

Wie für zukünftige Versionen: Ja, neue Versionen entwickelt werden, und sie werden schließlich zu SQL Server migrieren 2012. Aber sie brauchen Performance - Lösungen heute .

Schließlich, da die Defragmentierung zu lange dauert: Es spielt keine Rolle. Sie haben riesige Tische mit 99% Fragmentierung; Die Anwendung wird nachts nicht verwendet. Ich kann leicht Stunden damit verbringen, sie zu defragmentieren.

S. Robert James
quelle
Kommentare sind nicht für eine ausführliche Diskussion gedacht. Dieses Gespräch wurde in den Chat verschoben .
Paul White 9

Antworten:

1

Fragmentierte Haufen sind wichtig. Je größer der Haufen ist, desto schwieriger ist es, die Daten zu durchsuchen. Die Leistung leidet.

Durch das Erstellen und Löschen des CI werden die Zeilen in der Tabelle bekanntlich neu angeordnet. Wenn der Anbieter keine Lösung anbietet und es in Ihrer Verantwortung liegt, die Fragmentierung zu beheben, habe ich genau das in der Vergangenheit getan. Ich würde das CI nicht verlassen, wenn ich es wäre, ich würde es fallen lassen. Ich würde es vermeiden, eine Spalte hinzuzufügen, da dies die Funktion der Tabelle dauerhaft ändert und dasselbe Argument vorgebracht werden könnte, wenn Sie das CI an Ort und Stelle belassen.

Wenn Sie dies tun, stellen Sie sicher, dass Sie über geeigneten Speicher zum Erstellen des CI verfügen, da dafür Speicher erforderlich ist, der mindestens der Größe des Heapspeichers entspricht, und berücksichtigen Sie auch, wann Sie dies tun: Ihre Service Level-Anforderungen.

Eric Higgins
quelle
8

Ich gehe davon aus, dass Sie ein Problem identifiziert haben, das behoben werden muss ... obwohl ich davon noch nicht ganz überzeugt bin.

Ähnlich wie bei meiner Antwort hier gibt es zwei Fälle, wenn es um Anbieteranwendungen geht.

  1. Die Anwendung ist derzeit unter Lizenz und / oder der Anbieter / Eigentümer möchte nicht, dass Sie sich einmischen.

    In diesem Fall kann auf jeden Fall nicht ändert das Schema in irgendeiner Weise, einschließlich Indizes jeder Art hinzufügen.

    Durch das Vornehmen von Schemaänderungen kann Ihr Lizenzvertrag tatsächlich ungültig werden. Dies kann jedoch auch zu Problemen für den Anbieter führen, wenn dieser beschließt, die Probleme in einem zukünftigen Schema-Update zu beheben. Aus persönlicher Erfahrung aus Sicht des Anbieters müssen wir Kunden manchmal sehr aktiv anweisen, keine Objekte mehr in unseren Datenbanken zu erstellen, da dies unsere Fähigkeit beeinträchtigt, Schemaänderungen erfolgreich anzuwenden. (Ich sage das nicht nur - wir hatten vor ein paar Monaten einen Fall, in dem ein Schema-Update für einen Client aufgrund einer unerwarteten Abhängigkeit von einem vom Client erstellten Objekt fehlgeschlagen ist. Etwas anderes Szenario als das Hinzufügen eines Index, aber dennoch kommt hoch.)

    Es gibt seltene Fälle, in denen Änderungen auf Datenbankebene in Ordnung sind, aber Sie müssen unbedingt sicherstellen, dass der Anbieter mit Ihren geplanten Aktivitäten einverstanden ist.

    Die beste Option für dieses Szenario ist ... eigentlich keine Änderungen selbst vorzunehmen. Stellen Sie einen überzeugenden Fall zusammen, um zu beweisen, warum es wichtig ist, diese Änderungen vorzunehmen, und legen Sie ihn dem Anbieter vor, damit er sie in einer zukünftigen Version implementieren kann.

    Aus Sicht eines Anbieters sind Vorschläge im Idealfall spezifisch, einfach zu implementieren und zu testen und wirken sich positiv auf alle Kunden aus. In einer großen Anwendung ist es möglicherweise (und wahrscheinlich auch) eine gute Idee, vorzuschlagen, dass alle Tabellen, die Heaps sind, in Clustered-Indizes konvertiert werden, aber es ist ein vollständiger Nichtstarter. Ermitteln Sie stattdessen die wichtigsten 5-10 wichtigsten Tabellen oder 2-3 Anwendungsbereiche, die von dieser Art von Änderung in Ihrer Umgebung profitieren würden.

  2. Die Anwendung ist nicht lizenziert oder der Anbieter / Eigentümer kümmert sich nicht darum, was Sie damit machen.

    In diesem Fall können Sie einen beliebigen Index hinzufügen, aber Objekte sollten mit denselben Namen an Ort und Stelle bleiben (beachten Sie, dass ich nicht dieselben Objekte angegeben habe). Abhängig davon, wie die Anwendung und die Datenbank intern funktionieren, gibt es hier viele Optionen. Wenn Sie weiterhin planen, zukünftige vom Hersteller bereitgestellte Schemaänderungen anzuwenden, gehen Sie sehr vorsichtig vor und stellen Sie sicher, dass Sie für alle Ihre Änderungen Rückgängig- Skripte erstellen .

    Der Schlüssel zum erfolgreichen Vornehmen von Änderungen liegt in der Aufrechterhaltung der Anwendungsfunktionalität ... natürlich leichter gesagt als getan, wenn Sie wesentliche Änderungen vornehmen möchten.

    Das einfache Hinzufügen von Clustered-Indizes ist jedoch ziemlich sicher. Die Herausforderung besteht darin, für jeden Index einen geeigneten Schlüssel auszuwählen. Dies sollte von Hand und nicht automatisiert erfolgen. Die einzige Möglichkeit, diesen Teil gut zu erledigen, besteht darin, sich mit den Zugriffsmustern und dem Zweck einer Tabelle vertraut zu machen.

    Wenn Sie sich das vorstellen, können Sie den gleichen Prozess wie im anderen Fall durchlaufen: Identifizieren Sie die 5-10 Tabellen, die die größte Gesamtwirkung haben würden, und beheben Sie diese zuerst. Sie werden vielleicht feststellen, dass dies alles ist, was getan werden muss.

Bearbeiten: Diese Antwort ist im Allgemeinen jetzt in Videoform verfügbar .

Jon Seigel
quelle
Vielen Dank für die durchdachte Antwort. Da ich die Erlaubnis des Anbieters habe, aber keine Beteiligung habe, möchte ich die am wenigsten invasive Korrektur durchführen, die ich durchführen kann. Es scheint mir immer noch, dass dies sein würde: CI erstellen, neu erstellen, CI löschen.
S. Robert James
1
Sie müssen nicht "neu erstellen". Durch das Erstellen des CI wird der Heap als Teil des CI-Erstellungsvorgangs neu angeordnet.
Eric Higgins