Category: Blog

  • Packing for Seattle

    This will be a long trip, and I’ve got some extra items to pack. A new hat

    argenis

    and, of course, my leggings for the Argenis Without Borders campaign (you can still donate).

    41U2h4mV8uL

    No, those aren’t my legs, and you’ll have to wait for pictures next week with me wearing these things.

    This is going to be an interesting trip. It’s 6 days for me, which is something I’ve done with one bag, but I’ve got to manage a few extra items, including some Red Gate swag and get the rainbow stuff, the kilt, and more ready. This might be one of those times I need to actually check a bag, though I’m going to try and avoid it.

    Maybe I’ll pack less and do some laundry, especially for workout clothes. 6 days of running gear won’t be pleasant to pack after it’s been used.

  • Quick Schema Auditing

    I was working on a demo recently and needed to show that a little monitoring can help you catch schema changes. At first I looked at SQL Audit and DDL Triggers, but then I ran across a short custom metric on the SQL Monitor Metrics site that my company, Red Gate Software, put up to help people share their custom monitoring metrics and alerts.

    The metric is called Schema Modified, and it uses a really simple query. This is all is does:

    SELECT DATEDIFF(ss, '1970', MAX([modify_date]))
     FROM [sys].[objects];

    It calls this query every minute for each database on which you have it enabled. This gives you a count of the number of seconds between 1970 and the latest schema modification in your database.

    Now that’s not terribly useful, but if you look for changes in this metric, then it becomes interesting. For example, in one of my tests, I got this value

    1413904788

    If I continued to run the query,  the same value was returned if nothing changed in the database. However once I added a new object, then the value changed to

    1413905295

    That’s an increase, and my alerting was looking for changes in the value, so when this new count of seconds appeared, an alert was raised.

    Using the Information

    What good does it do you to know that something changed? Admittedly, this may or may not be useful. This doesn’t tell you what changed, and certainly help you determine who changed things.

    However, in more than a few of my development jobs, we knew people would change things. That wasn’t the issue. Really we wanted to know that something changed, and if so, we would investigate further. Often we could easily determine who made the change, based on what it was.

    This is really a trigger more for something like production, where I don’t expect changes, except when I deploy things. Any other change is cause for concern, and I might have alerts set to ping people when there’s a change. If we’re making the change, then we ignore the alert, because we’re aware of it.

    If we aren’t deploying changes, then we start investigating immediately.

  • Default Framing–Window Functions

    I’ve been playing with the window functions in T-SQL a bit, and I find them very interesting. They certainly solve some problems very well, in a way that’s much easier than has been available in T-SQL.

    However there are some things you need to understand. One of these things is the framing of the window, and the data processed. A quick example will show some of this.

    Imagine that I create a table and insert some data:

    CREATE TABLE HomeRuns
    ( hrid INT IDENTITY(1,1)
    , player VARCHAR(200)
    , team VARCHAR(200)
    , hrdate DATE
    , HRcount TINYINT
    CONSTRAINT hr_IDX PRIMARY KEY (hrid)
    );
    GO

    We add a few row, which I’ll keep short.

    INSERT HomeRuns (player, team, hrdate, HRcount)
     VALUES ('Troy', 'COL', '4/7/2013', 1)
          , ('Troy', 'COL', '4/18/2013', 1)
          , ('Troy', 'COL', '4/22/2013', 1)
          , ('Derek', 'NYY', '5/7/2013', 1)
          , ('Derek', 'NYY', '6/24/2013', 1)
          , ('Nelson', 'BAL', '3/31/2013', 1)
          , ('Nelson', 'BAL', '4/2/2013', 1)
          , ('Nelson', 'BAL', '4/20/2013', 1)
          , ('Lonnie', 'CLE', '5/9/2013', 3)
    ;
    GO

    This is a small set of data. Let’s imagine that I want to count the total home runs by team in each month. If I try to do this with windowing, I’ll get something like this:

    select 
      team
      , datename( mm, hrdate)
      , HR.hrdate
      , sum(HR.HRcount) over (partition by month(HR.hrdate), team)
     from dbo.HomeRuns HR

    When I run that, I see all the rows returned, which isn’t what we expect from aggregates. However it’s also not any kind or running total or examination of the data in a row by row processing that many window functions perform.

    That’s not completely accurate, but it’s a feeling many people get when starting with these structures. However the results highlight something. Let’s look at them:

    window_1

    We can see that for April, for Baltimore, we see 2 rows, with a total of 2 for each row. There was one home run hit on each day, and the total is 2, but both rows are processed as one window.

    Why?

    That’s because the framing, the section of the partition that’s examined by the window aggregate, is the “”RANGE” of the partition by default. The entire partition, so all rows in front of, and behind, the current row, are used for the results.

    This is a simple example, but it does show that you need to be aware of the default, which I don’t love. I wish the default were ROWS, and I’ll talk about that another time.

  • Avoiding a DBA’s Worst Days with Monitoring

    SQL in the City Abstract: When things go wrong with a database, it can be the start of the worst day of a DBA’s life. Join Steve Jones as he examines the problems uncovered by The DBA Team and how you can prevent them with proactive monitoring and in-depth knowledge of SQL Server.

    General Abstract: A DBA usually has a bad day because they are unprepared for issues that commonly occur or unaware of situations that can cause problems. Learn about the five things Steve Jones finds to be most important for DBAs and how you can be ready to handle issues in these areas:

    • Backups
    • Space
    • Security
    • Resources
    • Deployment

    This session does include Red Gate tools but explains how issues can be avoided with your own utilities.

    Slides: DBAsWorstDays.pptx

    Placeholder resources:

    Custom Metrics used in the demo: