我正在编写这个复杂的查询来返回一个大数据集,大约有 100,000 条记录。查询运行良好,直到我将此 OR 语句添加到 WHERE 子句:
AND(responses.StrategyFk = strategy.Id 或responses.StrategyFk 为空)
现在我明白了,将 or 语句放在那里会增加很多开销。
没有那个声明,只是:
AND 响应.StrategyFk = strategy.Id
查询在 15 秒内运行,但不返回任何没有 fk 链接策略的记录。
虽然我也想要这些记录。有没有更简单的方法可以使用简单的 where 语句来查找这两个记录?我不能只为空记录添加另一个 AND 语句,因为这会破坏前面的语句。有点不确定从这里去哪里。
这是我查询的下半部分。
FROM
responses, subtestinstances, students, schools, items,
strategies, subtests
WHERE
subtestinstances.Id = responses.SubtestInstanceFk
AND subtestinstances.StudentFk = students.Id
AND students.SchoolFk = schools.Id
AND responses.ItemFk = items.Id
AND (responses.StrategyFk = strategies.Id Or responses.StrategyFk IS Null)
AND subtests.Id = subtestinstances.SubtestFk