选择 * 比选择列更快

Dan*_*elg 3 sql t-sql

WITH Categories (child_oid, Level) AS ( 
   SELECT h.child_oid, 
          0 AS Level 
     FROM Memx_productcatalog.dbo.ME_CatalogHierarchy AS h 
     JOIN dbo.[ME_CatalogProducts] c on h.oid = c.oid 
    WHERE c.CategoryName = 'Root' 
   UNION ALL 
   SELECT h.child_oid, 
          Level + 1 
     FROM dbo.ME_CatalogHierarchy AS h 
     JOIN Categories AS p ON p.child_oid = h.oid ) --End CTE Recursive
SELECT p.oid --problem here
  FROM dbo.ME_CatalogProducts as p
 WHERE p.oid IN (SELECT child_oid 
                   FROM Categories)
Run Code Online (Sandbox Code Playgroud)

我正在编写一个递归 CTE SQL 语句来从树中提取项目。查询工作正常。当我选择特定列时,查询将在大约 300 毫秒内执行。但是,当我使用select *or时p.*,查询执行时间不到 100 毫秒。这与我的预期完全相反。我检查了索引、统计信息,两个查询似乎生成了相同的执行计划。我被这个难住了。

更新

我一整天都在运行这个查询,结果一致。我尝试使用选项(重新编译)来禁用缓存。我刚刚在 sql 管理器中使用“服务器回复的等待时间”来测量查询执行情况(这很糟糕吗?)这是当我使用 SET STATISTICS TIME ON 时发生的情况。

p.oid => SQL Server 执行时间:CPU 时间 = 203 毫秒,运行时间 = 270 毫秒。“等待时间”= 195ms

p.* => SQL Server 执行时间:CPU 时间 = 469 毫秒,运行时间 = 1015 毫秒。“等待时间”= 21ms

如果需要的话我还有其他统计数据。客户等待时间是衡量这些事情的错误方法吗?

Dan*_*elg 5

事实证明,使用 MS SQL 管理器来测量执行时间是非常不可靠的。感谢 Martin 使用 SET STATISTICS TIME ON 给了我更准确的结果。

当正确测量时,执行 SELECT * 实际上比执行列选择慢得多