Advanced Analytics on Sascha Dittmann https://www.sascha-dittmann.de/tags/advanced-analytics/ Recent content in Advanced Analytics on Sascha Dittmann Hugo de-de Mon, 28 Feb 2011 09:25:00 +0100 SQL Server Closeup #7: Internals Viewer SSMS Add-In https://www.sascha-dittmann.de/posts/internals-viewer-ssms-add-in/ Mon, 28 Feb 2011 09:25:00 +0100 https://www.sascha-dittmann.de/posts/internals-viewer-ssms-add-in/ <p>Vor einer Weile bin ich bei meinen SQL Server Internals Recherchen über ein nettes Tool mit dem Namen <strong>Internals Viewer</strong> gestolpert, dass ich in diesem Posting näher vorstellen möchte.</p> <p>In der aktuellen Version wurde die externe Applikation in das SQL Server Management Studio als Add-In integriert.<br> Nach der Installation erkennt man auf den ersten Blick &ldquo;nur&rdquo; ein weiteres Menü im SSMS:</p> <p><img src="https://storage.googleapis.com/cloud-blog/media/2011/02/SQLCloseup_007_01.png" alt="Internals Viewer Menü"></p> <p>Wenn man sich allerdings den Menüpunkt Allocation Map zu Gemüte führt, dann bekommt man, nachdem man sich zu einem SQL Server verbunden hat, eine grafische Übersicht über die Pages der ausgewählten Datenbank.</p> SQL Server Closeup #6: Ghost Data Records unter der Lupe https://www.sascha-dittmann.de/posts/ghost-data-records-unter-der-lupe/ Sat, 26 Feb 2011 12:41:00 +0100 https://www.sascha-dittmann.de/posts/ghost-data-records-unter-der-lupe/ <p>Nachdem in den letzten Postings der &ldquo;SQL Server Closeup&rdquo; Serie viel Theorie an der Reihe war, werden wir heute die Ghost Data Records einmal &ldquo;Live&rdquo; unter die Lupe nehmen.</p> <p>Hierzu benötigen wir natürlich als erstes eine Datenbank und eine Tabelle.</p> <p>Das Skript sieht hierfür wie folgt aus:</p> <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sql" data-lang="sql"><span class="line"><span class="cl"><span class="n">USE</span><span class="w"> </span><span class="p">[</span><span class="n">master</span><span class="p">]</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="k">GO</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="k">IF</span><span class="w"> </span><span class="n">DATABASEPROPERTY</span><span class="p">(</span><span class="s1">&#39;SQLServerCloseup&#39;</span><span class="p">,</span><span class="w"> </span><span class="s1">&#39;Version&#39;</span><span class="p">)</span><span class="w"> </span><span class="o">&gt;</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="k">BEGIN</span><span class="w"> </span><span class="k">ALTER</span><span class="w"> </span><span class="k">DATABASE</span><span class="w"> </span><span class="p">[</span><span class="n">SQLServerCloseup</span><span class="p">]</span><span class="w"> </span><span class="k">SET</span><span class="w"> </span><span class="n">SINGLE_USER</span><span class="w"> </span><span class="k">WITH</span><span class="w"> </span><span class="k">ROLLBACK</span><span class="w"> </span><span class="k">IMMEDIATE</span><span class="p">;</span><span class="w"> </span><span class="k">DROP</span><span class="w"> </span><span class="k">DATABASE</span><span class="w"> </span><span class="p">[</span><span class="n">SQLServerCloseup</span><span class="p">];</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="k">END</span><span class="p">;</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="k">GO</span><span class="w"> </span><span class="k">CREATE</span><span class="w"> </span><span class="k">DATABASE</span><span class="w"> </span><span class="n">SQLServerCloseup</span><span class="p">;</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="k">GO</span><span class="w"> </span><span class="n">USE</span><span class="w"> </span><span class="p">[</span><span class="n">SQLServerCloseup</span><span class="p">];</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="k">GO</span><span class="w"> </span><span class="k">CREATE</span><span class="w"> </span><span class="k">TABLE</span><span class="w"> </span><span class="p">[</span><span class="n">dbo</span><span class="p">].[</span><span class="n">Produkte</span><span class="p">]</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="p">(</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="p">[</span><span class="n">ProduktID</span><span class="p">]</span><span class="w"> </span><span class="p">[</span><span class="nb">int</span><span class="p">]</span><span class="w"> </span><span class="k">NOT</span><span class="w"> </span><span class="k">NULL</span><span class="p">,</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="p">[</span><span class="n">ProduktBezeichnung</span><span class="p">]</span><span class="w"> </span><span class="p">[</span><span class="nb">varchar</span><span class="p">](</span><span class="mi">50</span><span class="p">)</span><span class="w"> </span><span class="k">NOT</span><span class="w"> </span><span class="k">NULL</span><span class="p">,</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="k">CONSTRAINT</span><span class="w"> </span><span class="p">[</span><span class="n">PK_Produkte</span><span class="p">]</span><span class="w"> </span><span class="k">PRIMARY</span><span class="w"> </span><span class="k">KEY</span><span class="w"> </span><span class="n">CLUSTERED</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="p">(</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="p">[</span><span class="n">ProduktID</span><span class="p">]</span><span class="w"> </span><span class="k">ASC</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="p">)</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="p">)</span><span class="w"> </span></span></span></code></pre></div><p>Nachdem nun eine Tabelle zum Testen existiert, können Datensätze hinzugefügt und gelöscht werden.</p> SQL Server Closeup #5: Undokumentierter SQL Befehl DBCC PAGE https://www.sascha-dittmann.de/posts/undokumentierter-sql-befehl-dbcc-page/ Wed, 23 Feb 2011 17:19:00 +0100 https://www.sascha-dittmann.de/posts/undokumentierter-sql-befehl-dbcc-page/ <p>In diesem Posting möchte ich einen weiteren undokumentierten Befehl des SQL Servers vorstellen.<br> Heute ist der Befehl DBCC PAGE an der Reihe, mit dessen Hilfe man den Inhalt einer Page darstellen kann.</p> <p>Da standardmäßig der SQL Server die Ergebnisse des DBCC PAGE nicht an den Client sendet, muss vor dessen Verwendung das Trace Flag 3604 gesetzt werden, um dies zu ändern:</p> <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sql" data-lang="sql"><span class="line"><span class="cl"><span class="n">DBCC</span><span class="w"> </span><span class="n">TRACEON</span><span class="p">(</span><span class="mi">3604</span><span class="p">)</span><span class="w"> </span></span></span></code></pre></div><p>Da hierbei nichts gravierendes im SQL Server geändert wird, kann dieser Befehl auch auf Produktivsystemen angewendet werden.</p> SQL Server Closeup #4: Undokumentierter SQL Befehl DBCC IND https://www.sascha-dittmann.de/posts/undokumentierter-sql-befehl-dbcc-ind/ Fri, 11 Feb 2011 18:13:00 +0100 https://www.sascha-dittmann.de/posts/undokumentierter-sql-befehl-dbcc-ind/ <p>In den Tiefen des SQL Servers findet sich so mancher undokumentierter Befehl. Unter anderem gibt es eine Reihe von DBCC Befehlen, die einen Blick unter die Haube des SQL Servers erlauben.</p> <p>In diesem Posting möchte ich den SQL Befehl DBCC IND vorstellen, mit dessen Hilfe man einen Überblick über die Pages einer Datenbank ausgeben kann.</p> <p>Dieser Befehl gilt als Sicher und kann auch in Produktivumgebungen eingesetzt werden. Im Gegensatz zu anderen undokumentierten DBCC Befehlen, wie z.B. DBCC PAGE, muss bei DBCC IND nicht das Traceflag 3604 (Umleitung der Trace Ausgabe auf den Client) gesetzt werden, damit man eine Anzeige erhält.</p> SQL Server Closeup #3: Strukturen zur Speicherung von Daten – Speicherplatzverwaltung https://www.sascha-dittmann.de/posts/strukturen-zur-speicherung-von-daten-speicherplatzverwaltung/ Thu, 10 Feb 2011 20:10:00 +0100 https://www.sascha-dittmann.de/posts/strukturen-zur-speicherung-von-daten-speicherplatzverwaltung/ <p>Mit diesem Teil der &ldquo;SQL Server Closeup&rdquo; Serie schließe ich den Theorieteil der Strukturen zur Speicherung von Daten in der SQL Server Storage Engine ab.</p> <p>Heutiges Thema soll die Speicherplatzverwaltung, also das Allocation System, sein.</p> <h2 id="was-sind-extents">Was sind Extents</h2> <p>Extents sind ein logisches Konstrukt, dass 8 aufeinanderfolgende Pages gruppiert. Dies soll dazu dienen die Speicherverwaltung effizienter zu machen, indem auf den Speicherübersichtseiten (Allocation Bitmaps und Bytemaps), welche in regelmäßigen Intervallen angelegt werden, die Informationen pro Extent und nicht pro Page gespeichert werden.</p> SQL Syntax: @variable = column = expression https://www.sascha-dittmann.de/posts/sql-syntax-variable-column-expression/ Wed, 02 Feb 2011 07:58:00 +0100 https://www.sascha-dittmann.de/posts/sql-syntax-variable-column-expression/ <p>Fast jeder Datenbankentwickler hat bereits seine Erfahrungen mit Benutzerdefinierten Sequenzen, Künstlichen Schlüsseln (engl. Surrogate Keys) oder ähnlichen Mechanismen sammeln können.</p> <p>In solchen Fällen bekommt eine Spalte einen neuen Wert zugewiesen, und dieser Wert wird anschließend weiterverarbeitet.</p> <p>Dies möchte ich an folgenden Beispiel zeigen:</p> <ul> <li>In einer Lagerverwaltung soll der Bestand eines Artikels verändert werden können.</li> <li>Der neue Lagerbestand wird anschließend mittels Ausgabeparameter zurückgegeben.</li> </ul> <h1 id="der-klassische-lösungsansatz">Der klassische Lösungsansatz</h1> <p>Beim klassischen Lösungsansatz werden zwei SQL Befehle, die in einer expliziten Transaktion eingebettet sind, verwendet.</p> SQL Server Closeup #2: Strukturen zur Speicherung von Daten – Pages https://www.sascha-dittmann.de/posts/strukturen-zur-speicherung-von-daten-pages/ Mon, 31 Jan 2011 16:45:00 +0100 https://www.sascha-dittmann.de/posts/strukturen-zur-speicherung-von-daten-pages/ <p>Im den ersten Postings der &ldquo;SQL Server Closeup&rdquo; Serie möchte ich einen Überblick über die Strukturen zur Speicherung von Daten in der SQL Server Storage Engine geben.</p> <p>Im vorherigen Teil war das Thema Records an der Reihe. Hier wurden die verschiedenen Typen von Records sowie am Beispiel des Data Records die Struktur der Records beleuchtet. Dieses Mal werde ich mich dem Thema &ldquo;Pages&rdquo; widmen.</p> <h2 id="welche-typen-von-pages-gibt-es">Welche Typen von Pages gibt es?</h2> <h3 id="data-page">Data Page</h3> <p>Speichert ausschließlich Data Records.<br> Entweder als Heap oder als Blattknoten eines Index.</p> Anzahl der Tabellenzeilen schnell und einfach abfragen https://www.sascha-dittmann.de/posts/anzahl-der-tabellenzeilen-schnell-und-einfach-abfragen/ Sun, 30 Jan 2011 13:21:00 +0100 https://www.sascha-dittmann.de/posts/anzahl-der-tabellenzeilen-schnell-und-einfach-abfragen/ <h2 id="der-klassische-ansatz">Der klassische Ansatz</h2> <p>Die Fragestellung &ldquo;Wie viele Zeilen hat diese Tabelle&rdquo; taucht wohl bei jedem Entwickler immer mal wieder auf.</p> <p>Die Standardantwort lautet dann:</p> <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sql" data-lang="sql"><span class="line"><span class="cl"><span class="k">SELECT</span><span class="w"> </span><span class="k">COUNT</span><span class="p">(</span><span class="o">*</span><span class="p">)</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="k">FROM</span><span class="w"> </span><span class="p">[</span><span class="n">dbo</span><span class="p">].[</span><span class="n">Tabelle</span><span class="p">]</span><span class="w"> </span></span></span></code></pre></div><p>Allerdings können hierbei zwei Probleme auftreten:</p> <ol> <li>Der SQL Server muss zum Bearbeiten dieser Abfrage einen Table-Scan durchführen. Das kann bei Tabellen mit mehreren Millionen Datensätzen eine Weile dauern.</li> <li>Man kann mit dieser Abfrage nur jeweils eine Tabelle gleichzeitig abfragen. Was macht man aber, wenn man die Zeilenanzahl aller Tabellen einer Datenbank bestimmen möchte?</li> </ol> <p>Um das erste Problem zu lösen, kann man die Gespeicherte Prozedur sp_spaceused verwenden.<br> Ohne Parameter ausgeführt, zeigt diese den Speicherverbrauch der aktuellen Datenbank an.<br> Mit einem Tabellennamen als Parameter, wird der Speicherverbrauch der Tabelle inkl. Zeilenanzahl zurückgegeben.</p> SQL Server Closeup #1: Strukturen zur Speicherung von Daten – Records https://www.sascha-dittmann.de/posts/strukturen-zur-speicherung-von-daten-records/ Tue, 11 Jan 2011 12:34:00 +0100 https://www.sascha-dittmann.de/posts/strukturen-zur-speicherung-von-daten-records/ <p>Im den ersten Postings der &ldquo;SQL Server Closeup&rdquo; Serie möchte ich einen Überblick über die Strukturen zur Speicherung von Daten in der SQL Server Storage Engine geben. In diesem Teil werde ich mich dem Thema &ldquo;Records&rdquo; widmen.</p> <p>In dieser Serie werde ich oft die englischen Originalbegriffe verwenden bzw. mit angeben, um Übersetzungsfehler zu vermeiden und auch konsistent mit den Meldungen des SQL Servers zu sein.</p> <h2 id="ein-paar-grundbegriffe-vorab">Ein paar Grundbegriffe vorab</h2> <p>Zum besseren Verständnis möchte ich einige Begrifflichkeiten stark vereinfacht erklären, die im weiteren Verlauf dieser Serie detailierter beschrieben werden.</p> Neue Post-Serie: SQL Server Closeup https://www.sascha-dittmann.de/posts/neue-post-serie-sql-server-closeup/ Mon, 03 Jan 2011 08:23:00 +0100 https://www.sascha-dittmann.de/posts/neue-post-serie-sql-server-closeup/ <h2 id="neue-post-serie">Neue Post-Serie</h2> <p>Zum Start diesen Jahres, möchte ich eine Neuerung auf meinem Blog ankündigen:<br> In den nächsten Wochen und Monaten werde ich verstärkt die Interna des SQL Servers beleuchten.</p> <h2 id="warum-sollte-man-sich-mit-den-interna-des-sql-servers-auseinandersetzen">Warum sollte man sich mit den Interna des SQL Servers auseinandersetzen?</h2> <p>Es ist natürlich spannend, sich in neue Themen einzuarbeiten<br> Das Verständnis wie Daten vom SQL Server gespeichert, abgefragt und optimiert werden, …</p> <ul> <li>… bildet die Grundlage für eine performante und einfach verwaltbare Softwarearchitektur</li> <li>… erklärt warum manche Design-Entscheidungen schlecht sind</li> <li>… vereinfacht die Fehlersuche</li> </ul> <p>Somit wünschte ich nicht nur ein Frohes und Erfolgreiches Jahr 2011, sondern auch Viel Spaß beim Lesen der &ldquo;SQL Server Closeup&rdquo;-Serie!</p>