Overblog
Folge diesem Blog Administration + Create my blog
Blog von Olaf Helper
Neueste Posts

Sperren und die betroffenen Objekte ermitteln

11. November 2009 , Geschrieben von Olaf Helper Veröffentlicht in #T-SQL

Das bei DML Aktionen Sperren entstehen, weiß jeder. Wenn man sich in nicht das gerade einfache & trockene Thema einliest und seine Daten kennt, kann in etwa abschätzen, wann welche Sperren entstehen.

Im alten Aktivitätsmonitor oder mit der mittlerweile abgekündigten System Stored Procedure EXEC sp_lock kann man sich die Sperren anzeigen, allerdings ist die Auskunft nicht so informativ.

Über die DMV des Microsoft SQL Server 2005 kann man mehr Informationen ermitteln, wie z.B. auf welche Objekte Sperren liegen.

Interessant ist es dann auch mal mit den unterschiedlichen Isolation Levels oder Table-Hints zu experimentieren. Oder zu sehen, welche weitere Sperren durch ForeignKey Constraints oder History-Trigger entstehen. Zum Experimentieren startet man einfach eine explizite Transaktion, führt das DML Statement aus, wartet aber mit dem Commit. Dann kann man ich Ruhe die Sperren selektieren und committed erst dann. Das sollte aber tunlichst nur auf Test-Systemen machen, sonst gilt: Transaktionen so kurz wie nur irgend möglich.

Beispiel:

 

 USE [AdventureWorks2005] 
 GO 
   
 BEGIN TRANSACTION; 
   
 UPDATE Person.Person WITH (RowLock)  
 -- oder PagLock, TabLock, TabLockX 
 SET FirstName = RTRIM(FirstName) 
 WHERE BusinessEntityID = 1; 
   
 -- Mit dem Commit warten; 
 -- erst die Sperren selektieren 
 COMMIT TRANSACTION; 

 

Hier ein Beispiel für die Selektion der Sperren und deren Daten; wenn es interessiert, kann weitere Felder der Tabellen mit selektieren:

 

 -- Ermitteln aller Sperren einer Datenbank mit den 
 -- Daten der betroffenen Objekte für Sql Server 2005 
 SELECT DB.name AS DatabaseName 
  ,TL.request_owner_type AS RequestType 
  ,TL.request_status AS RequestStatus 
  ,TL.request_mode AS RequestMode  
  ,ES.session_id AS SPID 
  ,ES.login_name AS LoginName 
  ,ES.status as SessionStatus 
  ,TL.resource_type AS ResourceType 
  ,TL.resource_description AS ResourceDescription 
  ,COALESCE(SO.name, PO.name, DB.name) AS ObjectName 
  ,COALESCE(SO.type_desc, PO.type_desc, 'DATABASE') AS ObjectType 
  ,IX.name as IndexName 
  ,OWT.wait_type AS OsWaitType 
  ,OT.task_state AS OsTaskState 
  ,OT.pending_io_count AS OsTaskPendingIo 
 FROM sys.dm_tran_locks AS TL 
  INNER JOIN sys.databases AS DB 
  ON TL.resource_database_id = DB.database_id 
  INNER JOIN sys.dm_exec_sessions AS ES 
  ON TL.request_session_id = ES.session_id 
  LEFT JOIN sys.dm_os_waiting_tasks AS OWT 
   ON TL.lock_owner_address = OWT.resource_address 
  LEFT JOIN sys.dm_os_tasks AS OT 
  ON ES.session_id = OT.session_id 
  LEFT JOIN sys.objects AS SO 
  ON TL.resource_associated_entity_id = SO.object_id 
  AND TL.resource_type = 'OBJECT' 
  LEFT JOIN sys.partitions AS PT 
  ON TL.resource_associated_entity_id = PT.hobt_id 
  AND TL.resource_type IN ('PAGE', 'KEY', 'RID', 'HOBT') 
  LEFT JOIN sys.objects AS PO 
  ON PT.object_id = PO.object_id 
  LEFT JOIN sys.indexes AS IX 
  ON PT.index_id = IX.index_id 
  AND PT.object_id = IX.object_id 
 WHERE 1 = 1 
  -- Optimale Filter; einfach entkommentieren 
  --AND TL.resource_database_id = DB_ID() -- Nur aktuelle DB betrachten 
  --AND ES.status <> 'sleeping' -- Keine schlafende Prozesse 
  --AND SO.type_desc = 'USER_TABLE' -- Nur Sperren auf Tabelle 
  --AND SO.name = 'Persons' -- Nur zu einem Objekt 
  --AND TL.request_mode LIKE '%X'  -- Nur exklusive Locks 
 ORDER BY DB.name, ObjectName, ResourceType 
  ,IndexName, ES.session_id 
Weiterlesen

