SSAS: Are my Aggregations processed?


You have designed Aggregations for your cube, but how do you know that they are currently processed?

Hopefully you have your processing routines setup in production so that your indexes are always kept processed. But maybe you are working in a development environment or you are performance tuning that you want to double check that your aggregations are currently processed.

It is not immediately obvious how you can figure if the indexes for a partition or a set of partitions are processed as this information is not exposed in SSMS anywhere.

One way in which you can find it out with an XMLA discover call to the DISCOVER_PARTITION_STAT rowset, but that returns the results in big lump of XML which is not as easy to read as a tabular result set.

<Discover xmlns="urn:schemas-microsoft-com:xml-analysis">

    <RequestType>DISCOVER_PARTITION_STAT</RequestType>

    <Restrictions>
        <RestrictionList>
      <DATABASE_NAME>Adventure Works DW</DATABASE_NAME>
      <CUBE_NAME>Adventure Works</CUBE_NAME>
      <MEASURE_GROUP_NAME>Internet Sales</MEASURE_GROUP_NAME>
      <PARTITION_NAME>Internet_Sales_2003</PARTITION_NAME>
    </RestrictionList>
    </Restrictions>

    <Properties>
        <PropertyList>
           </PropertyList>
    </Properties>

</Discover>

If you have SSAS 2008, you can use the new DMV feature to query this same rowset and return a tabular result.

SELECT * 
FROM SystemRestrictSchema($system.discover_partition_stat
        ,DATABASE_NAME = 'Adventure Works DW 2008'
        ,CUBE_NAME = 'Adventure Works'
        ,MEASURE_GROUP_NAME = 'Internet Sales'
        ,PARTITION_NAME = 'Internet_Sales_2003')

This is much easier to read. If you look at the results for a partition that has processed aggregations you will see a row for each aggregation and a row without an aggregation name which represents the fact data.

If you are using SSAS 2005 you are not stuck with just the XML results, you can download the assembly from the Analysis Services Stored Procedure project and use the DMV() function from there with what I think is a much more intuitive syntax - but then I'm biased as I wrote it :)

CALL assp.dmv("
SELECT *
FROM $system.discover_partition_stat
WHERE DATABASE_NAME = 'Adventure Works DW 2008'
  and CUBE_NAME = 'Adventure Works'
  and MEASURE_GROUP_NAME = 'Internet Sales'
  and PARTITION_NAME = 'Internet_Sales_2003'
")

Unfortunately the documentation on this function is pretty sparse, but with a few experiments we can figure out what it is telling us. As you can see this lists each aggregation along with it's size:

image

If you run a processData on the partition you will end up with the following results with just the raw fact data:

image

And after you do a processUpdate on one of your dimensions with flexible relationships you will see the following sort of result where any flexible aggregations now have a size of 0:

image

Now this is all fine if you are only interested in one partition, but if you are like me you will be thinking that you don't want to have to run this query manually for every partition. I want to run it for all partitions. And ideally I would like to check against the metadata of the cube to find out if all of the designed aggregations have been processed. The problem here is that the XMLA Discover call, which is also underlying the two DMV approaches, has mandatory restrictions so you can only query one partition at a time. If you leave out any of the restrictions you will just get an error about a missing mandatory restriction.

So what we really need is some way of running a series of these queries.

Enter PowerShell. The following script loops through all of the partitions in a cube and executes the discover query, then it does a  check to see if the total count of processed aggregations is the same as the count of designed aggregations. This script is using PowerSSAS, but I have put some comments in the top of the script for the equivalent "raw" powershell if you are not able to install PowerSSAS.

 

############################################################
# Get a reference to the Adventure Works cube
add-PSSnapin powerssas
$cub = get-ascube localhost "adventure works dw" "Adventure works"

############################################################
## if you don't have powerSSAS you can uncomment the 5 lines below ## and use them instead of the 2 lines above. ############################################################
#[System.Reflection.Assembly]::LoadWithPartialName("microsoft.AnalysisServices") #$svr = new-Object Microsoft.Analysisservices.Server #$svr.Connect("localhost") #$db = $svr.Databases.GetByName("Adventure Works DW") #$cub = $db.Cubes.GetByName("Adventure Works") # Create a connection use the Microsoft.AnalysisServices.Xmla assembly so # that we can issue a DISCOVER command [System.Reflection.Assembly]::LoadWithPartialName("microsoft.AnalysisServices.Xmla") > null [Microsoft.AnalysisServices.xmla.xmlaclient]$xmlac = new-object Microsoft.AnalysisServices.Xmla.XmlaClient $xmlac.Connect("localhost") $cub.Refresh() # loop through each Measure Group and Partition in the cube foreach ($mg in $cub.MeasureGroups) { foreach ($p in $mg.Partitions) { $XmlResult = "" # Initialise the variable so that it can be passed by [ref]
    # the $restrict variable is a multi-line string
    $restrict = "
    <RestrictionList>
      <DATABASE_NAME>Adventure Works DW</DATABASE_NAME>
      <CUBE_NAME>$($cub.Name)</CUBE_NAME>
      <MEASURE_GROUP_NAME>$($mg.Name)</MEASURE_GROUP_NAME>
      <PARTITION_NAME>$($p.Name)</PARTITION_NAME>
    </RestrictionList>"

    $xmlac.Discover("DISCOVER_PARTITION_STAT", $restrict, "", [ref] $XMLResult, 0, 1, 1)
    
    # the result comes back as a string, so the result is cast to an XML variable
    # to make it easier to work with
    [xml]$x = $XmlResult
    
    # get the cound of processed aggregations from the XML result
    [int]$processedAggCnt = $($x.return.Root.row |Where-Object {$_.AGGREGATION_SIZE -gt 0} ).Count
    
    if ($processedAggCnt -gt 0) {$processedAggCnt -= 1}
    
    # count how many aggregations we have in the design
    [int]$totalAggCnt = $p.AggregationDesign.Aggregations.Count
    
    # print out the details of aggregations where the count of designed
    # aggregations does not match the count of processed aggregations
    if ($processedAggCnt -ne $totalAggCnt)
    {
    "$($cub.Name) - $($mg.Name) - $($p.Name)  cnt: $processedAggCnt of $totalAggCnt processed ($($p.EstimatedRows) Estimated Rows)"
    }
  }
}
$xmlac.Disconnect()

 

