• opc.three (3/1/2013)


    @Gail, In thinking about this a little more, I think the example I gave is just a roundabout way of asking for TOP 1 without an ORDER BY, which I say is nonsensical.

    Or a TOP 1 (without specifying WITH TIES) where the column you're ordering by has duplicate values

    USE tempdb;

    CREATE TABLE dbo.test

    (

    name VARCHAR(100),

    type_desc VARCHAR(100)

    );

    INSERT INTO dbo.test

    ( name, type_desc)

    VALUES ( 'xyz', 'user');

    INSERT INTO dbo.test

    ( name, type_desc)

    VALUES ( 'abc', 'user');

    CREATE CLUSTERED INDEX [cx] ON dbo.test (name);

    GO

    ------------------------------------------------------------------------------

    SELECT TOP 1

    name,

    type_desc

    FROM dbo.test

    WHERE type_desc = 'user'

    ORDER BY type_desc;

    GO

    -- add nc index to change support for filter and order

    CREATE NONCLUSTERED INDEX [ix] ON dbo.test (type_desc, name desc);

    -- same query as above

    SELECT TOP 1

    name,

    type_desc

    FROM dbo.test

    WHERE type_desc = 'user'

    ORDER BY type_desc;

    DROP TABLE dbo.test;

    Moral of the story, be careful when ordering by a non-unique column and then restricting the rows based on that ordering (via row_number, rank, etc or top)

    Gail Shaw
    Microsoft Certified Master: SQL Server, MVP, M.Sc (Comp Sci)
    SQL In The Wild: Discussions on DB performance with occasional diversions into recoverability

    We walk in the dark places no others will enter
    We stand on the bridge and no one may pass