Wednesday, April 9, 2014

MDS Source Updates



I ran into an interesting requirement on a recent MDS engagement.  The customer wanted to give a large number of users read-only access to the MDS data.  While they didn’t want most of the users to be able to update the Master Data, they realized that the users would frequently find issues with the Master Data.  They wanted the users to be able to suggest changes and corrections to the Master Data so the data could be fixed in the source system.

We decided to use permissions to make the attributes of the key master entities read-only while creating an updatable text attribute that users could use to report issues.  This worked well but we needed to inform the source system owners when an issue was reported so they could fix it quickly.  Our first attempt was to just create a business rule that fired when the change-request attribute was updated and used the normal notification mechanism to send an email to the data steward when a change-request field was populated.  This worked OK but the data steward was forced to click on the link to go to the MDS database to find out what the change-request text said.  In this customer’s environment data stewards didn’t necessarily have access to MDS so this was inconvenient.  To simplify the data steward’s life, we wrote a customer workflow class that was called when the change-request attribute   was updated.  The custom workflow made a web service call into MDS to retrieve the contents of the change-request attribute, composed an email with the change-request and other pertinent information and made a DBMail call to send the email to the data steward.

Wednesday, September 25, 2013

SQL File System Slides

Here are the slides from my Training on the Ts presentation: SQL File System Slides

SQL File System Questions

I did a presentation on the SQL File system Tuesday for Training on the Ts
The answers to questions asked during the presentation follow:

Questions Asked by Attendee
Q: Are there any changes in the file internals for Sql 2014? Does Sql Azure have the same
file architecture? Does it expose the same data and log files as on premise Sql Server versions?
A: I'm not aware of any changes to the filesystem in 2014.  There are always performance improvement

in each release but the basic file structure that we talked about hasn't changed for several releases. 
SQL Azure uses a very similar physical structure but a Azure database is a logical database and the
physical structure of the database isn't exposed to the user.
Q: Back in the day, we used to try and always allocate our DBs in allocations & growth sizes that
correlated (fit) onto 8k pages (size of physical disk page). What is the physical size these days, 64bit etc?
A: Good point.  SQL Server space is allocated in 64k chunks so if the file size isn't evenly divisible by

 64k there will be some unused space at the end of the file.
Q: can u please share the sqlserver capacity Planning templates or URL's
A: Unfortunately, I haven't ever run into a good SQL Server capacity planning system.  I generally

come up with a  solution tailored to the particular application.  Here are some of the links I use for
  information:  http://msdn.microsoft.com/en-us/library/ms978394.aspx  
  http://technet.microsoft.com/en-us/library/cc298801.aspx 
http://technet.microsoft.com/en-us/library/ms345368(v=SQL.105).aspx 
 
Q: how allocation is different, when allocation unit set to 64k
A: Not sure what you're asking.  Allocation is always 64k.  Are you talking about NTFS file

system block sizes?  If so, an NTFS block size of 64k is recommended for SQL Server
Q: I heard from another DBA that he creates 8 files automaticaly for TempDB, no matter the
  server's setup. What are you comments from this?
A: Not a bad thing to do.  I don't see any reason why that would cause a problem on a 4

core box.  The only down side is a little extra complexity.
Q: If temp space is requested by an application, does SQL allow it to use only one of the
8 files allocated to tempdb or can it use multiple?
A: SQL Server allocates space from the available files in a round robbin fashion if the

files are the same size.  If the files are different sizes SQL uses something called proportional
fill to allocate more space from the larger files so they stay approximately the same percent full. 
  This is why all files for a filegroup should be the same size.  If not the big file is a hot spot.
Q: is anyone else having audio issues?
A: Sorry about that - maybe there was a network issue
Q: is it recommended to run disk defrag where SQL mdfs and ndfs are located?
A: Yes but it's only necessary if the disk is fragmented.  If your files don't autogrow the disk

  volume shouldn't get fragmented.
Q: Is it worthwhile to update an existing database minimum file size after the database is
created and in use?
A: Yes, if the data size is increasing you can prevent further fragmentation.
Q: To Defrag the Windows filegroup, don't we have to thake the DB files offline, defrag
  windows file, then bring SQL file online and Defrag it?
A: Yes
Q: Best Practice we employ - use create table for tempDB's otherwise it locks all the

Allocation Maps until the entire insert into is completed
A: True.  Good point
Q: Very good presentation.  Thank you so very much.
A: --unanswered--
Q: How can I defrag the SQL file system after doing a windows file system defrag.
A: The SQL file system doesn't get fragmented but SQL indexes do.  Rebuilding

the indexes willl remove that fragmentation
Q: When does truncating a table reallocate space to be reused?
A: First, I want to be sure you're not talking about the Windows file size decreasing

