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

Analysis Services Cube Statusdaten per PowerShell abfragen

26. Juni 2009 , Geschrieben von Olaf Helper Veröffentlicht in #OLAP

Will man die Detailinformationen zu seinen Cubes und Dimensionen erhalten, muss man diese entweder manuell einzeln über das Sql Server Management Studio (SSMS) abrufen oder muss sie über XML/A abfragen, wieder einzeln.

Ein anderer Weg ist, sich die ganzen Informationen über ein einfaches PowerShell-Script auflisten zu lassen; das könnte dann z.B. auch automatisch über SSIS nach erfolgter Verarbeitung zur Kontrolle erfolgen.

 

 ## PS Script 
 ## Ausgabe der Statusdaten (Update und Verarbeitung) von Cubes 
 ## und Dimensionen
 ## AdoMd namespace hinzufügen $loadInfo = [Reflection.Assembly]::LoadWithPartialName("Microsoft.AnalysisServices.AdomdClient")  
 ## Mit AS verbinden 
 $cat = New-Object MiCrosoft.AnalysisServices.AdomdClient.AdomdConnection 
 $cat.ConnectionString = "Data Source=localhost;Catalog=SmallCube" 
 $cat.Open()
 ## Eckdaten des Servers + DB ausgeben
Write-Output ("`nVersion: {0} State: {1} DB: {2}`n" -f
  $cat.ServerVersion, $cat.State.ToString(), $cat.Database 
  )  
 ## Für jeden Cube / Dimension die Statusdaten ausgeben 
 foreach ($cube in $cat.Cubes) 
 { 
  Write-Output ("Cube: {0} ({1})`nUpd: {2}`tPrc: {3}`n" -f 
   $cube.Name, $cube.Type.ToString(), $cube.LastUpdated, $cube.LastProcessed 
  ) 
 }  
 ## Und sauber wieder schließen 
 
$cat.Dispose()
$cat.Close()
Weiterlesen

Microsoft Visual Studio Solution mit einer Express Edition öffnen

17. Juni 2009 , Geschrieben von Olaf Helper Veröffentlicht in #.NET

Eine der größeren Einschränkungen bei der kostenfreien Microsoft Visual Studio Express Edition C# / Visual Basic ist, das man keine umfangreichere Solutions mit mehreren (Teil-) Projekten erstellen kann, das ist eigentlich den Editionen ab der Standard aufwärts vorbehalten. Viele der im Internet veröffentlichten Beispiele sind aber mit Standard oder höheren Editions erstellt worden. Will man nun mit einer Express Edition ein solches Beispiel öffnen, geht das nicht, man bekommt die Meldung "...kann nicht geöffnet werden, weil der Projekttyp (.vbproj) von dieser Version der Anwendung nicht unterstützt wird".

Es gibt aber eine einfache, kleine Möglichkeit das zu umgehen, um die Solution doch öffnen zu können. Man bearbeitet einfach die ersten 2 Zeilen in der .sln Datei mit einem Texteditor. Aus z.B. 

 Microsoft Visual Studio Solution File, Format Version 9.00 
 # Visual Studio 2005 

macht man 

 Microsoft Visual Studio Solution File, Format Version 10.00 
 # Visual Basic Express 2008 

Es ist auch kein Problem wie hier, wenn die Solution zunächst für eine Vorgängerversion war wie hier, die Solution wird dann beim Öffnen auf Nachfrage konvertiert.  Und so kann man doch noch die Solution mit Express öffnen und es sogar bearbeiten.

