sql >> Database teknologi >  >> RDS >> Database

Flere online operationer tilgængelige nu - eller snart

Jeg kørte nogle tests i SQL Database og opdagede mindst én ny operation, der understøtter ONLINE = ON . Dette er i øvrigt på en meget nyere version – SELECT @@VERSION; fortsætter med at give et gammelt byggenummer, men beviset er i byggedatoen:

Microsoft SQL Azure (RTM) – 12.0.2000.8
12. feb 2015 00:53:13
Copyright (c) Microsoft Corporation

Denne version af Azure SQL Database understøtter ONLINE = ON mulighed for ALTER TABLE ... ALTER COLUMN .

Lad os sige, at du har en tabel med en nullbar kolonne:

CREATE TABLE dbo.a(id INT PRIMARY KEY, x VARCHAR(255));
 
INSERT dbo.a(id, x) SELECT TOP (1) [object_id], name FROM sys.all_objects;

Og nu beslutter du dig for at gøre den kolonne ikke nullbar, du kan gøre dette (forudsat at der ikke er nogen NULL s):

ALTER TABLE dbo.a
  ALTER COLUMN x VARCHAR(255) NOT NULL
  WITH (ONLINE = ON);

Du kan også gøre ting som at ændre sorteringen, datatypen eller størrelsen på kolonnen:

ALTER TABLE dbo.a 
ALTER COLUMN x NVARCHAR(510)    -- changed data type and length
  COLLATE Albanian_BIN NOT NULL -- changed collation and nullability
  WITH (ONLINE = ON);

I nuværende versioner af SQL Server (og tidligere versioner af Azure SQL Database) er ONLINE = ON tip blev ikke understøttet for ALTER TABLE , og uden muligheden var dette en blokerings- og datastørrelsesoperation. For at være retfærdig, første gang jeg kørte koden, kunne jeg kun bevise, at versionen med ONLINE = ON kørte med succes, ikke at det fungerede som annonceret.

Jeg kørte denne kode med ONLINE = ON og uden:

CREATE TABLE dbo.a(id INT PRIMARY KEY, x VARCHAR(255));
 
INSERT dbo.a(id, x) SELECT TOP (1) [object_id], name FROM sys.all_objects;
 
-- placeholder;
 
ALTER TABLE dbo.a 
  ALTER COLUMN x NVARCHAR(510)
  COLLATE Albanian_BIN NOT NULL 
  -- WITH (ONLINE = ON);
 
-- placeholder;
 
DROP TABLE dbo.a;

I --placeholder spot, prøvede jeg et par ting for at bestemme enhver forskel i adfærd (dette var vores produktions SQL-database, så jeg ønskede ikke at bruge nok data eller skabe nok aktivitet til, at forskellen ville være indlysende). Jeg ønskede i begge scenarier at kontrollere, om siden var ændret (hvilket indikerer en ægte online-operation), eller om værdierne var opdateret på plads på de eksisterende sider (en ikke-så-online-operation). Jeg kunne også have udvidet testen for at se, hvor mange nye sider der blev oprettet, hvis siderne var fyldte og/eller alle 255 tegn var brugt, men jeg tænkte, at det ville være nok at se om siderne blev ændret.

Jeg prøvede DBCC IND() :

DBCC IND(N'dbname', N'dbo.a', 1, 1);

Resultaterne her var ikke overraskende:

Msg 40518, niveau 16, tilstand 1
DBCC-kommando 'IND' er ikke understøttet i denne version af SQL Server.

Og sys.dm_db_database_page_allocations (erstatningen for DBCC IND ):

SELECT allocated_page_page_id
  FROM sys.dm_db_database_page_allocations(DB_ID(),OBJECT_ID(N'dbo.a'),1,1,N'LIMITED')
  WHERE is_iam_page = 0;

Dette gav et tomt resultatsæt – jeg tror, ​​det er designmæssigt, at denne dynamiske administrationsfunktion ikke afslører nogen fysisk information i Azure SQL Database.

Dernæst prøvede jeg et trick med fn_PhysLocCracker , som folk som Michelle Ufford (@sqlfool) har blogget om før:

SELECT l.page_id FROM dbo.a
  OUTER APPLY sys.fn_PhysLocCracker(%%PhysLoc%%) AS l;

Succes! Dette returnerede værdier for de sider, der blev brugt i scanningen mod dbo.a , og det er klart, at i ONLINE = ON version, flyttes dataene til nye sider (hvilket formentlig efterlader de gamle tilgængelige under hele operationen), og uden antydningen bliver data og metadata opdateret på plads:

Sammenligning af sider under standard ALTER COLUMN-adfærd (venstre) med ONLINE =ON (højre)

En anden ting, jeg ville sammenligne, var udførelsesplanerne. Jeg ser måske ikke meget i Management Studio, men i SQL Sentry Plan Explorer Pro kan jeg se hele opkaldsstakken, inklusive hvad der foregår bag kulisserne af nogle DDL-kommandoer. Vores værktøj skuffede ikke – selvom det ikke præsenterede en egentlig plan for den lokale opdateringsvariation, viser det også, at der er en betydelig adfærdsforskel ved brug af ONLINE = ON :

Sammenligning af planer under standard ALTER COLUMN-adfærd (venstre) med ONLINE =ON (højre)

Selvfølgelig vil du kun se denne forskel, hvis du opfylder alle de andre betingelser, der kræves for online-operationer (mange svarer til kravene til online-indeksgenopbygning) i den nyligt opdaterede dokumentation.

Nu, hvis du ikke bruger SQL Database, hvordan hjælper det dig så? Når alt kommer til alt, parser denne syntaks ikke korrekt, selv i SQL Server 2014 Cumulative Update #6 (12.0.2480). Nå, Microsoft har ikke ligefrem vogtet over, at udviklingsmønsteret er blevet "sky først, så boks" - som Mark Souza for nylig antydede, da han tweetede om den nye sikkerhedsfunktion på rækkeniveau, der først blev introduceret i Azure SQL Database:

Dette betyder, at disse online-operationer sandsynligvis også kommer til din lokale kopi af SQL Server på et tidspunkt snart. Ligesom mange andre online-operationer skal du dog huske på, at disse ting har tendens til at være reserveret til Enterprise Edition.


  1. Sådan returneres Unix-tidsstemplet i Oracle

  2. Fix Msg 8117 "Operand data type varchar er ugyldig for sum operator" i SQL Server

  3. Ændring af MySQL-tidszone?

  4. Kan ikke finde et indgangspunkt med navnet 'InterlockedIncrement' i DLL 'kernel32.dll' - [email-beskyttet] 64 bit