when tables are truncated.  The windows file doesn't ever shrink unless you shrink
the database which I definitely don't recommend.  If you are asking when the pages
allocated to the table are freed up after a trancate table, they are freed after the next log
file backup.  There' a misconception that truncate is not logged.  It is actually minimally
  logged - the list of pages allocated to the table is written to the log and in the next log backup,
those pages are written to the backup.
Q: with today's SANs, how can you control fragmentation?
A: SAN volumes can be defragmented with the defrage tool of your choice.
Q: Would multiple files on user databases help reduce deadlocks?
A: Unfortunately probably not.  Allocation contention doesn't generally cause deadlocks.  It's

worth doing anyway but I haven't ever run into a deadlock caused by allocation contention.

Monday, September 9, 2013

TSQL Tuesday SSB Rube Goldberg Solutions


 

TT150x150
For those of you who don’t know me, I was one of the program managers for the SQL Server 2005 Service Broker.  One of the harder parts of being the Service Broker (SSB) PM was positioning it.  The first reaction I got when I did SSB talks was usually “Is this really different than MSMQ”?  To demonstrate that Service Broker was really much more than yet another reliable messaging product, I worked with several of our early adopters to come up with creative uses for the reliable, transactional, asynchronous queuing aspects of SSB.  I also wrote up a few uses that may not have ever been implemented.  Here are the more significant SSB Rube Goldberg ideas:

Data Warehouse Load Balancing


The first ever SSB customer was an internal Microsoft reporting application.  They had 4 or 5 copies of a database used for doing large ad-hoc queries.  When a query came in it was routed to one of the copies for processing.  The first SSB application was the obvious one – queries came in to a front-end server and were put on a queue on one of the query servers for processing.   The query engine would receive a message from the queue with the query, execute the query, and return the results in a response message.  This worked well and the transactional messaging ensured that queries weren’t lost but the customer wanted to be more intelligent about where queries should be routed.  To do this we set up a dialog timer on each of the query servers.  When the timer expired (every 10 seconds or so) an activation procedure would gather some statistics about running queries, processor, memory, and disk usage, etc. and send the info to the front end server.  The front end server could then use this information to decide which server was the least loaded and route the queries accordingly.

X-ray transmission


This one started as a SOAP toolkit question.  A research project at a college had a web service that people could use to search for and download x-rays.  The problem they were running into was the x-ray files were very large and some of the SOAP clients couldn’t handle the large messages.  We wrote a service that broke an x-ray down into a bunch of Service Broker messages that were sent to the SOAP server.  The client would request a message at a time and assemble the x-ray.  The client could request a message as many times as necessary.  SSB would send the same message until the client acknowledged it.  This was a pretty minor change to the web service that made it usable to significantly more clients.

Express backup


One of the biggest pieces of negative feedback we got for SQL Express was that since it didn’t include SQL Agent there wasn’t an easy way to set up periodic database backups.  The Service Broker dialog timer looked like a good way to do this so I came up with a way to backup SQL Express at any chosen interval:  http://blogs.msdn.com/b/rogerwolterblog/archive/2006/04/13/575974.aspx.  One of the cool things about this is that the backup routine is implemented in the database being backed up so if you move the database to another server, backups continue to work.  I like to think of this as the first step in the contained database effort.

Task Management


It was a pretty logical step from using SSB for scheduled database backups to using SSB for scheduling any database command.  You just need an activated stored procedure that reads SSB messages and executes them.  Service Broker is distributed so distributed tasks just work.  I had a lot of interest when I published this article but I didn’t hear any implementation stories:  http://technet.microsoft.com/en-us/magazine/2005.05.servicebroker.aspx

Windows Workflow


Service Broker was designed to support reliable, transactional, asynchronous applications.  The typical Service Broker application queues a message to request an action and then goes away until the action is complete and a response is received.  I always thought that pattern looked a lot like a workflow application so one day I built a Windows Workflow framework that used Service Broker as the eventing layer.  This resulted in a reliable, transactional infrastructure for building workflow applications.  This was pretty cool because as long as the actions the workflow invoked were transactional, the workflow was totally reliable.  The workflow application could die at any point and Service Broker would recover and pick up where it left off as soon as the database started again.  http://blogs.msdn.com/b/rogerwolterblog/archive/2007/05/21/windows-wf-on-sql-service-broker.aspx

Well, those are my Service Broker Rube Goldberg stories.  I would be very interested in hearing about other unique SSB applications.

Friday, August 23, 2013

Wither ASP.Net?



