SQL查询按代码或代号?,哪个应该更优化?

时间:2014-06-06 06:33:11

标签: dynamics-crm-2011

我正在查看使用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')

我最初的想法:

  1. 代号通常来自StringMap表和代码 驻留在基表中。所以如果我过滤它应该更快 通过代码查询。看看上面的三个问题,我会的 认为按字符串查询会更慢。 但结果显示不然。结果显示查询#3是3
  2. 中最快的
  3. 由于它查询相同的视图,因此不应该在资源使用方面表现出巨大的差异。 我再次错了。与查询#1和#3
  4. 相比,查询#3减少了50%以上

    根据" Est子树成本"

    的3个查询的结果
    1. 查询#1:Est Subtree费用:0.325311
    2. 查询#2:Est Subtree费用:0.325311
    3. 查询#3:Est子树成本:0.190786
    4. 任何人都可以解释为什么它会以这种方式运作?

1 个答案:

答案 0 :(得分:1)

首先,在性能比较方面,我总是参考Eric Lippert的优秀Which is Faster?博客。

我相信您错误地查看了测试结果。由于您实际上并未进行测试而是估算,因此显示的成本占整个查询的百分比。它不能直接与另一估计的百分比成本进行比较。

例如,假设成本单位是所需CPU的百分比。我们还假设,因为它们不那么复杂,所以查询#1&查询#2仅需要100个CPU周期,但查询3需要1000个CPU周期。如果我们将百分比的数学应用到这个结果:

  1. 查询1:33周期
  2. 查询2:33周期
  3. 查询3:190周期
  4. 即使查询3的百分比较小,也需要更多的实际资源。

    我也会猜测性能差异完全可以忽略不计,因此您应该考虑其他问题,如可读性/可维护性。

    WHERE statecodename IN ('Completed', 'Scheduled')肯定更具可读性,但可维护性更低(如果有人将文本值更改为“完成”和“计划”,会怎么样?因此我建议这样做:

    WHERE statecodename IN (1, 3) -- ('Completed', 'Scheduled')
    

    停止先发制人地担心表现。

      

    “程序员浪费了大量的时间来思考或担心程序中非关键部分的速度,而这些效率尝试实际上在考虑调试和维护时会产生很大的负面影响。我们应该忘记效率低下大约97%的时间说:过早的优化是所有邪恶的根源。然而,我们不应该在那个关键的3%中放弃我们的机会。“ - 唐纳德克努特