sql >> Database >  >> RDS >> Database

Meer online operaties nu beschikbaar - of binnenkort

Ik voerde enkele tests uit in SQL Database en ontdekte ten minste één nieuwe bewerking die ONLINE = ON ondersteunt . Dit is trouwens een zeer recente versie – SELECT @@VERSION; blijft een oud buildnummer opleveren, maar het bewijs zit in de builddatum:

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

Deze versie van Azure SQL Database ondersteunt de ONLINE = ON optie voor ALTER TABLE ... ALTER COLUMN .

Stel dat u een tabel heeft met een kolom met nullwaarden:

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;

En nu u besluit om die kolom niet nullable te maken, kunt u dit doen (ervan uitgaande dat er geen NULL zijn s):

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

U kunt ook dingen doen zoals de sortering, het gegevenstype of de grootte van de kolom wijzigen:

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);

In huidige versies van SQL Server (en eerdere versies van Azure SQL Database), is de ONLINE = ON hint werd niet ondersteund voor ALTER TABLE , en zonder de optie was dit een blokkering en een gegevensomvang. Om eerlijk te zijn, de eerste keer dat ik de code uitvoerde, kon ik alleen maar bewijzen dat de versie met ONLINE = ON liep met succes, niet dat het werkte zoals geadverteerd.

Ik heb deze code uitgevoerd met ONLINE = ON en zonder:

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;

In de --placeholder ter plaatse, ik heb een paar dingen geprobeerd om enig verschil in gedrag vast te stellen (dit was onze productie-SQL-database, dus ik wilde niet genoeg gegevens gebruiken of genoeg activiteit creëren zodat het verschil duidelijk zou zijn). Ik wilde in beide scenario's controleren of de pagina was gewijzigd (wat duidt op een echte online bewerking) of dat de waarden op de bestaande pagina's zijn bijgewerkt (een niet-zo-online bewerking). Ik had de test ook kunnen uitbreiden om te zien hoeveel nieuwe pagina's er zijn gemaakt als de pagina's vol waren en/of alle 255 tekens waren gebruikt, maar ik dacht dat alleen kijken of de pagina's veranderd waren voldoende zou zijn.

Ik heb DBCC IND() geprobeerd :

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

De resultaten hier waren niet verrassend:

Msg 40518, niveau 16, staat 1
DBCC-opdracht 'IND' wordt niet ondersteund in deze versie van SQL Server.

En sys.dm_db_database_page_allocations (de vervanging voor 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;

Dit leverde een lege resultatenset op - ik geloof dat het ontwerp is dat deze dynamische beheerfunctie geen fysieke informatie in Azure SQL Database blootlegt.

Vervolgens probeerde ik een truc met fn_PhysLocCracker , waar mensen zoals Michelle Ufford (@sqltool) eerder over hebben geblogd:

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

Succes! Dit leverde waarden op voor de pagina's die werden gebruikt in de scan tegen dbo.a , en het is duidelijk dat in de ONLINE = ON versie, worden de gegevens verplaatst naar nieuwe pagina's (waarschijnlijk blijven de oude beschikbaar tijdens de bewerking), en zonder de hint worden de gegevens en metagegevens op hun plaats bijgewerkt:

Pagina's vergelijken met standaard ALTER COLUMN-gedrag (links) met ONLINE =ON (rechts)

Een ander ding dat ik wilde vergelijken, waren de uitvoeringsplannen. Ik zie misschien niet veel in Management Studio, maar in SQL Sentry Plan Explorer Pro kan ik de volledige call-stack zien, inclusief wat er achter de schermen van sommige DDL-commando's gebeurt. Onze tool stelde niet teleur - hoewel het geen echt plan voor de in-place update-variant presenteerde, laat het ook zien dat er een aanzienlijk gedragsverschil is bij het gebruik van ONLINE = ON :

Abonnementen vergelijken onder standaard ALTER COLUMN-gedrag (links) met ONLINE =ON (rechts)

U ziet dit verschil natuurlijk alleen als u voldoet aan alle andere voorwaarden die vereist zijn voor online bewerkingen (veel zijn vergelijkbaar met de vereisten voor het opnieuw opbouwen van de online index) in de onlangs bijgewerkte documentatie.

Als u geen SQL Database gebruikt, hoe helpt dat u dan? Deze syntaxis wordt immers niet correct geparseerd, zelfs niet in de cumulatieve update van SQL Server 2014 #6 (12.0.2480). Welnu, Microsoft heeft niet bepaald het feit bewaakt dat het ontwikkelingspatroon "eerst cloud, dan box" is geworden - zoals Mark Souza onlangs suggereerde toen hij tweette over de nieuwe beveiligingsfunctie op rijniveau die als eerste werd geïntroduceerd in Azure SQL Database:

Dit betekent dat deze online bewerkingen waarschijnlijk binnenkort ook naar uw lokale exemplaar van SQL Server zullen komen. Houd er echter, net als bij veel andere online activiteiten, rekening mee dat deze dingen meestal zijn gereserveerd voor Enterprise Edition.


  1. Oracle 10g tijdzone verwarring

  2. Oplossing voor:Store update-, insert- of delete-instructie beïnvloedde een onverwacht aantal rijen (0)

  3. Hoe <,>, en &tekens te ontsnappen naar html-entiteiten in Oracle PL/SQL

  4. Waarom kost het doorlopen van een grote Django-queryset enorme hoeveelheden geheugen?