2009-02-24 8 views
9

Ich habe eine Tabelle mit einer großen Anzahl von Zeilen (10K +) und es Primärschlüssel ist GUID. Der Primärschlüssel ist gruppiert. Die Abfrageleistung ist in dieser Tabelle ziemlich niedrig. Bitte geben Sie Vorschläge, um es effizient zu machen.Verbesserung der Leistung des Cluster-Index GUID-Primärschlüssel

+1

Mögliche Duplikate von [Was sind die Best Practices für die Verwendung einer GUID als Primärschlüssel, insbesondere in Bezug auf die Leistung?] (http://stackoverflow.com/questions/11938044/what-are-the-best-practices-for-using-a-guid-as-a-primary-key-specifico-rega) – AHiggins

+0

Machen Sie es nicht gruppiert! (wenn es als GUID bleiben muss) – nashwan

Antwort

4

Sie müssen verwenden NEWSEQUENTIALID() statt finden hier Some Simple Code To Show The Difference Between Newid And Newsequentialid

+3

Ich habe viel über newsequentialid() gelesen, aber es scheint eine SQL-Funktion zu sein, kann mir jemand sagen, was zu tun ist, wenn Guid aus Code (C#) generiert werden. –

+0

-1 Was hat diese Antwort mit dem physischen Clustering von Indizes zu tun? Die Person, die die Frage gestellt hat, hat bereits angegeben, dass sie/er 10K + Zeilen hat und er/sie wahrscheinlich nicht gehen und alle Schlüssel ändern möchte. – nashwan

2

Sie können sequentielle GUIDs versuchen, die den Index effektiver machen. Info here.

38

Ein Clustered-Index auf GUID ist kein gutes Design. Die Besonderheit von GUID besteht darin, dass es zufällig ist, während ein gruppierter Index die Datensätze physisch nach dem Schlüssel sortiert. Die zwei Dinge sind völlig uneins. Für jedes Insert muss SQL die Datensätze auf dem Datenträger neu anordnen! Entfernen Sie das Clustering aus diesem Index!

Die Zeit für Clustering ist, wenn Sie eine "natürliche" Reihenfolge zu den Daten haben: Zeit eingefügt, Kontonummer, usw. Für Zeitfelder ist Clustering fast frei. Für Kontonummern kann es kostenlos oder billig sein (wenn Kontonummern nacheinander zugewiesen werden).

Zwar gibt es möglicherweise technische Möglichkeiten für das GUID-Problem, aber die beste Idee ist zu verstehen, wann Clustering verwendet werden soll.

+3

+1 für den harten Ton. In dieser Frage gibt es nicht viel Grauzone. Tu es nicht. – Droogans

-5

Bitte vermeiden Spalten für lenghty String gruppierten Index zu erstellen. GUID wird 36 Zeichen haben. Dies verringert die Abfrageleistung, die Sie selbst als Clustered-Index erstellt haben. Zur besseren Übung verwenden Sie Integer-Identity-Spalten.

+2

Guid ist 16 Bytes - nicht 36 Zeichen. –

+0

Integer sind kein gutes Design für große Datenbanken – Leonardo

+0

Kimberly Tripp diskutiert dieses Problem für große Tabellen sehr gut auf ihrer Website unter diesem Link: [GUIDs als PRIMARY KEYs und/oder der Clustering-Schlüssel] (http://www.sqlskills.com /BLOGS/KIMBERLY/post/GUIDs-as-PRIMARY-KEYs-andor-the-clustering-key.aspx). – Graeme

1

Sie müssen Ihre Abfrage analysieren. Wir können nur erraten, warum Ihre Abfragen schlecht abschneiden, ohne den Ausführungsplan zu sehen (den Sie problemlos von SQL Server oder Oracle abrufen können).

Wenn man bedenkt, dass eine GUID ein 128-Bit-Wert ist (falls roh gespeichert), schneidet eine GUID die Dichte der Daten- und Indexblöcke um bis zu 50% ab (im Falle des Primärschlüsselindex) GUID ist angemessen.

Aber das ist vielleicht nicht das Problem, also überprüfen Sie den Abfrageplan. Es könnte mehrere andere Probleme geben.

7

Es gibt kein Problem mit der Verwendung einer GUID als Primärschlüssel. Stellen Sie nur sicher, dass, wenn Sie tatsächlich die GUID als Primärschlüssel festgelegt haben, der Index, der automatisch erstellt wird, vom Typ Nicht gruppiert ist. Viele Leute vergessen (oder wissen nicht), dies in SQL Server zu tun.

Verwenden Sie NIEMALS einen gruppierten Index für eine GUID. Dies führt zu einer physischen Reihenfolge um die GUID auf der Festplatte, die offensichtlich sinnlos ist (wie bereits erwähnt)

+1

Verwenden Sie niemals einen gruppierten Index für eine GUID? Das ist eine mutige Aussage. Sind Sie sicher, dass es keine Gegenbeispiele gibt? – MarkPflug

+1

Bitte nennen Sie einen, wenn Sie einen kennen :-). Ich sehe keinen Grund, warum Sie etwas physisch um eine GUID bestellen möchten. – nashwan

+1

Wenn SELECT-Leistung wichtig ist und Sie auf GUID auswählen werden ... –

Verwandte Themen