我想知道这样的查询
SELECT * FROM A WHERE A.created_by = 1 AND (A.name LIKE %app% OR A.description LIKE %app%)
正在处理中。我不认为这是一个有效的查询,但我认为这个想法很清楚。
从我的角度来看,我不确定Server是否通过该条件处理每一行并检查它是否传递它,然后返回传递条件的所有行,或者Server是否为每个条件收集数据集,然后交叉/组合它们以获得最终数据集(就像created_by收集后来与其他两个条件所收集的组合数据集交叉的数据集),还是使用其他更抽象的方法(至少对我来说)。
我希望我的问题足够具体。如果我不清楚,请进一步解释,我会提供。
发布于 2017-09-22 15:43:40
SQL中不保证评估顺序,这取决于RDBMS的实现。
6.3.3.3规则评估令 ..。 如果优先级不是由格式或括号决定的,则表达式的有效计算通常从左到右执行。但是,表达式的实现取决于表达式是否实际从左到右计算,特别是当操作数或运算符可能导致条件产生时,或者如果表达式的结果可以确定而不完全计算表达式的所有部分。
来自here
通常,RDBMS将尽可能地优化查询,并产生最好的结果--最终可能会重新排序您的查询。索引可以发挥巨大的作用。如果您在WHERE子句中使用索引字段,则无论它写在WHERE子句中的位置如何,这都可能是第一次评估的约束之一,因为通过计算索引列获得的速度优势。
如果您对如何处理该查询更感兴趣,则可以检查RDBMS是否提供了显示查询执行计划的选项。在这里,您通常可以看到子句的计算顺序。
发布于 2017-09-22 15:50:19
即使对于相同的SQL查询,SQL服务器也可以并且将使用不同的策略。
SQL server查看使用了哪些条件/联接/选定字段,并查看所涉及的表、索引等,以决定要做什么。
例如。如果有按正确顺序使用所有字段的聚集索引,则Server将不会触及原始表,而只会从索引中读取数据。
要知道查询的是哪一种情况,您只能请求真正的执行计划。你可以在管理工作室找到。它是一个按钮,当激活该按钮时,SQL server不仅会返回查询的任何结果,而且还会返回包含SQL server在执行该查询时使用的所有算法的执行计划。
例如,Server中的PS必须遍历表中的所有行,因为字符串搜索在开始时带有通配符,'%...无法进行优化。
https://stackoverflow.com/questions/46368251
复制相似问题