Category: Blog

  • Moving to Serverless for Azure SQL DB

    After the announcement of Serveless Azure SQL Datbase at //build/, I decided to give it a try. I have some Basic databases, so what would Serverless mean for me? I was wondering as the Basic dbs are cheap and moving to Serverless means moving to Gen 5, larger machines.

    Let’s try this.

    Reconfigure an Existing Database

    I’ll pick one of the basic test databases I have and look for the sizing. It’s under Configure, which is where my mouse it in the image below.

    2019-05-06 16_07_02-SQLPatches - Microsoft Azure

    Here’s my database config and cost. For my little dev/test environment, this makes perfect sense. I’m paying $4.99 a month in virtual cost. Since I get $150/month as part of my subscription as an MVP, I can afford to put up 5 or 6 of these test databases for different things without worry.

    2019-05-06 16_07_36-Configure - Microsoft Azure

    After I click the vCore pricing, I get new options. I can see Serverless in here.

    2019-05-06 16_07_49-Configure - Microsoft Azure

    For dev/test (for me), that’s a lot. I don’t want this kind of bill every month.

    2019-05-06 16_07_58-Configure - Microsoft Azure

    Let’s change to serverless.

    2019-05-06 16_08_14-Configure - Microsoft Azure

    That cost changes

    2019-05-06 16_08_19-Configure - Microsoft Azure

    That’s more affordable. I think that’s worth trying.

    The last thing to set is the Auto-pause delay. This is the amount of inactive time that we set before the db shuts down. We don’t want this shutting down after a few seconds of inactivity, presumably because there is overhead to shutting down and restarting. I’d expect that most people would want tens of minutes or hours before stopping.

    I hope so, because when you scroll down, you see this:

    2019-05-06 16_11_49-Configure - Microsoft Azure

    However, that’s the minimum you can set.

    2019-05-06 16_02_12-Configure - Microsoft Azure

    Six hours seems crazy, but still, it’s better than nothing. I hope this changes after the preview period to something more like 1 hour. Perhaps this is to gather additional telemetry during preview, but we’ll see.

    I click “Apply” and see this:

    2019-05-06 16_15_53-Configure - Microsoft Azure

    If I go back to the overview, I see one of the cool things about Azure.

    2019-05-06 16_16_37-SQLPatches - Microsoft Azure

    I can still use the system as I’m making changes. That’s not normally what happens with IaaS or my own systems.

    Is It Worth it?

    We’ll see. I’ll check the bill next month, while making it a point to access this database and do some work. I’m guessing my bill will go down, which is good, but I’d also expect that this database will perform better than my previous one because it’s much larger.

    This is an interesting idea, but we’ll see how it goes.

  • Puzzles–T-SQL Tuesday #114

    This month we have a very interesting topic from Matthew McGiffen. He gets back to the roots of the party with code by asking a question on puzzles. It’s a good question, and one that makes me think. I’m not a big puzzler, but I think I’ve solved a few.

    Interesting Challenges

    One of the things we’ve tried to do at SQLServerCental is come up with some ways to inspire you. We have articles, numerous questions to be answered, our Question of the Day, Crosswords, and more. I’d like to do more, but one thing I’ve found is that puzzles take a lot of time.

    I have enjoyed some of the puzzles from the Advent of Code and Project Euler, which are good programming exercises. I’ve used Python and PowerShell to solve some of these, mostly to practice skills in building algorithms and implementing them.

    Solving a Puzzle

    One of the puzzles that I enjoyed solving was from the Advent of Code 2015, Day 2. This was a surface area problem, and one that reminded me of math class in high school. I always did enjoy that subject.

    In any case, I solved the issue by loading some data into a table and then digging in with a  few CTEs to

    Might not be the best solution, but it was one I enjoyed working out:

    ---- create table

    --create table Day2_WrappingPresents

    --(

    -- dimensions varchar(100)

    --)

    --go

    ---- load data

    --bulk insert Day2_WrappingPresents

    -- from 'C:\Users\Steve\Documents\GitHub\AdventofCode\Day 2 - Wrapping\input.txt'

    --go

    ---- check

    ---- select * from Day2_WrappingPresents

    --go

    -- break this down to get the dimensions

    with cteSplit (d, el, sw, sh)

    as

    (

    select

    dimensions

    , endlength = charindex('x', dimensions) - 1

    , startwidth = charindex('x', substring(dimensions, charindex('x', dimensions),20)) + charindex('x', dimensions)

    , startheight = len(dimensions) - charindex('x', reverse(dimensions)) + 2

    -- , c1 = charindex('x', dimensions)

    -- , c2 = charindex('x', dimensions, charindex('x', dimensions)+1) -

    from day2_wrappingpresents d

    )

    , cteDimensions

    as

    (select

    d

    , l = cast(substring(d, 1, el) as int)

    , w = cast(substring(d, sw, sh-sw-1) as int)

    , h = cast(substring(d, sh, len(d)) as int)

    from cteSplit d

    )

    , cteOrder

    as

    ( select

    d

    , small = case

    when l <= w and l <= h then l

    when w <= l and w <= h then w

    when h <= l and h <= w then h

    end

    , middle = case

    when (l >= w and l <= h) or (l <= w and l >= h) then l

    when (w >= l and w <= h) or (w <= l and w >= h) then w

    when (h >= l and h <= w) or (h <= l and h >= w) then h

    end

    , large = case

    when l >= w and l >= h then l

    when w >= l and w >= h then w

    when h >= l and h >= w then h

    end

    from cteDimensions

    )

    , cteFinal

    as

    (

    select

    d

    , area = (2 * small * middle) +

    (2 * small * large) +

         (2 * middle * large)

    , slack = (small * middle)

    from cteOrder

    )

    select

    sum(area + slack)

    from cteFinal

    -- drop table Day2_WrappingPresents


  • A Clean Values Clause with SQL Prompt

    I’ve had this code in a snippet for a long time:

    2019-04-25 12_33_20-00_endtoend_initialsetup.sql - 192.168.1.35.sandbox (sa (60))_ - Microsoft SQL S

    I appreciate the markup to prevent SQL Prompt from doing this, which used to always happen.

    2019-04-25 12_34_33-00_endtoend_initialsetup.sql - 192.168.1.35.sandbox (sa (60))_ - Microsoft SQL S

    I can’t tell you how many times I’ve used CTRL+Z to undo that format, add the markup, and format again.

    A few months back. I was talking with someone and noticed this:

    2019-04-25 12_35_32-SQL Prompt - Formatting styles

    A new option for formatting called “INSERT”. This allows you to specify how you want to insert column list to appear. What’s even better, is at the bottom it says “Values”. Scroll down and you see options for separately formatting the VALUES clause, which I use all the time.

    2019-04-25 12_35_39-SQL Prompt - Formatting styles

    Now I can format easily without worrying my VALUES clause will get spread all over the page.

    2019-04-25 12_37_14-00_endtoend_initialsetup.sql - 192.168.1.35.sandbox (sa (60))_ - Microsoft SQL S

    SQL Prompt is amazing. If you haven’t given it a try, download an eval today. If you have the Toolbelt, you ought to be using this every day.

  • Always Use Roles–#SQLNewBlogger

    Another post for me that is simple and hopefully serves as an example for people trying to get blogging as #SQLNewBloggers.

    Which of these is more complex?

    GRANT SELECT ON dbo.Customer TO JoeDev

    or

    CREATE ROLE Sales
    GRANT SELECT ON dbo.Customer to Sales
    ALTER ROLE Sales ADD MEMBER JoeDev

    The second one, right? What if I change this slightly. I have this code:

    GRANT SELECT, INSERT, UPDATE ON dbo.Customer TO JoeDev
    GRANT SELECT, INSERT, UPDATE ON dbo.Customer TO SallyDev
    GRANT SELECT, INSERT, UPDATE ON dbo.Customer TO SaraDBA

    or

    GRANT SELECT, INSERT, UPDATE ON dbo.Customer TO Sales
    ALTER ROLE Sales ADD MEMBER JoeDev
    ALTER ROLE Sales ADD MEMBER SallyDev
    ALTER ROLE Sales ADD MEMBER SaraDBA

    What if I changed this slighly and told you that between the GRANTs to users, a few months of time had passed and you had to go figure out which rights JoeDev had because the request was “give Sally the same access as Joe.”

    That’s the type of thing I’ve done often as a DBA. I’ve often had to move permissions between users, duplicate the access, or quickly remove lots of access from multiple users.
    While it seems like there are just two extra statements using roles, there is often lots of time tracking down security and building statements to duplicate rights.

    Always use roles and your life will be easier.

    Plus you can script the permissions for objects once, log them, and forget about them. From that point forward you’re just adding/dropping users from roles.