AdventureWorks 2008R2 November CTP

11. November 2009 , Geschrieben von Olaf Helper Veröffentlicht in #Download MSSQL

Passend zur neuen November CTP des Sql Server 2008R2 gibt es bei CodePlex die aktualisierten AdventureWorks Projekte & Datenbanken.

Die Änderungen können im Blog von bonniefe nachgelesen werden.

Weiterlesen

MS SQL Server 2008 R2 Community Technology Preview November 2009

10. November 2009 , Geschrieben von Olaf Helper Veröffentlicht in #Download MSSQL

Seit heute können MSDN und TechNet Subscriber die Microsoft SQL Server 2008 R2 Community Technology Preview November 2009 herunter laden; alle anderen erst ab morgen, den 11.11.2009 (Helau & Alaf).


Was sich gegenüber der August CTP geändert hat, kann man im 6seitigen Dokument
What's New in SQL Server 2008 R2 November Community Technology Preview (CTP) nachlesen.

Passend dazu gibt es die aktualisierte BOL „SQL Server 2008 R2 Books Online Community Technology Preview November 2009“.

Weiterlesen

Power Pivot

24. Oktober 2009 , Geschrieben von Olaf Helper Veröffentlicht in #OLAP

Das Kind "Project Gemini" hat nun einen finallen Namen und eine eigene Website bekommen: Power Pivot.
Weiterlesen

SQL Azure und SQL Server Management Studio (SSMS)

22. Oktober 2009 , Geschrieben von Olaf Helper Veröffentlicht in #MSSQL

Es hatte lange gedauert, bis ich nicht nur einen Platz im Sql Azure Beta Programm von Microsoft bekommen habe, sondern auch eine Datenbank; das Angebot ist sehr begrenzt.

Nun habe ich aber endlich eine bekommen (na ja, vor ca. 3 Wochen) und nun auch mal etwas Zeit gefunden, mich zumindest ein wenig damit zu beschäftigen.

Die erste Umsetzung mit SDS war vom Funktionsumfang recht eingeschränkt, vergleichbar mit SimpleDB; ein einfacher Stack, auf dem man Daten ablegen und wieder abrufen kann.

Mit Sql Azure soll nahezu der volle Funktionsumfang des MS SQL Servers abgebildet werden. Man merkt es schon daran, dass man ganz normal den SqlClient von Ado.NET oder ADO verwenden kann und der ConnectionString dafür sieht fast aus, wie der für einen ganz „normalen“ SQL Server; nur das Preset tcp: ist neu.

Server=tcp:a5xxxxxxx.database.windows.net;Database=master;User ID=MeineUid;Password=MeinPwd;Trusted_Connection=False;

Noch besser ist aber, das durch diese Kompatibilität auch (fast) alle vorhandene Tools von Microsoft verwendet werden können, wie SqlCmd oder auch das SQL Server Management Studio (SSMS).

Es klappt ganz gut, es gibt aber natürlich auch Einschränkungen (soweit sie mir in der kurzen Zeit bisher aufgefallen sind):

-       Verbindung geht natürlich nur über eine Sql Account nebst strengen Passwort; klar

-       Hat man die Verbindung als „Registrierter Server“ angelegt, kann der Status nicht ermittelt werden; Sql Browser Dienst, der die Informationen bereit stellt, hätte ich eh nicht erwartet.

-       Der Server kann nicht über den „Object Explorer“ verbunden werden, es kommt eine Fehlermeldung wegen des fehlendes Objektes „sys.configuration“ (es ist eben noch kein vollständig abgebildeter MS SQL Server)

-       Man kann aber eine neue „Abfrage“ über den registrierten Server starten. In der Auswahl der vorhandenen Datenbanken werden auch alle angelegten Datenbanken angezeigt, aber man kann innerhalb einer Verbindung die Datenbank nicht wechseln. Man kann auch nicht mit USE [AndereDatenbank] wechseln, man erhält die Fehlermeldung:
Msg 40508, Level 16, State 1, Line 1
USE statement is not supported to switch between databases. Use a new connection to connect to a different Database

Das bedeutet: Man muss je Datenbank eine eigene Verbindung anlegen, in der man die gewünschte Datenbank als „Default“ Datenbank definiert, nur so geht es.

Alles im Allen nur kleine Einschränkungen, mit denen man (ich) leben kann.

Den ersten Start werte ich jedenfalls als sehr positiv; weitere Erfahrungsberichte werden mit Sicherheit noch folgen.

Weiterlesen

Präsentationen von Brad McGehee

16. Oktober 2009 , Geschrieben von Olaf Helper Veröffentlicht in #Free eBooks

Der bekannte Australier Brad McGehee von Red Gate Software hat zum Start seines neuen Blog mal alle seine Bücher
- How to Become an Exceptional DBA
- Mastering SQL Server Profiler
- Brad’s Sure Guide to SQL Server 2008

