给定一个简单的三表联接,即使没有返回任何行,当包含ORDER BY时,查询性能也会发生巨大变化。实际问题场景需要30秒才能返回零行,但是当不包括ORDER BY时即刻发生。为什么?
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 */
我知道我可以在bigtable.smallGuidId上建立索引,但是,我认为在这种情况下,实际上会使情况更糟。
这是创建/填充表进行测试的脚本。奇怪的是,smalltable具有nvarchar(max)字段似乎很重要。我正在使用guid加入bigtable似乎也很重要(我猜想它希望使用哈希匹配)。
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 
我已经在SQL 2005、2008和2008R2上测试了相同的结果。