I ran into an interesting problem while installing MDS on a customer machine this week.  I installed SQL Server 2012 and Visual Studio 2012 on a Windows 7 box.  When I tried to configure MDS, I got a warning that said some Web Server software wasn’t installed.  After verifying that the list of things that MDS said it required was indeed installed, I decided I wasn’t going to be intimidated by a mere warning so I configured MDS anyway.  This worked fine but when I tried to bring up the client I got an error that said the URL was invalid.  I dug into the IIS configuration and found (with a little help) that the World Wide Web service was disabled.  I’ve seen this before – a security policy on the network disables IIS periodically to keep people from starting their own web sites on the corporate network.
When I enabled and started the World Wide Web service, I god an error that said a page handler wasn’t available.  This appeared to be an ASP.Net problem.  When I looked more into the IIS configuration I noticed the .Net 4 Application Pools weren’t there.  After a bunch of messing around with settings, I finally did a “Repair” install of Visual Studio 2012.  After this, the ASP.Net application pools were there and MDS ran fine.  My assumption is the problem was caused by the Web Server being disabled when the 4.5 .Net framework was installed the first time.  Not an earth shattering discovery but running into corporate security policies that disable web servers is pretty common so I hope this might save you an afternoon of tearing your hair out someday (yes, I’m officially blaming my shortage of hair on ASP.Net).

Sunday, August 11, 2013

MDS Source Updates



I ran into an interesting requirement on a recent MDS engagement.  The customer wanted to give a large number of users read-only access to the MDS data.  While they didn’t want most of the users to be able to update the Master Data, they realized that the users would frequently find issues with the Master Data.  They wanted the users to be able to suggest changes and corrections to the Master Data so the data could be fixed in the source system.

We decided to use permissions to make the attributes of the key master entities read-only while creating an updatable text attribute that users could use to report issues.  This worked well but we needed to inform the source system owners when an issue was reported so they could fix it quickly.  Our first attempt was to just create a business rule that fired when the change-request attribute was updated and used the normal notification mechanism to send an email to the data steward when a change-request field was populated.  This worked OK but the data steward was forced to click on the link to go to the MDS database to find out what the change-request text said.  In this customer’s environment data stewards didn’t necessarily have access to MDS so this was inconvenient.  To simplify the data steward’s life, we wrote a customer workflow class that was called when the change-request attribute   was updated.  The custom workflow made a web service call into MDS to retrieve the contents of the change-request attribute, composed an email with the change-request and other pertinent information and made a DBMail call to send the email to the data steward.  We still have some work to do to configure distribution and make the mail more attractive but it looks like this is a viable solution.

Friday, August 2, 2013

File Format Versioning



File versioning is another thing that I assume most people understand but I still run into a lot of confusion about.  This came up in one of the 24 Hours of PASS sessions I watched,  The question was something like “does the format of the data in a SQL Server file change when you do an upgrade or does SQL Server understand both the new and old format”?

While there might be exceptions I’m not aware of, there is only one file format that a particular version of SQL Server understands.  This means that when you upgrade a SQL Server file – upgrade in place by installing a new version, restore to a new version, attach to a newer version – the format of the data in the file is changed to match the new SQL Server version.  This is enforced to avoid implementing code that behaves differently depending on the version that a page of data was created on.  If the data in the file wasn’t upgraded when the database engine is upgraded then SQL Server 2012 would have to be able to handle at least 5 different page formats – SQL 7, SQL 2000, SQL 2005, SQL 2008, and SQL 2012.  This would make the code very fragile and difficult to test.  You would also see bugs that would depend on which version of the database a page was originally written by.  You could also run into issues where performance was different in SQL 2012 for a database created in SQL 2000 and a database created in SQL 2012.  So for all these reasons, not changing the format of the data files when SQL Server is upgrade would be a very bad thing.

This leads to several behaviors we’re all familiar with:

·         You can restore a backup made on an older version to a newer version of SQL Server but you can’t restore a newer backup to an older version.  SQL Server knows how to convert a page from the older format to the newer format but not the opposite.  Note that the compatibility level of a database does NOT affect the format of the database pages.  All database pages in a SQL Server 2012 instance use the 2012 format.

·         Log shipping and Database Mirroring can transfer data from an older database version to a newer version but not the other way round.  Again, the page upgrade is a one way transformation.

·         You can attach a SQL 2008 database to a SQL 2012 instance but once you do, you can’t go back.

·         You can only upgrade a database by two versions – 2005 to 2012 works but 2000 to 2012 doesn’t.  This was a choice Microsoft made to limit the number of upgrade routines they have to develop, maintain, and test.  Isn’t this pretty arbitrary?  Sure, but think about whether you would want the SQL Dev and Test teams working on the upgrade from SQL 7 to SQL 2014 or working on new features for SQL 2014.

The one-way upgrade is the reason rollback planning is such an important part of upgrade planning.  If you attach your database files to an instance of a newer version and something happens, you can’t go back just by attaching the files to the old level or backing up the new level database and restoring it to the old level.  You also can’t use log shipping or mirroring from the new instance to keep the databases in the older instance current.