Skapa ett index i SQL Server är en måttlig enkel uppgift som förbättrar sökprestandan. Vi kan skapa ett grupperat såväl som ett icke-grupperat index som kan vara antingen unikt eller icke-unikt enligt krav.
Om vi redan har skapat ett index på ett bord, måste vi dock lägga till / ta bort en eller flera kolumner till ett befintligt index på grund av en kravändring. I det här fallet kan vi använda DROP_EXISTING alternativet utan att skriva den extra raden av kod för att släppa det befintliga indexet först och sedan skapa det igen. (Det här är en gammaldags kodningsstil: Släpp om det finns och skapa ett nytt.)
Med DROP_EXISTING = ON, Kommer SQL Server att släppa och bygga om det befintliga grupperade / icke-grupperade indexet med ändrade indexspecifikationer, vilket håller indexnamnet samma som det existerar. Vi kan lägga till / ta bort kolumner, ändra sorteringsordningen eller ändra en filgrupp också.
DROP_EXISTING är som standard OFF, och det fungerar inte om du inkluderar detta alternativ medan du skapar ett nytt index för första gången. DROP_EXISTING = PÅ i SQL Server fungerar bara om du redan har ett index med det angivna namnet på en tabell.
Med DROP_EXISTING kan vi göra följande:
1. Ändring av ett icke-grupperat index till ett klusterindex är tillåtet.
Med DROP_EXISTING kan vi inte göra följande:
1. Ändring av ett klusterindex till någon annan typ av index är inte tillåtet.
Fördelar med att använda DROP_EXISTING = ON
Om vi skapar ett klusterindex på ett bord, som redan har ett icke-grupperat index, använder vi DROP_EXISTING = ON i SQL Server medan du skapar ett klusterindex har följande fördelar:
• Icke-grupperade index återuppbyggs inte igen. Om vi skapar ett klusterindex med DROP_EXISTING = ON i SQL Server vet vi att klustringsnyckeln inte har ändrats i det icke-klusterade indexet. Detta sparar en betydande tid. Varje icke-grupperat index har en klustringsnyckel som refererar till det klusterade indexet. Om ett klusterindex återuppbyggs måste SQL Server också ändra det icke-klusterade indexet. Det är dock fördelaktigt att använda DROP_EXISTING = ON eftersom vi inte behöver bygga upp de icke-grupperade indexen igen.
• Om vi använder den gamla metoden för att släppa och skapa ett klusterindex, gör det att alla icke-grupperade index på den tabellen ska byggas om igen för att matcha klustringsnyckeln. Detta kan sparas med DROP_EXISTING = ON med klusterindex.
Syntax för Index Creation med DROP_EXISTING
CREATE [Unique] [Clustered | NonClustered] INDEX Index_Name ON (kolumnnamn / s) MED DROP_EXISTING = {ON | AV};
exempel
Skapa ett provbord, Medarbetare.
IF OBJECT_ID ('Employee', 'U') ÄR INTE NULL DROP TABLE Employee; CREATE TABLE Anställd (Id INT PRIMÄR KEY, Namn VARCHAR (50), Telefon VARCHAR (10), Kön CHAR (1), Land VARCHAR (100), Lön DECIMAL (18,2));
1. DROP_EXISTING = ON misslyckas när du skapar ett nytt index
I följande exempel försöker alternativet DROP_EXISTING = ON att hitta ett existerande index med NCI_Employee_TelphoneGender namn, eftersom det inte går ut, uppstår indexbildning med följande felmeddelande.
SKAPA NONCLUSTERED INDEX NCI_Employee_TelphoneGender ON Medarbetare (Telefon, Kön) MED (DROP_EXISTING = ON);
Msg 7999, Level 16, State 9, Line 1
Det gick inte att hitta något index som heter "NCI_Employee_TelphoneGender" för tabellen "Employee".
Skapa ett index
SKAPA NONCLUSTERED INDEX NCI_Employee_TelphoneGender ON Medarbetare (Telefon, Kön);
Fråga för att se lista över kolumner i ett index
I frågan nedan visas telefon- och genkolumnerna i det skapade icke-grupperade indexet.
välj namn som ColumnListInIndex från sys.index_columns som ic inre ansluta sys.columns c på ic.column_id = c.column_id och ic.object_id = c.object_id där ic.object_id = (välj object_id från sys.indexes där namn = 'NCI_Employee_TelphoneGender' och type_desc = 'NONCLUSTERED') och ic.index_id = 2;
2. DROP_EXISTING = PÅ i SQL Server fungerar på befintligt index
I ovanstående exempel har vi skapat en INDEX, NCI_Employee_TelphoneGender på telefon- och könskolumnen. Nu på grund av en förändring i kravet måste vi också inkludera en kolumn Land även i det befintliga icke-grupperade indexet. Vi kan uppnå detta med alternativet DROP_EXISTING = ON.
I exemplet nedan, med DROP_EXISTING = ON, släpper SQL Server först det angivna indexet och återskapar ett index med samma namn och Landskolumn som ingår.
SKAPA NONCLUSTERED INDEX NCI_Employee_TelphoneGender ON Medarbetare (Telefon, Kön, Land) MED (DROP_EXISTING = ON);
Gammal metod för att skriva koden ovan
Koden ovan med DROP_EXISTING = ON är en ersättning för en gammal metod att släppa och skapa ett index igen. Om vi använder koden nedan för att släppa / återskapa klusterindex, kommer det också att bygga upp alla icke-grupperade index så att det kan vara en stor prestationsfrekvens.
OM EXISTER (VÄLJ * FRÅN SYSSEKVENSER SOM VÄRDER si.name = 'NCI_Employee_TelphoneGender') DROP INDEX NCI_Employee_TelphoneGender ON Medarbetare; GÅ CREATE INDEX NCI_Employee_TelphoneGender ON Medarbetare (Telefon, Kön, Land) GO
Sammanfattning
Vi har sett hur DROP_EXISTING = ON i SQL Server hjälper oss med grupperade index för att förbättra prestanda med några exempel och DROP_EXISTING = ON kan bara användas med befintligt skapat index för att ändra deras specifikationer.