- 04/11/2017
- 10 minutes to read
-
- W
- c
- r
- M
- m
-
+7
Applies to: SQL Server (all supported versions) Azure SQL Database
Creates a sequence object and specifies its properties. O secvență este un obiect legat de schemă definit de utilizator care generează o secvență de valori numerice conform specificației cu care a fost creată secvența. Secvența valorilor numerice este generată într-o ordine crescătoare sau descrescătoare la un interval definit și poate fi configurată pentru a reporni (ciclul) atunci când este epuizată. Secvențele, spre deosebire de coloanele de identitate, nu sunt asociate cu tabele specifice. Aplicațiile se referă la un obiect secvență pentru a prelua valoarea următoare. Relația dintre secvențe și tabele este controlată de aplicație. Aplicațiile utilizatorului pot face referire la un obiect de secvență și pot coordona valorile pe mai multe rânduri și tabele.
spre deosebire de valorile coloanelor de identitate care sunt generate la inserarea rândurilor, o aplicație poate obține următorul număr de secvență fără a insera rândul apelând următoarea valoare pentru funcție. Utilizați sp_sequence_get_range pentru a obține mai multe numere de secvență simultan.
pentru informații și scenarii care utilizează atât secvența de creare, cât și valoarea următoare pentru funcție, consultați numere de secvență.
convențiile sintaxei Transact-SQL
sintaxă
CREATE SEQUENCE sequence_name ] } | { NO MINVALUE } ] } | { NO MAXVALUE } ] } | { NO CACHE } ]
notă
pentru a vizualiza sintaxa Transact-SQL pentru SQL Server 2014 și versiunile anterioare, consultați documentația versiunilor anterioare.
argumente
sequence_name
specifică numele unic prin care secvența este cunoscută în baza de date. Tipul este sysname.
specifică limitele pentru obiectul secvență. Valoarea minimă implicită pentru un obiect secvență nouă este valoarea minimă a tipului de date al obiectului secvență. Acesta este zero pentru tipul de date tinyint și un număr negativ pentru toate celelalte tipuri de date.
proprietate care specifică dacă obiectul secvență ar trebui să repornească de la valoarea minimă (sau maximă pentru obiecte secvență descendentă) sau arunca o excepție atunci când valoarea minimă sau maximă este depășită. Opțiunea ciclu implicit pentru obiectele secvență nouă este No CYCLE.
notă
ciclarea unei secvențe repornește de la valoarea minimă sau maximă, nu de la valoarea de pornire.
/ nu CACHE]
crește performanța pentru aplicațiile care utilizează obiecte de secvență prin minimizarea numărului de disc IOs care sunt necesare pentru a genera numere de secvență. Implicit în CACHE.
de exemplu, dacă este aleasă o dimensiune cache de 50, SQL Server nu păstrează 50 de valori individuale memorate în cache. Se memorează în cache doar valoarea curentă și numărul de valori rămase în memoria cache. Aceasta înseamnă că cantitatea de memorie necesară pentru stocarea memoriei cache este întotdeauna două instanțe ale tipului de date al obiectului de secvență.
notă
dacă opțiunea cache este activată fără a specifica o dimensiune cache, motorul bazei de date va selecta o dimensiune. Cu toate acestea, utilizatorii nu ar trebui să se bazeze pe faptul că selecția este consecventă. Microsoft ar putea schimba metoda de calculare a dimensiunii cache-ului fără notificare.
când este creat cu opțiunea CACHE, o oprire neașteptată (cum ar fi o pană de curent) poate duce la pierderea numerelor de secvență rămase în cache.
Observații generale
numerele de secvență sunt generate în afara domeniului de aplicare al tranzacției curente. Acestea sunt consumate dacă tranzacția folosind numărul de ordine este comisă sau derulată înapoi. Validarea duplicată are loc numai după ce o înregistrare este complet populată. Acest lucru poate duce în unele cazuri în care același număr este utilizat pentru mai multe înregistrări în timpul creării, dar apoi este identificat ca duplicat. Dacă se întâmplă acest lucru și alte valori ale numărului automat au fost aplicate înregistrărilor ulterioare, Acest lucru poate duce la un decalaj între valorile numărului automat și comportamentul așteptat.
Cache management
pentru a îmbunătăți performanța, SQL Server pre-alocă numărul de numere de secvență specificate de argumentul CACHE.
pentru un exemplu, se creează o nouă secvență cu o valoare de pornire de 1 și o dimensiune cache de 15. Când este necesară prima valoare, valorile de la 1 la 15 sunt disponibile din memorie. Ultima valoare cache (15) este scrisă în tabelele de sistem de pe disc. Când se utilizează toate cele 15 numere, următoarea solicitare (pentru numărul 16) va determina alocarea cache-ului din nou. Noua ultima valoare cache (30) va fi scris în tabelele de sistem.
dacă motorul bazei de date este oprit după ce utilizați 22 de numere, următorul număr de ordine prevăzut în memorie (23) este scris în tabelele de sistem, înlocuind numărul stocat anterior.
după repornirea SQL Server și este necesar un număr de secvență, numărul de pornire este citit din tabelele de sistem (23). Suma cache de 15 numere (23-38) este alocată memoriei și următorul număr non-cache (39) este scris în tabelele de sistem.
dacă motorul bazei de date se oprește anormal pentru un eveniment cum ar fi o pană de curent, secvența repornește cu numărul citit din tabelele de sistem (39). Orice numere de secvență alocate memoriei (dar niciodată solicitate de un utilizator sau aplicație) sunt pierdute. Această funcționalitate poate lăsa lacune, dar garantează că aceeași valoare nu va fi emisă niciodată de două ori pentru un singur obiect de secvență decât dacă este definit ca ciclu sau este repornit manual.
memoria cache este menținută în memorie prin urmărirea valorii curente (ultima valoare emisă) și a numărului de valori rămase în memoria cache. Prin urmare, cantitatea de memorie utilizată de cache este întotdeauna două instanțe ale tipului de date al obiectului de secvență.
setarea argumentului cache la fără CACHE scrie valoarea secvenței curente în tabelele de sistem de fiecare dată când este utilizată o secvență. Acest lucru ar putea încetini performanța prin creșterea accesului la disc, dar reduce șansa de lacune neintenționate. Lacunele pot apărea în continuare dacă numerele sunt solicitate folosind următoarea valoare pentru sau sp_sequence_get_range funcții, dar apoi numerele nu sunt utilizate sau sunt utilizate în tranzacții neangajate.
când un obiect secvență utilizează opțiunea CACHE, dacă reporniți obiectul secvență, sau modifica INCREMENT, ciclu, MINVALUE, MAXVALUE, sau proprietățile dimensiunea cache, aceasta va provoca cache-ul să fie scris în tabelele de sistem înainte de a se produce modificarea. Apoi, memoria cache este reîncărcată începând cu valoarea curentă (adică nu sunt omise numere). Modificarea dimensiunii cache-ului are efect imediat.
opțiune CACHE când sunt disponibile valori cache
următorul proces are loc de fiecare dată când un obiect secvență este solicitat pentru a genera următoarea valoare pentru opțiunea CACHE dacă există valori neutilizate disponibile în memoria cache pentru obiectul secvență.
-
se calculează următoarea valoare pentru obiectul secvenței.
-
noua valoare curentă pentru obiectul secvență este actualizat în memorie.
-
valoarea calculată este returnată în instrucțiunea de apelare.
opțiune CACHE când memoria cache este epuizată
următorul proces are loc de fiecare dată când un obiect secvență este solicitat pentru a genera următoarea valoare pentru opțiunea CACHE dacă memoria cache a fost epuizată:
-
se calculează următoarea valoare pentru obiectul secvență.
-
se calculează ultima valoare pentru noul cache.
-
rândul tabelului de sistem pentru obiectul de secvență este blocat, iar valoarea calculată la Pasul 2 (ultima valoare) este scrisă în tabelul de sistem. Un xevent epuizat în cache este concediat pentru a notifica utilizatorul despre noua valoare persistată.
no CACHE option
următorul proces are loc de fiecare dată când un obiect secvență este solicitat pentru a genera următoarea valoare pentru opțiunea fără CACHE:
-
se calculează următoarea valoare pentru obiectul secvență.
-
noua valoare curentă pentru obiectul secvență este scris în tabelul de sistem.
-
valoarea calculată este returnată în instrucțiunea de apelare.
metadate
pentru informații despre secvențe, interogați sys.secvențe.
securitate
permisiuni
necesită creați secvență, modifica, sau permisiunea de CONTROL pe SCHEMA.
-
membrii rolurilor de baze de date fixe db_owner și db_ddladmin pot crea, modifica și arunca obiecte de secvență.
-
membrii rolurilor de baze de date fixe db_owner și db_datawriter pot actualiza obiectele de secvență determinându-le să genereze numere.
următorul exemplu acordă Utilizatorului AdventureWorks\Larry permisiunea de a crea secvențe în schema de testare.
GRANT CREATE SEQUENCE ON SCHEMA::Test TO
proprietatea asupra unui obiect de secvență poate fi transferată utilizând declarația de autorizare ALTER.
dacă o secvență utilizează un tip de date definit de utilizator, creatorul secvenței trebuie să aibă permisiunea referințelor pentru tipul respectiv.
Audit
pentru a audita secvența de creare, monitorizați SCHEMA_OBJECT_CHANGE_GROUP.
Exemple
pentru exemple de creare a secvențelor și de utilizare a valorii următoare pentru funcție pentru a genera numere de secvență, consultați numere de secvență.
majoritatea exemplelor următoare creează obiecte de secvență într-o schemă numită Test.
pentru a crea schema de testare, executați următoarea instrucțiune.
CREATE SCHEMA Test ; GO
A. crearea unei secvențe care crește cu 1
în exemplul următor, Thierry creează o secvență numită CountBy1 care crește cu una de fiecare dată când este utilizată.
CREATE SEQUENCE Test.CountBy1 START WITH 1 INCREMENT BY 1 ; GO
B. crearea unei secvențe care scade cu 1
următorul exemplu începe la 0 și numără în numere negative câte unul de fiecare dată când este folosit.
CREATE SEQUENCE Test.CountByNeg1 START WITH 0 INCREMENT BY -1 ; GO
C. Crearea unei secvențe care crește cu 5
următorul exemplu creează o secvență care crește cu 5 de fiecare dată când este utilizată.
CREATE SEQUENCE Test.CountBy1 START WITH 5 INCREMENT BY 5 ; GO
D. crearea unei secvențe care începe cu un număr desemnat
după importul unui tabel, Thierry observă că cel mai mare număr de identificare utilizat este 24.328. Thierry are nevoie de o secvență care va genera numere începând de la 24.329. Următorul cod creează o secvență care începe cu 24.329 și crește cu 1.
CREATE SEQUENCE Test.ID_Seq START WITH 24329 INCREMENT BY 1 ; GO
E. Crearea unei secvențe utilizând valorile implicite
următorul exemplu creează o secvență utilizând valorile implicite.
CREATE SEQUENCE Test.TestSequence ;
executați următoarea instrucțiune pentru a vizualiza proprietățile secvenței.
SELECT * FROM sys.sequences WHERE name = 'TestSequence' ;
o listă parțială a ieșirii demonstrează valorile implicite.
Output | Default value | ||
---|---|---|---|
start_value |
-9223372036854775808 |
||
increment |
1 |
||
mimimum_value |
-9223372036854775808 |
||
maximum_value |
9223372036854775807 |
||
is_cycling |
0 |
||
is_cached |
1 |
current_value |
-9223372036854775808 |
F. crearea unei secvențe cu un anumit tip de date
următorul exemplu creează o secvență folosind tipul de date smallint, cu un interval de la -32.768 la 32.767.
CREATE SEQUENCE SmallSeq AS smallint ;
G. crearea unei secvențe folosind toate argumentele
următorul exemplu creează o secvență numită DecSeq folosind tipul de date zecimale, având un interval de la 0 la 255. Secvența începe cu 125 și crește cu 25 de fiecare dată când este generat un număr. Deoarece secvența este configurată pentru a cicla atunci când valoarea depășește valoarea maximă de 200, secvența repornește la valoarea minimă de 100.
CREATE SEQUENCE Test.DecSeq AS decimal(3,0) START WITH 125 INCREMENT BY 25 MINVALUE 100 MAXVALUE 200 CYCLE CACHE 3 ;
executați următoarea instrucțiune pentru a vedea prima valoare; opțiuneaSTART WITH
din 125.
SELECT NEXT VALUE FOR Test.DecSeq;
executați instrucțiunea încă de trei ori pentru a returna 150, 175 și 200.
executați din nou instrucțiunea pentru a vedea cum valoarea de pornire revine laMINVALUE
opțiunea 100.
executați următorul cod pentru a confirma dimensiunea cache-ului și a vedea valoarea curentă.
SELECT cache_size, current_value FROM sys.sequences WHERE name = 'DecSeq' ;
Vezi si
ALTER SEQUENCE (Transact-SQL)
DROP SEQUENCE (Transact-SQL)
urmatoarea valoare pentru (Transact-SQL)
Numere de secventa