Dada una combinación simple de tres tablas, el rendimiento de la consulta cambia drásticamente cuando ORDER BY se incluye incluso sin que se devuelvan filas. El escenario del problema real tarda 30 segundos en devolver filas cero, pero es instantáneo cuando ORDER BY no está incluido. ¿Por qué?
SELECT * 
FROM tinytable t                          /* one narrow row */
JOIN smalltable s on t.id=s.tinyId        /* one narrow row */
JOIN bigtable b on b.smallGuidId=s.GuidId /* a million narrow rows */
WHERE t.foreignId=3                       /* doesn't match */
ORDER BY b.CreatedUtc          /* try with and without this ORDER BY */Entiendo que podría tener un índice en bigtable.smallGuidId, pero creo que en realidad lo empeoraría en este caso.
Aquí está la secuencia de comandos para crear / llenar las tablas para la prueba. Curiosamente, parece importar que smalltable tenga un campo nvarchar (max). También parece importar que me una a la tabla grande con un guid (lo que supongo que hace que quiera usar la coincidencia de hash).
CREATE TABLE tinytable
  (
     id        INT PRIMARY KEY IDENTITY(1, 1),
     foreignId INT NOT NULL
  )
CREATE TABLE smalltable
  (
     id     INT PRIMARY KEY IDENTITY(1, 1),
     GuidId UNIQUEIDENTIFIER NOT NULL DEFAULT NEWID(),
     tinyId INT NOT NULL,
     Magic  NVARCHAR(max) NOT NULL DEFAULT ''
  )
CREATE TABLE bigtable
  (
     id          INT PRIMARY KEY IDENTITY(1, 1),
     CreatedUtc  DATETIME NOT NULL DEFAULT GETUTCDATE(),
     smallGuidId UNIQUEIDENTIFIER NOT NULL
  )
INSERT tinytable
       (foreignId)
VALUES(7)
INSERT smalltable
       (tinyId)
VALUES(1)
-- make a million rows 
DECLARE @i INT;
SET @i=20;
INSERT bigtable
       (smallGuidId)
SELECT GuidId
FROM   smalltable;
WHILE @i > 0
  BEGIN
      INSERT bigtable
             (smallGuidId)
      SELECT smallGuidId
      FROM   bigtable;
      SET @i=@i - 1;
  END He probado en SQL 2005, 2008 y 2008R2 con los mismos resultados.
fuente




