我加入了两个表,每个表包含超过5000条记录。我用两种方法加入。在第一个查询中,我使用了JOIN关键字并在ON条件下给出了条件。 在第二个查询中,我只是在表之间使用了逗号运算符,并在WHERE子句中给出了连接条件。
哪一项在时间和成本方面会有效....?
当我查看执行计划时,第一次查询为TABLE SCAN花费了61%的成本,为HASH MATCH花费了38%(INNER JOIN)
第二个查询花费了69%的TABLE SCAN和31%的HASH MATCH(INNER JOIN)。
你能解释一下这个区别吗?
Iam假设第一个有效,因为表扫描成本较低。是不是......?
答案 0 :(得分:1)
TABLE SCAN意味着它必须读取表中的每一行。通常使用执行计划,您可以尽可能使用索引等来摆脱表扫描。表扫描通常是查询运行缓慢的主要原因。 (根据我的经验)
如果SQL运行的总时间与以前相比减少,则百分比减少只是一个改进
例如,如果使用稍微减少的TABLE SCAN的第一个查询花了20秒而不是10秒,那么它就不那么有用了。
当然,如果您希望优化查询,那么您可以应用许多方法来尝试和改进它。 (索引优化向导,创建索引(群集/非群集),查看执行计划 - 识别潜在的瓶颈等...)
SQL优化本身就是一种艺术形式
答案 1 :(得分:1)
听起来像我的查询计划在两种情况下都是相同的......因为你有两次表扫描和哈希匹配......
在您尝试比较这些百分比之前......让我用这个问题说明危险:
哪个更大
61% of 465
或强>
69% of 234
<强> ... 强>
在这种情况下,您可能会看到,234中的69%远远超过465的61%。它全部相对于查询的总成本。
只是比较百分比时要小心,因为你不知道在两种情况下对应于100%的实际值是多少......例如在第二种情况下,总执行成本可能会降低。
答案 2 :(得分:0)
定义'有效'。如果速度是您的目标,请选择“显示客户端统计信息”,至少运行两次查询(当然,在不同的查询窗口中),并评估结果。
答案 3 :(得分:0)
这两种技术在逻辑上是等价的 但是根据解析器的方式,可能会有非常不同的性能命中 计划查询。决定时你需要考虑两个关键因素 技术之间:
哪个版本会生成更优化的查询计划。
如果以后需要对代码进行改造,哪个更易于维护 合并更多连接(INNER或OUTER)表。