我正在编写一个存储过程,其功能是获取一些参数(由最终用户填充)并执行搜索。但是,如果参数没有值,则不应将其包含在 WHERE 子句中。为此,我将参数作为 OR 子句的第一部分进行检查,如下所示:
... WHERE (param1 = '' OR field1 = param1) AND (param2 = '' OR field2 = param2) ...
然后我将其合并到一个一般的选择语句中,如下所示:
SELECT *
FROM table1 t1
WHERE (param1 = '' OR t1.field1 = param1)
请注意,为清楚起见,我在此示例中仅包含了一个参数。真正的查询包含多个参数和字段比较。
这工作正常并且运行迅速(例如,“真实”查询在大约 0.5 秒内返回结果)。
到现在为止还挺好。然而,当引入一个连接表时,事情就开始出错了。例如,如果我执行下面的查询,则需要更长的时间(实际查询需要 3-4 秒):
SELECT *
FROM table1 t1
LEFT JOIN table2 t2
ON t1.table2Id = t2.id
WHERE (param1 = '' OR t2.field1 = param1)
请注意,该参数现在正在与连接表 (table2) 中的字段进行比较。
请注意,在这两个示例中,在运行查询时,我确保 param1 填充了一个值。
现在,如果我删除param1 = '' OR
上述 WHERE 子句的部分,它的运行速度与之前的未连接查询一样快。
尽管我已经尝试过,但我的表中使用的所有字段目前都没有被索引,这对我遇到的问题没有任何影响。
那么,谁能向我解释为什么第一个查询(单个表)工作得很快,但第二个查询(连接表)花费的时间不成比例?
提前谢谢了。