我正在查看使用SQL查询编写的报告,看看当我突然想知道我是否可以进一步优化我的代码。
"如果我按代码而不是代号进行过滤,系统会更快吗?"
查询#1:
SELECT owneridname, scheduledstart
FROM dbo.FilteredAppointment
WHERE statecode IN (1, 3)
查询#2:
SELECT owneridname, scheduledstart
FROM dbo.FilteredAppointment
WHERE statecode IN ('1', '3')
查询#3:
SELECT owneridname, scheduledstart
FROM dbo.FilteredAppointment
WHERE statecodename IN ('Completed', 'Scheduled')
我最初的想法:
根据" Est子树成本"
的3个查询的结果任何人都可以解释为什么它会以这种方式运作?
答案 0 :(得分:1)
首先,在性能比较方面,我总是参考Eric Lippert的优秀Which is Faster?博客。
我相信您错误地查看了测试结果。由于您实际上并未进行测试而是估算,因此显示的成本占整个查询的百分比。它不能直接与另一估计的百分比成本进行比较。
例如,假设成本单位是所需CPU的百分比。我们还假设,因为它们不那么复杂,所以查询#1&查询#2仅需要100个CPU周期,但查询3需要1000个CPU周期。如果我们将百分比的数学应用到这个结果:
即使查询3的百分比较小,也需要更多的实际资源。
我也会猜测性能差异完全可以忽略不计,因此您应该考虑其他问题,如可读性/可维护性。
WHERE statecodename IN ('Completed', 'Scheduled')
肯定更具可读性,但可维护性更低(如果有人将文本值更改为“完成”和“计划”,会怎么样?因此我建议这样做:
WHERE statecodename IN (1, 3) -- ('Completed', 'Scheduled')
停止先发制人地担心表现。
“程序员浪费了大量的时间来思考或担心程序中非关键部分的速度,而这些效率尝试实际上在考虑调试和维护时会产生很大的负面影响。我们应该忘记效率低下大约97%的时间说:过早的优化是所有邪恶的根源。然而,我们不应该在那个关键的3%中放弃我们的机会。“ - 唐纳德克努特