P.S.:  Man kann seine mit Express erstellt Solutionen auf vergleichbare Weise „richtig“ erweitern, in dem man weitere Projekte in der .sln hinzufügt, nach dem Aufbau. Ist natürlich „unsupported“. 

 Project("{F... 
 EndProject 
 Project("{F.. 
 EndProject 
Weiterlesen

Nicht verwendete Indizes (DMV)

17. Juni 2009 , Geschrieben von Olaf Helper Veröffentlicht in #T-SQL

Eine der Performanz-Faktoren beim Datenbank-Design sind die richtige Verwendung von Indizes: So viele wie nötig, so wenig wie möglich. Überflüssige Indizes verringern unnötig die Schreibgeschwindigkeit, da sie immer mit aktualisiert werden müssen, wenn INSERTs oder UPDATEs auf die Index-Felder erfolgen.

Über die DMV sys.dm_db_index_usage_stats kann man ermitteln, welche Indizes wie häufig und wann zuletzt verwendete wurden, entsprechend kann man hier über auch die Indizes selektieren, die nicht (mehr) verwendet werden, um diese ggf. zu entfernen. 

Untenstehend ein Script zum Ermitteln von nicht/selten und/oder seit langem nicht mehr verwendeten Indizes. Es filtert dabei schon

-          Indizes zu leeren Tabellen (welche entsprechend auch nicht verwendet worden sein können)

-          PrimaryKey, Unique und Clustered (habe eine Logikfunktion und werden deshalb benötigt)

-          Desaktivierte Indizes

heraus. Aber auch hier gilt wie immer, nicht einfach unbesehen alle selektierten Indizes rauswerfen, sondern zunächst jeden detaillierter prüfen.

 -- Ermittelt alle nicht oder seit langem nicht 
 -- & kaum verwendete Indizes  
 DECLARE @MinLastUsed datetime; DECLARE @MinUsage int; 
 SET @MinLastUsed = '20090101'; 
 SET @MinUsage = 20 
   
 SELECT SCH.name AS SchemaName, OBJ.name AS TableName, OBJ.type_desc AS TableType,  
  IDX.name AS IndexName, IDX.type_desc AS IndexType, 
  IUS.last_user_update AS LastUserUpdate, 
  IUS.last_system_update AS LastSystemUpdate, 
  (IUS.user_seeks + IUS.user_scans + IUS.user_lookups 
  + IUS.system_seeks + IUS.system_scans + IUS.system_lookups) AS UsageCount, 
  ISNULL(IUS.last_user_seek, IUS.last_user_scan) AS LastUserUsage, 
  STA.row_count AS DataRowCount 
 FROM sys.dm_db_index_usage_stats AS IUS 
  INNER JOIN sys.indexes AS IDX 
  ON IUS.object_id = IDX.object_id AND IUS.index_id = IDX.index_id 
  INNER JOIN sys.objects AS OBJ 
  ON IUS.object_id = OBJ.object_id 
  INNER JOIN sys.schemas AS SCH 
  ON OBJ.schema_id = SCH.schema_id 
  INNER JOIN sys.dm_db_partition_stats AS STA 
  ON STA.object_id = IDX.object_id 
  AND STA.index_id = IDX.index_id 
 WHERE IUS.database_id = DB_ID() -- Nur für die aktuelle DB 
  AND STA.row_count > 0 -- Keine Daten = keine Idx-Verwendung 
  AND IDX.type > 1 -- keine Heaps & CLUSTERED 
  AND IDX.is_unique = 0 -- keine Unique Indizes, weil benötigt für Logik 
  AND IDX.is_unique_constraint = 0 
  AND IDX.is_primary_key = 0 -- keine PKs, weil benötigt für Logik 
  AND IDX.is_disabled = 0 -- Deaktivierte werde eh nicht verwendet 
  AND OBJ.type <> 'S ' -- keine Systemtabellen 
  -- entweder "kaum" verwendet 
  AND (ISNULL(IUS.user_seeks + IUS.user_scans + IUS.user_lookups 
   + IUS.system_seeks + IUS.system_scans + IUS.system_lookups, 0)  
  < @MinUsage 
  OR -- oder das letzte Mal ist "lange" her 
  (ISNULL(IUS.last_user_seek, @MinLastUsed - 1) < @MinLastUsed 
  AND ISNULL(IUS.last_user_scan, @MinLastUsed - 1) < @MinLastUsed 
  AND ISNULL(IUS.last_user_lookup, @MinLastUsed - 1) < @MinLastUsed 
  )) 
 ORDER BY (IUS.user_seeks + IUS.user_scans + IUS.user_lookups 
  + IUS.system_seeks + IUS.system_scans + IUS.system_lookups), 
  IUS.last_user_update, IUS.last_system_update,
SCH.name, OBJ.Name, IDX.name
Weiterlesen

Microsoft SQL Server 2008-Onlinedokumentation (Mai 2009)

15. Juni 2009 , Geschrieben von Olaf Helper Veröffentlicht in #Download MSSQL

Die aktuelle Onlinedokumentation des Microsoft SQL Server 2008 gibt es nun im Download Center seit Freitag 12.06.2009 auch in Deutsch. Größe ist fast 150 MB.

Weiterlesen

Microsoft Visual Studio 2008 Express Edition: Welche .NET Framework Version?

12. Juni 2009 , Geschrieben von Olaf Helper Veröffentlicht in #.NET

Wenn man mit MS Visual Studio 2008 in Edition >= Standard ein neues Projekt anlegt, kann man über eine ComboBox auswählen, gegen welche Framework Version (also 2.0, 3.0, 3.5, Compact etc.) entwickeln und somit kompilieren möchte. Bei der Express Edition von MS Visual Studio 2008 Visual Basic / C# wird man nicht danach gefragt, es wird als Standard das .NET Framework 3.5 gesetzt.

Nun gibt es aber Projekte, die man gegen die Version 2.0 entwickeln will, z.B. Assemblies für den Microsoft SQL Server 2008 (dabei passen die Versionsnummer doch so schön ;-) ). Aber auch in der Express Edition von Visual Studio 2008 kann man es (nachträglich) angeben, es ist nur etwas sehr versteckt.

Zu finden ist es in den Projekt Eigenschaften unter dem Kartenreiter „Kompilieren“ über den Button „Erweiterte Kompilierungsoptionen…“. In dem folgenden Dialog kann man dann das „Zielframework“ auswählen.

Weiterlesen

Visual Basic.NET und Microsoft FxCop

12. Juni 2009 , Geschrieben von Olaf Helper Veröffentlicht in #.NET

Wenn man im Team arbeitet, sind Coding Conventions Standard, allein schon damit man den Code von einem Kollegen nicht nur lesen, sondern auch verstehen kann. Aber auch wenn man „nur“ so ein wenig zuhause für sich selbst programmiert, sollte man sich an bestimmte Coding Conventions halten. Zum einen gewöhnt man sich schneller daran und man hat es dann bereits „im Blut“, wenn es beruflich gefordert wird. Zum anderen steht man selbst gelegentlich vor eigenem Code, den man zuletzt vor Monaten angefasst hatte und fragt sich dann selbst „was habe ich da nur verzapft und was soll mit die Bezeichnung dieser oder jener Variable sagen?“.

Von Microsoft gibt es das kostenlose Tool „FxCop“, das gewisse Coding Convention und Design Pattern überprüfen kann. Entgegen anderen Visual Studio AddOns ist es ein externes Tool, dass auf das kompilierte Assembly aufsetzt und nicht auf den Source Code. Dafür hat es den Vorteil, das es auch zusammen mit der ebenfalls kostenlosen „Express Edition“ von Visual Studio verwendet werden kann; und genau das mache ich.

Manche der gemeldeten Design-Verstöße sind je nach Kontext nicht sinnig oder wirklich zutreffend, z.B. wenn man eine Klassenbibliothek erstellt und dann diverse Hinweise auf "CA1811:AvoidUncalledPrivateCode" bekommt; die Methoden sollen ja von einem anderen Projekt genutzt werden. Diese Meldungen kann man durch ein „SuppressMessage“ Flag unterdrücken lassen, dazu muss man in FxCop nur mit der Rechte-Maus Taste auf die Meldung klicken => „Copy As“ => „SuppressMessage“ oder „Modul-level SuppressMessage“ und das kopiert man dann entsprechend in sein Projekt.

Nur in Kombination mit Visual Basic.NET gibt es eine kleinen Haken: Die Formatierung ist nach C# und sieht als Beispiel so aus:

 [module: SuppressMessage("Microsoft.Globalization", 
  "CA1305:SpecifyIFormatProvider",  
  Scope="member",  
  Target="NETTest.FormatDate.#Main()",  
  MessageId="System.DateTime.ToString")] 

Das ist aber kein wirkliches Problem, man muss es nur etwas von Hand umformatieren

-          Aus den umschließenden eckigen Klammer [ ] macht man eckige < >

-          Die Zuweisung der Attribute muss über := statt über = erfolgen

Sieht dann so aus:

 <module: SuppressMessage("Microsoft.Globalization", _ 
  "CA1305:SpecifyIFormatProvider", _ 
  Scope:="member", _ 
  Target:="NETTest.FormatDate.#Main()", _ 
  MessageId:="System.DateTime.ToString")> 

 

Siehe auch:

Download: Microsoft FxCop 1.36

Entwurfsrichtlinien zum Entwickeln von Klassenbibliotheken

The Visual Studio Code Analysis Team Blog

MSDN: FxCop

Weiterlesen