2016-03-25 4 views
0

Ich erstelle eine Tabelle Brands mit folgendem Schema:SQL Server: Constraint Optimierung für eine Abfrage basiert auf zwei Säulen durchführen

UserId 
CarId 
Brand 
  • Die UserId Referenzen die id eines Benutzers in der user Tabelle
  • die CarId Referenzen die id ein Auto in der car Tabelle

Die einzige Abfrage, die ich verwenden werde, ist eine Suche basierend auf diesen 2 Spalten, um die entsprechende Marke zu erhalten.

Also meine Frage war über die Einschränkung Teil, wie ich bin ein Anfänger, würde ich gerne wissen, welche Art von Einschränkung (Index, Primärschlüssel, gruppiert oder nicht gruppiert, auf jedem Feld oder auf den 2 Feldern zusammen verwenden) um meine Abfrage zu optimieren, die möglich ist.

Das ist mein Skript jetzt:

IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[Brands]') AND type in (N'U')) 
BEGIN 
    CREATE TABLE [Brands] 
    (
     UserId BIGINT NOT NULL 
      CONSTRAINT [FK_Brands_Users] 
      FOREIGN KEY REFERENCES [Users] (UserId), 
     CarId BIGINT NOT NULL 
      CONSTRAINT [FK_Brands_Cars] 
      FOREIGN KEY REFERENCES [Cars] (CarId), 
     Brand nvarchar(15),    
    ); 
END 
GO 

ALTER TABLE [Brands] 
ADD CONSTRAINT [Unique_UserId_BrandId] UNIQUE(UserId, BrandId); 
GO 
+0

Constraint wirkt sich nicht auf die Abfrageleistung aus. Es ist der Index, der hilft – Squirrel

+0

Also sollte ich einen Primärschlüssel für jedes Feld oder einen Primärschlüssel, der beide Felder enthält, erstellen? – user2443476

+1

Sie können nur einen Primärschlüssel in der Tabelle haben. – Squirrel

Antwort

0

ich einen Primärschlüssel einschließlich der beiden Felder schaffen würde. Wenn Sie einen Primärschlüssel definieren, wird automatisch ein Clustered-Index erstellt. Auch Ihr Primärschlüssel hat einen einzigartigen Constraint eingebaut. Ihre Tabelle ist jetzt ein Heap, wie Sie ihn oben geschrieben haben, was nicht gut ist. Sie können zusätzlich einen zusätzlichen nicht gruppierten Index für CarId erstellen. Einen zusätzlichen nicht-gruppierten Index auf UserId zu haben ist nicht nützlich, denke ich. Die Spalte UserId kann den Clustered-Index verwenden, weil es das erste Feld im Clustered-Index ist, aber ich bin mir nicht sicher.

Verwandte Themen