und
Präsentationen
- Getting the Most Out of the SQL Server 2005/2008 Profiler (PDF, 2MB)
- DBA 101: Best Practices All DBAs Should Know (PDF, 800K)
- Introducing the SQL Server 2008 Data Collector (PDF, 800K)
- Introducing the SQL Server 2008 Performance Data Collector (PDF, 800K)
- Introduction to How to Interpret SQL Server Execution Plans (PDF, 800K)

zum Download zusammengestellt.

Weiterlesen

Free eBook: Windows 7 - Auf einen Blick

15. Oktober 2009 , Geschrieben von Olaf Helper Veröffentlicht in #Free eBooks

Noch bis zum 30.10.2009 verschenkt der Microsoft Press Verlag das eBook "Windows 7 - Auf einen Blick" von Jerry Joyce und Marianne Moon.
Wie so häufig muss man sich registrieren, den eigentlichen Download Link bekommt man per E-Mail zugesandt.

[Edit 2009-10-16 17:27]
Hat schon jemand geschafft, das herunter zu laden?
Ich habe mittlerweile mir 2mal einen Link schicken lassen, der Download fängt an, auf der Seite steht dann "kann dauern", es zuckt regelmäßig, nach ein paar Minuten kommt der Hinweis "Download blockiert" (ist halt Vista) und wenn ich das zulasse, geht es von vorne los.
Nach 4mal dieses Spielchen (nerv) kommt nur noch die Meldung "Gültigkeit des Links abgelaufen".
Na, dann halt nicht.
Weiterlesen

Einfache Datenreihen erzeugen

14. Oktober 2009 , Geschrieben von Olaf Helper Veröffentlicht in #T-SQL

Für manche Aufgabenstellungen benötigt man Datenreihen, z.B. fortlaufende Nummern oder alle Tage eines Jahres, um zu überprüfen, ob den für alle Tage auch Daten vorhanden sind.

Natürlich kann man so etwas auch prüfen, indem man die Differenz zum höchsten Vorgänger bildet; die darf dann nicht größer als 1 sein.

Einfacher geht es, wenn man eine Tabelle hat, die alle Werte beinhaltet. Jetzt könnte man eine (temporär) anlegen, sie über eine Schleife befüllen und die dann verwenden. Bei größeren Datenmengen ist das auch zu empfehlen, da man zur Verbesserung der Performanz einen Index anlegen kann.

Wenn man aber nur mal eben alle 365 Tage eines Jahres benötigt, lohnt sich der Aufwand nicht, das geht auch einfach:  Mittels einer rekursiven CTE (Common Table Expression). Das funktioniert wie folgt:

Ausgangspunkt ist eine CTE mit einem SELECT von den statischen Startdaten (Nr 1 / 01.Jan, etc). Das verbindet man mittels UNION mit einer Selektion der CTE (= Rekursion), wobei die Werte um 1 erhöht werden. Die Anzahl der Rekursionen schränkt man über eine WHERE Klausel auf echt-kleiner der Maximal-Werte ein. Echt-kleiner wird verwendet, da ja das (letzte) Ergebnis mit +1 zurück geliefert wird.

Das war es schon, keine große Zauberei.

 

Es gibt nur die „kleine“ Einschränkung auf maximal 32.747 Rekursionen; aber die Lösung ist wie schon erwähnt eh für kleinere Datenreihen gedacht.

 

 WITH [loops] (Sequence, EveryDayOfYear) AS 
  (SELECT 1 AS Sequence 
  ,CONVERT(datetime, '20090101', 112) AS EveryDayOfYear 
  UNION ALL 
  SELECT Sequence + 1 AS Sequence 
  ,DATEADD(d, 1, EveryDayOfYear) AS EveryDayOfYear 
  FROM [loops] 
  WHERE EveryDayOfYear < CONVERT(datetime, '20091231', 112)) 
 SELECT Sequence 
  ,EveryDayOfYear 
  ,CASE WHEN DATEPART(dw, EveryDayOfYear) < 6  
  THEN 'Werktag' 
  ELSE 'Wochenende'  
  END AS IsWeekEnd  
 FROM [loops] 
 OPTION (MAXRECURSION 366); 

 

Ergebnis:

 

Sequence

EveryDayOfYear

IsWeekEnd

1

2009-01-01 00:00:00.000

Werktag

2

2009-01-02 00:00:00.000

Werktag

3

2009-01-03 00:00:00.000

Wochenende

4

2009-01-04 00:00:00.000

Wochenende

5

2009-01-05 00:00:00.000

Werktag

6

2009-01-06 00:00:00.000

Werktag

7

2009-01-07 00:00:00.000

Werktag

359

2009-12-25 00:00:00.000

