sql >> Database >  >> RDS >> Sqlserver

Een index maken op een tabelvariabele

De vraag is getagd met SQL Server 2000, maar in het belang van mensen die de nieuwste versie ontwikkelen, zal ik dat eerst behandelen.

SQL Server 2014

Naast de methoden voor het toevoegen van op beperkingen gebaseerde indexen die hieronder worden besproken, kunnen in SQL Server 2014 ook niet-unieke indexen rechtstreeks worden opgegeven met inline-syntaxis op declaraties van tabelvariabelen.

Voorbeeldsyntaxis daarvoor staat hieronder.

/*SQL Server 2014+ compatible inline index syntax*/
DECLARE @T TABLE (
C1 INT INDEX IX1 CLUSTERED, /*Single column indexes can be declared next to the column*/
C2 INT INDEX IX2 NONCLUSTERED,
       INDEX IX3 NONCLUSTERED(C1,C2) /*Example composite index*/
);

Gefilterde indexen en indexen met opgenomen kolommen kunnen momenteel echter niet worden gedeclareerd met deze syntaxis SQL Server 2016 ontspant dit wat verder. Vanaf CTP 3.1 is het nu mogelijk om gefilterde indexen voor tabelvariabelen te declareren. Door RTM mag het kan zijn dat opgenomen kolommen ook zijn toegestaan, maar de huidige positie is dat ze "waarschijnlijk niet in SQL16 zullen komen vanwege resourcebeperkingen"

/*SQL Server 2016 allows filtered indexes*/
DECLARE @T TABLE
(
c1 INT NULL INDEX ix UNIQUE WHERE c1 IS NOT NULL /*Unique ignoring nulls*/
)

SQL Server 2000 - 2012

Kan ik een index op Naam maken?

Kort antwoord:Ja.

DECLARE @TEMPTABLE TABLE (
  [ID]   [INT] NOT NULL PRIMARY KEY,
  [Name] [NVARCHAR] (255) COLLATE DATABASE_DEFAULT NULL,
  UNIQUE NONCLUSTERED ([Name], [ID]) 
  ) 

Een meer gedetailleerd antwoord vindt u hieronder.

Traditionele tabellen in SQL Server kunnen een geclusterde index hebben of zijn gestructureerd als hopen.

Geclusterde indexen kunnen ofwel als uniek worden gedeclareerd om dubbele sleutelwaarden niet toe te staan, of standaard op niet-uniek worden ingesteld. Als het niet uniek is, voegt SQL Server stil een uniek kenmerk toe aan dubbele sleutels om ze uniek te maken.

Niet-geclusterde indexen kunnen ook expliciet als uniek worden gedeclareerd. Anders voegt SQL Server in het niet-unieke geval de rij-locator (geclusterde indexsleutel of RID voor een heap) toe aan alle indexsleutels (niet alleen duplicaten), dit zorgt er opnieuw voor dat ze uniek zijn.

In SQL Server 2000 - 2012 kunnen indexen op tabelvariabelen alleen impliciet worden gemaakt door een UNIQUE aan te maken of PRIMARY KEY beperking. Het verschil tussen deze typen beperkingen is dat de primaire sleutel zich op kolom(men) zonder nulling moet bevinden. De kolommen die deelnemen aan een unieke beperking kunnen een nulwaarde hebben. (hoewel SQL Server's implementatie van unieke beperkingen in de aanwezigheid van NULL s is niet die gespecificeerd in de SQL-standaard). Een tabel kan ook maar één primaire sleutel hebben, maar meerdere unieke beperkingen.

Beide logische beperkingen zijn fysiek geïmplementeerd met een unieke index. Indien niet expliciet anders aangegeven, de PRIMARY KEY wordt de geclusterde index en unieke beperkingen niet-geclusterd, maar dit gedrag kan worden overschreven door CLUSTERED op te geven of NONCLUSTERED expliciet met de beperkingsverklaring (voorbeeldsyntaxis)

DECLARE @T TABLE
(
A INT NULL UNIQUE CLUSTERED,
B INT NOT NULL PRIMARY KEY NONCLUSTERED
)

Als gevolg van het bovenstaande kunnen de volgende indexen impliciet worden gemaakt op tabelvariabelen in SQL Server 2000 - 2012.

+-------------------------------------+-------------------------------------+
|             Index Type              | Can be created on a table variable? |
+-------------------------------------+-------------------------------------+
| Unique Clustered Index              | Yes                                 |
| Nonunique Clustered Index           |                                     |
| Unique NCI on a heap                | Yes                                 |
| Non Unique NCI on a heap            |                                     |
| Unique NCI on a clustered index     | Yes                                 |
| Non Unique NCI on a clustered index | Yes                                 |
+-------------------------------------+-------------------------------------+

Dat laatste vraagt ​​wat uitleg. In de tabelvariabeledefinitie aan het begin van dit antwoord staat de niet-unieke niet-geclusterde index op Name wordt gesimuleerd door een unieke index op Name,Id (denk eraan dat SQL Server de geclusterde indexsleutel sowieso stilletjes aan de niet-unieke NCI-sleutel zou toevoegen).

Een niet-unieke geclusterde index kan ook worden bereikt door handmatig een IDENTITY . toe te voegen kolom om te fungeren als een uniek kenmerk.

DECLARE @T TABLE
(
A INT NULL,
B INT NULL,
C INT NULL,
Uniqueifier INT NOT NULL IDENTITY(1,1),
UNIQUE CLUSTERED (A,Uniqueifier)
)

Maar dit is geen nauwkeurige simulatie van hoe een niet-unieke geclusterde index normaal gesproken daadwerkelijk zou worden geïmplementeerd in SQL Server, omdat hierdoor de "Uniqueifier" aan alle rijen wordt toegevoegd. Niet alleen degenen die het nodig hebben.



  1. Hoe werkt het ophalen van gegevens van SQL Server naar SqlDataReader?

  2. Hoe de volgorde van invoeging in SQL Server te behouden?

  3. Kolommen selecteren en ordenen die niet in Groupy By SQL-instructie staan ​​- Oracle

  4. Een bestand schrijven met meerdere threads