Tag: syndicated

  • Setting Expectations–T-SQL Testing

    I don’t know who started this pattern, as I’ve seen it in a few places. It could have been Sebastian Meine or Dennis Lloyd. Maybe it was Dave Green, who did the Pluralsight course on tSQLt. Not sure, but I like it.

    If I’m looking to set up a test against a table called Customers in my database, in the Assemble section of the test, I’ll create this table:

    create table Customers.Expected
    ( CustomerID int
    , CustomerName varchar(200)
    ...
    , Status int
    )

    This would match the exact structure of the Customers table, or at least have the structure I’m testing. If I’m only testing a part of the table, I might not use all the fields.

    However this lets me easily determine what this table is. It’s my expected result set.

  • 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.

  • Off to London

    Today I’m off across the Atlantic again. SQL in the City 2014 kicks off in London and I have 3 talks to give on Friday. Plus a keynote.

    Today is keynote practice, last minute packing, and then off to the airport for my flight overnight to London. This will be another quick trip, and although I think it would be good to spend a few days in Cambridge at the Red Gate offices, I’m so focused on SQL in the City, as well as this being my third trip this month, I didn’t think it made sense. I still have a week in Seattle coming, so this has been a tough time.

    I am a bit excited about the event. We have a new venue, and we’ve worked to fit a number of talks together in a sequence that I think can help get people moving forward in a Continuous Delivery software+database development process. I really think this is the way to build better software, and I want to see us jumpstart development on SSC in this manner in 2015, and hopefully get continuous work being done.

    I’ve also got a new talk based on the DBA Team articles, and I hope everyone likes it. I tried for a bit of humor, so we’ll see. If it does well, I’ll do it in Seattle. If not, I’ll be reworking things next week.

    Once again work blends into the weekend, though not by much. I’ll be heading back from the UK Saturday morning, so I’ll miss a half day in Denver, though it will be a long day in all for me. My flight will leave around 1am Denver time, so by the time we hit Saturday night, I’ll be a bit worn out.