SQL Server In-Memory OLTP - max() vs. ident_current()
Während eines Performance Driven Development Advanced Trainings kam eine interessante Fragestellung auf. Die Aufgabenstellung war einen einfachen lesenden Workload zu erzeugen, um die Geschwindigkeit von In-Memory OLTP zu testen. Folgender Code wurde vorgeschlagen: declare @max int select @max = max(id) from t1_old declare @i int = rand()*@max select * from t1_old where id >= @i and id <= @i+rand()*250 Sehr unverdächtig! Das offensichtliche Problem in der Where Clause lassen wir für den Moment mal unkommentiert. Das lösen wir weiter unten noch auf. Ich fand den Vorschlag ganz okay, da er echte Probleme der Qualität von T-SQL Code aufzeigte. Die physikalische Struktur hinter t1_old ist ein Clustered Index mit der ID als Clusterkey. Ein Test mit einer interaktiven Variante unseres Werkzeuges SQLPressure ergab, bei einer Steigerung von 20 Threads alle 5 Sekunden, dass sich der Workload bei 300 Threads mit einem Durchsatz von ungefähr 5000 einpendelt.