View als Tabellen – Dummy Ressource / Zero Device
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!