After doing a process update on one of the dimensions in the Adventure Works DW database I got the following output from the above script.


Adventure Works - Internet Sales - Internet_Sales_2001 cnt: 0 of 22 processed (1013 Estimated Rows) Adventure Works - Internet Sales - Internet_Sales_2002 cnt: 0 of 22 processed (2677 Estimated Rows) Adventure Works - Internet Sales - Internet_Sales_2003 cnt: 6 of 22 processed (32265 Estimated Rows) Adventure Works - Internet Sales - Internet_Sales_2004 cnt: 6 of 22 processed (32265 Estimated Rows) Adventure Works - Reseller Sales - Reseller_Sales_2001 cnt: 16 of 66 processed (4138 Estimated Rows) Adventure Works - Reseller Sales - Reseller_Sales_2002 cnt: 16 of 66 processed (16676 Estimated Rows) Adventure Works - Reseller Sales - Reseller_Sales_2003 cnt: 16 of 66 processed (26758 Estimated Rows) Adventure Works - Reseller Sales - Reseller_Sales_2004 cnt: 16 of 66 processed (13283 Estimated Rows) Adventure Works - Sales Summary - Total_Sales_2001 cnt: 0 of 63 processed (5151 Estimated Rows) Adventure Works - Sales Summary - Total_Sales_2002 cnt: 24 of 63 processed (19353 Estimated Rows) Adventure Works - Sales Summary - Total_Sales_2003 cnt: 24 of 63 processed (51201 Estimated Rows) Adventure Works - Sales Summary - Total_Sales_2004 cnt: 24 of 63 processed (51201 Estimated Rows)
PS: >_

If you want to take this script to the next level, rather than just providing information, you would probably want to do a processIndex on the listed partitions. Possibly using the CaptureXml property and the ExecuteCaptureLog method of the server object to run this processing in parallel.

But I leave that as an exercise for the reader :)

Enjoy!

Technorati Tags: , ,

author: Darren Gosbell | posted @ Tuesday, December 02, 2008 10:17 PM | Feedback (0)

SSAS: Listing Attribute Relationships


Occasionally questions come up about how to extract certain pieces of metadata from Analysis Services. In general all the metadata that you would need on a day to day basis is pretty well covered by the standard schema rowsets. And in SSAS 2008 you can use the system DMVs to get at most of this data.

For example, if you want to get a list of the current user sessions on the server you can do the following...

SELECT * FROM $System.DISCOVER_SESSIONS

