2016-07-31 3 views
1

Ich habe eine Tabelle, die horizontal unterteilt wie diese werden Diese TabelleWenn eine Tabelle horizontal partitioniert ist, kann sie durch den Primärschlüssel abgefragt werden?

CREATE TABLE mytable 
(
    id int IDENTITY(1,1) NOT NULL, 
    customer_id [int] NOT NULL, 
    blessdate date NOT NULL, 
    value1 varchar(max) NULL, 
    value2 varchar(max) NULL 

    CONSTRAINT [PK_History] 
     PRIMARY KEY CLUSTERED ([id] ASC) 
      WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, 
       IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, 
       ALLOW_PAGE_LOCKS = ON) 
) ON [PRIMARY] 

sieht durch die customer_id über mehrere Computer-Hashing. Kann ich diese partitionierte Tabelle so abfragen?

select * 
from mytable 
where id = 6709 

Wie man sehen kann ich nicht die customer_id in der Abfrage enthalten waren. Wenn ich die Tabelle so abfrage, wird es eine Leistungseinbuße geben? Wie wird SQL Server wissen, welche Partition abgefragt werden soll?

+0

Meine Vermutung wäre ja ... Sie müssen jede Partition einzeln scannen, um die richtige customer_id zu finden. Das Optimierungsprogramm hat keine Hinweise darauf, welches PK sich auf welcher Partition befindet, da sich die Partition in einer anderen Spalte befindet. – Brad

+0

Es würde alle Partitionen überprüfen, aber natürlich können Sie die Abfrage ausführen. Es müsste keinen Scan durchführen, da es die Daten schnell im Index finden kann. –

+0

"Diese Tabelle wird horizontal partitioniert, indem die customer_id über mehrere Computer verteilt wird." Wie werden Sie das dann tun? Ohne eine Erklärung für genau das Schema, das Sie im Sinn haben, ist diese Frage nicht zu verantworten. –

Antwort

0

Jede Partition muss berührt werden, wenn die Partitionierungsspalte nicht im Prädikat WHERE angegeben ist. Wenn ein geeigneter Index existiert, kann eine Suche gegen jede Partition durchgeführt werden, anstelle einer Abtastung. Der zusätzliche Overhead hängt von der Anzahl der Partitionen und der Tiefe des B-Tree-Indexes ab. Bei einer Singleton-Suche ist die Leistung im Vergleich zu einer nicht partitionierten Tabelle schlechter.

Beachten Sie jedoch, dass SQL Server erfordert, dass die Partitionierungsspalte Teil aller eindeutigen Indizes einschließlich des Primärschlüssels ist. Wenn Sie einen Hashwert partitionieren, muss der Hash daher Teil des Primärschlüssels sein, wenn der Primärschlüssel partitioniert ist. Um eine Primärschlüsseleinschränkung allein für id zu implementieren, darf der PK-Index nicht partitioniert sein.

Sie haben erwähnt, dass customer_id über mehrere Computer verteilt wird. Möchten Sie die Tabelle auf mehrere Server verteilen?

+0

Ja, ich plane, die Tabelle auf mehrere Server zu verteilen. – Luke101

+0

Wie planen Sie den Zugriff auf die Tabelle über mehrere Server hinweg? Eine UNION ALL-Ansicht mit Verbindungsservern? –

0

Ihre Abfragen werden weiterhin einen Clustered-Index-Scan verwenden, wenn dieses Feld verwendet wird. Dieser Index wird höchstwahrscheinlich in der Dateigruppe PRIMARY enthalten sein, da der Index nicht partitioniert ist. Sie können es nicht in partitionsspezifischen Funktionen verwenden, da es sich nicht in der partitionierten Dateigruppe befindet. Es verhält sich jedoch wie normaler Index.

Eine Sache zu beachten ist, dass mehr als wahrscheinlich Ihre primäre Datei den gesamten Index enthält und wenn es wirklich groß wird Ihre Backups Backups und was nicht mehr im Laufe der Zeit dauern wird.

Verwandte Themen