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
如果需要的话我还有其他统计数据。客户等待时间是衡量这些事情的错误方法吗?
事实证明,使用 MS SQL 管理器来测量执行时间是非常不可靠的。感谢 Martin 使用 SET STATISTICS TIME ON 给了我更准确的结果。
当正确测量时,执行 SELECT * 实际上比执行列选择慢得多
| 归档时间: |
|
| 查看次数: |
2958 次 |
| 最近记录: |