...and in SSAS 2005 you can use the same syntax with the DMV() function that is part of ASSP.

call ASSP.DMV("SELECT * FROM $System.DISCOVER_SESSIONS")

But there are some details which can only be accessed through the DISCOVER_XML_METADATA command which returns a hierarchical result similar to what you get when you script an object from SSMS and both the DMV's in SSAS 2008 and the DMV() function in ASSP does not handle this data. Unfortunately the hierarchical information is not the easiest thing to read quickly and is even harder to try to incorporate into a reports.

This is where the DiscoverXmlMetadata() function comes in handy. I wrote this function to use a syntax similar to XPath in order to extract certain nodes. By default the function lists all of the properties of the node it finds which matches the specified path, however you can also add a pipe character (|) after any node and list extra properties that you would like returned

The following call will return a list of all the attribute relationships in the current database:

call assp.DiscoverXmlMetadata("\Database\Dimensions\Dimension|Name\Attributes\Attribute|Name,Usage\AttributeRelationships\AttributeRelationship")

And if you want to view the relationships for just a single dimension you can use the optional parameter to pass in a predicate in the same form that you would use in an SQL query (provided that you compile the code yourself or use a version greater than the current 1.2 release - as I only recently added this filter parameter)

call assp.DiscoverXmlMetadata("\Database\Dimensions\Dimension|Name\Attributes\Attribute|Name,Usage\AttributeRelationships\AttributeRelationship"
, "DimensionName='Product'")

author: Darren Gosbell | posted @ Wednesday, November 26, 2008 10:58 PM | Feedback (1)

BIDSHelper is #1


trophy Yesterday at the 2008 PASS conference they announced the winners of the SQL Heroes contest and I am proud to announce that BIDSHelper won first place with a perfect score of 55 out of 55. And extra congratulations go to BIDSHelper team member John Welch who also had one of his other projects - ssisUnit come in equal second.

Thanks to everyone who voted for BIDSHelper!

author: Darren Gosbell | posted @ Saturday, November 22, 2008 11:03 PM | Feedback (2)

Teaser: SSAS Cache Warming with PowerShell


You may be thinking oh-no, not another one. Allan Mitchell recently posted an example of an SSIS package that would warm the SSAS cache which is an updated version with a slightly simpler SSIS data flow from something Chris Webb originally blogged. Being a PowerShell fan as I read Allan's post I realised that most of the tasks mapped to native PowerShell cmdlets and I already had PowerShell code to execute an MDX command, so all I was missing was someway of reading in the trace data.

What I ended up with was the following 3 line script which uses 2 native and 2 custom cmdlets to do the same thing as Allan's SSIS package.

add-PSSnapin powerSSAS
add-PSSnapin powerTrace

get-SqlTraceEvent "c:\data\cacheWarmTest.trc" `
    |Where-Object {$_.EventSubclass -eq 0 `
-and $_.EventClass -eq "Query End" `
-and $_.TextData.Trim().Length -gt 0 } ` |Sort-Object TextData -unique ` | % {Invoke-AsMdx localhost $_.TextData > null}

The first two lines are just plumbing code that load the snapins (dlls) that contain the get-SqlTrace and Invoke-AsMdx cmdlets. The following is an outline of how the script works:

  • The get-SqlTraceEvent cmdlet will read a .trc file and return a collection of custom objects that has a property for each of the columns that were capture in the trace.
  • The call to Where-Object does the same thing as the conditional split in the SSIS package and filters out any events that are not MDX queries. (you can also setup your trace to only capture MDX commands)
  • The Sort-Object call is the same as the sort task in the SSIS and extracts only unique queries (based on an exact string match).
  • Finally the invoke-AsMdx cmdlet executes the queries. I am redirecting the output to null as I am not really interested in actually doing anything with the results.

So, if this has all been done before why would I bother doing it again? - Because PowerShell scripts are so easy to work with. What happens if your trace file contains a lot of small, fast queries that you do not want to bother running? With the script you can easily edit it to add another condition to only process queries that took more than 100 milliseconds.

get-SqlTraceEvent "c:\data\cacheWarmTest.trc" `
   
