可以使用静态源代码分析器以循环复杂度来度量大多数编程语言中方法的复杂度。是否有类似的度量标准来衡量SQL查询的复杂性?
度量查询返回所花费的时间非常简单,但是如果我仅想能够量化查询的复杂程度怎么办?
[编辑/注释]尽管获得执行计划很有用,但在这种情况下,这不一定是我想要确定的。我不是在寻找服务器执行查询的难易程度,而是在寻找一种指标,该指标可以确定开发人员编写查询的难易程度以及包含缺陷的可能性。
[编辑/注释2]诚然,有时测量复杂度没有用,但有时也没有用。
软件复杂度的常用度量包括:循环复杂度(度量控制流的复杂程度)和霍尔斯特德复杂度(度量算术的复杂程度)。
SQL查询中的“控制流”与查询中的“和”和“或”运算符最相关。
“计算复杂性”与诸如SUM或隐式JOINS之类的运算符最相关。
一旦决定了如何对SQL查询的语法的每个单位进行分类,以决定它是“控制流”还是“计算”,就可以直接计算出Cyclomatic或Halstead度量。
我 认为 SQL优化器对查询所做的操作绝对不相关。复杂性度量的目的是表征一个人理解查询的难易程度,而不是其评估效率。
同样,DDL所说的内容或是否涉及视图不应该包含在这种复杂性度量中。这些度量标准背后的假设是,仅当调用抽象时,二手抽象内部的机器复杂性就不会引起人们的兴趣,因为大概抽象可以使编码人员很好地理解某些事情。这就是为什么Halstead和Cyclomatic度量在其计数中不包括被称为子例程的原因,我认为您可以很好地证明视图和DDL信息是那些“调用”的抽象概念。
最后,只要这些复杂度数字反映了有关复杂度的真相,并且您可以相互比较它们,那么这些复杂度数字到底有多正确或有多错都无关紧要。这样,您可以选择最复杂的SQL片段,对它们进行排序,然后将测试重点放在最复杂的SQL片段上。