Werktag

360

2009-12-26 00:00:00.000

Wochenende

361

2009-12-27 00:00:00.000

Wochenende

362

2009-12-28 00:00:00.000

Werktag

363

2009-12-29 00:00:00.000

Werktag

Weiterlesen

Logical Query Processing Poster

10. Oktober 2009 , Geschrieben von Olaf Helper Veröffentlicht in #Download MSSQL

Weißt Du, wie genau T-SQL Statements analysiert und in welcher Reihenfolge verarbeiten sowie ausgeführt werden? Nein? Ich auch nicht so genau.

Aber jetzt weiß ich, wo ich es nach sehen kann. Pinal Dave hat in seinem sehr gutem Blog ein Poster veröffentlich

Es stammt ursprünglich aus dem Buch „Inside Microsoft SQL Server 2008: T-SQL Querying“ von dem bekannten Autor Itzik Ben-Gan aus dem Microsoft Press Verlag

Gibt es hier zum Download.

Weiterlesen

View als Tabellen – Dummy Ressource / Zero Device

9. Oktober 2009 , Geschrieben von Olaf Helper Veröffentlicht in #T-SQL

Stress-Tests für Applikationen, die auf Ressourcen zugreifen, sind mangels eben der Ressourcen nicht immer ganz einfach. Wenn man ein Programm testet, das mal eben 1.000 Seiten und mehr ausdrucken soll, verschwendet man eben mal 1.000 Seiten Papier (macht man natürlich nicht; die armen Bäume) oder lässt es in eine Datei umleiten, was dann auch eine entsprechend große Datei erzeugt. Um solche Test nun für Entwickler Ressourcen-schonend zu ermöglichen gibt es „Dummy Resources“ oder „Zero Devices“; sie verhalten sich wie die echten Ressourcen, machen aber effektiv nichts; sie empfangen die Daten wie gehabt und ... nichts weiter; das ist ja der Sinn & Zweck des Drucktreibers.

Aber Moment mal: MS SQL Server Objekte sind ja auch Ressourcen, mit denen mal Langzeit-Tests durchgeführt werden („Schafft es eine Schleife 1 Mio mal durch zu laufen?“). Da ist ja auch nicht immer unbedingt nötig, mehrere Gigabytes unnötig ins Storage zu schreiben.

Zugegeben, keine Daten wirklich weg zu schreiben, simuliert das Verhalten nicht wirklich, wie es dem echten Sachverhalten entspricht: Ich sage nur Primary Key, Unique Index, Foreign Key usw. um ein paar zu nennen. Trotzdem, für ein paar Test ist auf im MS SQL Server so eine Dummy Ressource durchaus brauchbar und sinnig.

Die Idee dazu ist mir bei „INSERTs abfangen und umleiten“ gekommen.

So geht es und das ganz einfach:

 

 USE [AdventureWorks] 
 GO 
 SET NOCOUNT ON; 
 GO 
 -- View als Dummy Resource anlegen 
 CREATE VIEW dbo.DummyResource 
 AS 
 SELECT CONVERT(int, 1) AS ID 
  ,'String' AS String 
  ,N'Unicode' AS Unicode 
  ,CONVERT(money, 123.4567) AS Betrag 
  ,GETDATE() AS Datum 
  ,CHAR(8000) AS BigString -- Um goroße Daten zu simulieren 
 GO 
   
 -- InsteadOf Trigger zum Abfangen von DML Kommandos 
 CREATE TRIGGER dbo.TR_All_DummyResource ON dbo.DummyResource 
 INSTEAD OF INSERT, UPDATE, DELETE 
 AS 
  -- Ich mach nichts und erzähle es niemanden 
  SET NOCOUNT ON; 
 GO 
   
 -- Und nun befeueren wir es mal 
 SELECT GETDATE() AS Start; -- Zeitmessung 
 GO 
 INSERT INTO dbo.DummyResource (ID) 
 VALUES (0); -- Alle NULLable, ein Feld reicht 
 GO 100000  -- 100T mal 
 DELETE FROM dbo.DummyResource; -- Alles weg 
 GO 
 SELECT GETDATE() AS Stop; -- Zeitmessung 
 GO 
   
 Ergebnis: 
   
 Start 
 ----------------------- 
 2009-10-09 19:36:14.040 
   
 Beginning execution loop 
 Batch execution completed 100000 times. 
 Stop 
 ----------------------- 
 2009-10-09 19:36:36.500 

 

Da kann man in der AdventureWorks oder TempDb nachsehen; da hat sich nichts passiert. Selbst das Änderungsdatum der Datenbank-Dateien ändert sich nicht; weshalb auch, es passiert wie gewünscht: Nix!

Weiterlesen
<< < 1 2 3 4 5 6 7 8 9 10 20 > >>