|Where-Object {$_.EventSubclass -eq 0
`
              -and $_.EventClass -eq "Query End"
`
              -and $_.TextData.Trim().Length -gt 0
} `
              -and $_.Duration -gt 100 } `
    |Sort-Object TextData -unique `
  
 | % {Invoke-AsMdx localhost $_.TextData > null}

And that is just the tip of the proverbial iceberg, you could also do things like loop over a series of .trc files or you could possibly get more sophisticated in your analysis and possibly look for queries that actually had been hitting the cache.

You may be wondering why I have called this post a teaser, well that's because the bits for the key parts of it are only on my laptop at the moment. I currently have the tracing in a separate snapin because it has a dependency on the SMO library and I did not want to add that dependency to powerSSAS. Then there is the fact that this should work with .trc files from the relational engine too, so it does not seem to fit neatly with powerSSAS.

I also have a snapin for PerformancePoint Monitoring and some SSIS cmdlets, so another thought I had was to bundle all these projects and release some sort of BI PowerShell pack. I'm not sure which direction to take, I would be interested to hear if anyone has any opinions on this.

 

Technorati Tags: ,

author: Darren Gosbell | posted @ Sunday, November 16, 2008 11:41 PM | Feedback (5)

BIDSHelper is a finalist in the SQL Heroes contest


So if you like BIDS Helper, head over to the survey and put in a vote!

Thanks.

author: Darren Gosbell | posted @ Tuesday, October 28, 2008 8:15 AM | Feedback (3)

SQL Down Under Code Camp 2008 - Attribute Relationships Presentation


imageAt the recent SQL Down Under Code Camp my presentation was on Attribute Relationships and was sub titled - "You can choose your relatives, but you can't choose your friends".  It covered Attribute Relationships, how they work, how to set them up and why you should bother. I put a bit of effort into making it what I think is an attractive looking presentation, but if you were not there it probably does not make much sense without the narrative and demos that went with it. So I am mainly posting this as a reference those who attended the Code Camp.

I have put a link below to a folder where there is both a pptx version for those of you with Powerpoint 2007  and a ppt version.

 

PS. While I am on the topic of Code Camp, one of the presentations at Code Camp was around Reporting Services and the presenter shared his frustration with the fact that the PDF's generated by SSRS cannot contain embedded fonts. This means that if you use a non-standard font, your report will look different on machines where that font is not present. However I recently noticed this post which announce that with CU1 for SQL 2008 that this issue has been addressed (and for SQL 2005, this fix will be included in SP3)

author: Darren Gosbell | posted @ Friday, October 24, 2008 6:24 AM | Feedback (0)

Podcasts from the 2008 Microsoft BI Conference


The B-eye-network website is hosting a series of podcasts from the Microsoft BI Conference. I have not had a chance to listen to any of them yet, but there are quite a number of senior Microsoft people on the list so they should be interesting.

http://www.b-eye-network.com/podcast/archive/index-new.php?show_id=35&show_year=2008

author: Darren Gosbell | posted @ Friday, October 10, 2008 10:35 AM | Feedback (0)

SQL Down Under Code Camp 2008


The SQL Down Under Code Camp for 2008 is on in a couple of weeks. Over the weekend of the 11th and 12th of October 2008 the cream of the Australian SQL Server community will gather at Charles Sturt University in Wagga Wagga. This is a free community even, if you can get yourself there it's not too late to go to the website, have a look at the list of sessions and sign up.

There is a range of sessions covering all things SQL Server, including one from me on SSAS. It's going to be a great weekend. I'm really looking forward to it.

author: Darren Gosbell | posted @ Tuesday, September 30, 2008 10:27 PM | Feedback (0)

SSAS: Deploying to renamed databases


Last year I logged an issue on the connect site around deploying from BIDS and renamed databases. https://connect.microsoft.com/SQLServer/feedback/ViewFeedback.aspx?FeedbackID=281595

I got a couple of messages relating to this issue, one saying that it was being closed as it was a duplicate issue and then another one recently where it was updated to indicate that the issue has been fixed in SQL Server 2008. I think it is really great to get this sort of feedback that something is being done, unfortunately it does not appear to be accurate as I recently tested this issue on SQL Server 2008 RTM and it still appears to be there.

So what exactly is this issue? Well, try out the following steps on a dev machine.

  1. Deploy the Adventure Works DW 2008 database.
  2. Open up Management Studio and rename
    "Adventure Works DW 2008" to "Adventure Works DW 2008 v2"
  3. Change the deployment properties of the Adventure Works DW 2008 project in BIDS
    to deploy to "Adventure Works DW 2008 v2"
  4. Now try to deploy the project.

It did not work did it?

So what is the expected behaviour here? Personally I expect that I would get a message about the database not being in synch or already existing and being asked if I was sure that I wanted to overwrite it. Instead all you get is the following:

image 

And you cannot deploy at all.

This is happening because all objects in SSAS have a name property and an ID property and when you deploy a database from BIDS it sets the ID to the same value as the name. The product team created these two properties so that internally everything could be linked using the ID property and then users could be free to change the names of objects without breaking anything. This is a great goal, but as you can see we are not quite there yet.

I have another one for you - Consider the following scenario.

You are working on some changes to a database, you want to keep the current version around for benchmarking, but you expect that the new version will soon supercede the old one. So you open up SSMS and rename the database from "Adventure Works DW" to "Adventure Works DW - old". Now you deploy the updated Adventure Works DW project ready to do your side by side testing.

What you will get is a dialog like the following:

image

Which is unfortunately similar to this dialog:

image

Which is what you get when you tell BIDS to process an object when there are changes in the project which have not yet been deployed.

If you read the first dialog carefully and if have an appreciation for the fact that there are distinct ID and Name properties you will see what is going on and that what BIDS is telling you is that you are about to overwrite your renamed database on the server with the one in BIDS - probably not what you want. But, if you don't read it carefully, it does not look like a critical warning and if you skip to the last line you probably just see "Would you like to continue?" which you obviously do and then you will curse BIDS for "deleting" your renamed database.

I think the deployment of a database from BIDS should use the following logic.

Deploy Flowchart

I could be wrong, but I am guessing that this is probably not something that is likely to be changed in BIDS any time soon. And honestly, if you are aware of what is going on I don't really see it as being too much of an issue.

We already have some requests for additional deployment functionality in BIDS Helper, maybe I will see if I can address this issue too as part of that piece of work.

What is probably more of an issue is that the problems with renamed databases seem to extend to the Synchronize functionality as detailed in this newsgroup thread

Technorati Tags: ,

author: Darren Gosbell | posted @ Sunday, September 28, 2008 9:50 PM | Feedback (1)

SSAS: Verifying Backups


There was a question on the SSAS forum recently asking if it was possible to verify a backup file. Now if you have checked in Books Online to check the XMLA backup and restore commands, checked the UI in SSMS and even used reflector against the AMO library you would think that there was no way of doing this. I certainly did. However try the following...

Navigate to:

    <Program Files>\Microsoft SQL Server\MSAS10.SQL08\OLAP\bin

then type:

     msmdsrv /?

And you will get the following information: 

Usage:
  [-m] [-c] [-n <Name>] [-i]|[-r] [-t] [-x] [-s<Dir>] [-f] [-d<Dir>] [-v[<String>]] [-x[<String>]] [-l<number>] [-e[<c>] <file>] [
-u[<c>]]
  -c = console mode
  -s = config file directory
  -f = initialize config file
  -d = root data directory
  -i = install (register)  MSSQLServerOLAPService service
  -r = remove (unregister) MSSQLServerOLAPService service
  -t = registry for event log
  -q = unregistry for event log
  -n = instance name
  -l = server locale
  ------------------------------------------------------------------------------------------
  -b = backup file name
  -k = encryption password used to create backup file
  -g = extraction directory pathname
  -j = test backup file only
  to list all files in .ABF use          msmdsrv -b <ABFfilePathname> [-k <EncrKey>]
  to test .ABF file use          msmdsrv -j -b <ABFfilePathname> [-k <EncrKey>]
  to extract .ABF file use               msmdsrv -g <ExtractionDirPathname> -b <ABFfilePathname> [-k <EncrKey>]
  ------------------------------------------------------------------------------------------

So while you cannot execute the verification of a backup file from a client machine, you can do it from the server. (Plus it looks like there are a few other interesting options in there)

Technorati Tags:

author: Darren Gosbell | posted @ Saturday, September 13, 2008 3:42 PM | Feedback (1)

TechEd: BI Power Tools


For those of you who attended my talk or for any other interested parties, I have uploaded my slide deck from my MVP Theatre presentation at Tech.Ed Australia 2008 to my sky drive here:

There is not too much to this deck as the presentation was mainly demos.

If you are just after the links to the tools I demonstrated I have included them below:

And here are the links to some of the other tools that you may be interested in:

And while it is not strictly a BI tool, the makers of PowerShell Analyzer have released v1.0 for free, so if you are doing anything with PowerShell, you really should download it. It's like Query Analyzer for PowerShell.

PowerShell Analyzer 1.0

Technorati Tags: , , ,

author: Darren Gosbell | posted @ Saturday, September 06, 2008 2:10 PM | Feedback (1)

Invalid namespace - Running SSRS against a named instance


I recently went to check the configuration of my SQL Server 2008 Reporting Services instance (which is a named instance called "SQL08") and it came up with a "connect" dialog and when I clicked on the "find" button I got an "invalid namespace" error.

I found a few threads on the MSDN forums about this and eventually a Microsoft guy came up with a solution.

The post at the end of this thread http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=3741006&SiteID=1 had the solution which worked for me, so I have copied it out below.

1. Locate the existing MOF file (example: %ProgamFiles%\Microsoft SQL Server\MSRS10.SQL2008\Reporting Services\ReportServer\bin\reportingservices.mof would be the default location for a Reporting Services instance named SQL2008).

2. Copy this reportingservices.mof to reportingservicesalt.mof (or some other unique name).

3. Notepad reportingservicealt.mof

4. Choose edit->replace…

5. In the dialog, in the Find What: text box enter the modified instance name (for an RS instance named SQL2008, the modified instance name is RS_SQL2008), in the Replace with: text box enter the instance name unmodified (so for an RS instance named SQL2008, just enter SQL2008).

6. Press the Replace All button.

7. Save and close notepad.

8. From a command window at the same location as the results of step 1, type MOFCOMP REPORTINSERVICESALT.MOF (or whatever the name from step 2 was).

Now the configuration tool should work with the following exception, if the RS instance name contains an underscore (_), a dollar sign ($) or a hash (#), then step 8 will fail and the user will need to re-install the Reporting Services instance with a name that does not include any of these three characters.

From this it looks like may be the setup messed up somewhere. The above script appears to re-register the Reporting Services WMI namespaces. Apparently there will be a knowledge base article published on this soon.

author: Darren Gosbell | posted @ Thursday, September 04, 2008 8:21 AM | Feedback (1)

BIDS Helper 1.3.0.8 Release


We have released a new update for BIDS Helper.

This release adds:

  • support for Teradata data sources in the Dimension Health Check
  • and fixes an issue where the properties page for the Package Deploy feature was not appearing under some circumstances.

author: Darren Gosbell | posted @ Friday, August 29, 2008 10:05 PM | Feedback (0)

Codeplex RSS Feed for the entire project (not)


A little while ago the team that work on the BIDS Helper project discovered something interesting about codeplex. Codeplex Wiki pages have the facility to allow people to add comments, but unlike all the other places where people can interact with a codeplex project, for some reason wiki pages are not included in the projects RSS feed. So if you have ever added a comment to a page on a codeplex project and wondered why the author never acknowledged your comment, this could be why.

Hopefully the codeplex team can address this soon. There is a work item posted here http://www.codeplex.com/CodePlex/WorkItem/View.aspx?WorkItemId=5598 that requests that wiki comments be included in the projects RSS feed so that project teams can be notified of comments rather than having to do periodic manual checks through the wiki pages. In the time being if you have comment, question or suggestion that you want a response to you are better off using the discussion or issues tabs

Technorati Tags: ,

author: Darren Gosbell | posted @ Tuesday, August 26, 2008 9:30 PM | Feedback (0)

MVP Theatre Agenda at Tech Ed Australia


image If you are registered for Tech Ed Australia this year, come along to MVP Theatre to watch MVPs delivering sessions ranging from 20 minutes to the full 75 minutes. There are only 20 seats in MVP Theatre, so you need to be quick getting to the Expo Hall if you’re serious about catching an MVP Session. The Agenda for MVP Theatre is here (please watch it for last minute updates). To attend, you must be a registered delegate, so if you haven’t bought your Tech Ed ticket yet, you can register here

I’m presenting a session on BI Power Tools - covering some of the free and/or open source tools that you can use with the Microsoft BI Stack on Friday at 10:15.

Seated attendees to MVP Theatre each receive an MVP Logo wind-up torch keyring (no battery!), so you need to be quick!

You can’t pre-register for MVP Theatre sessions; it’s first in first seated. 

If you have any Business Intelligence related questions that you would like me to answer you can always  ask a question here and nominate me to answer it. :)

Technorati Tags:

author: Darren Gosbell | posted @ Sunday, August 24, 2008 10:20 PM | Feedback (0)