我有一个由几个表联接组成的sql查询,并以对NULL条件进行检查的WHERE子句结尾。查询如下:-
查询1
Select * from TableA ta INNER JOIN TableB tb ON ta.id = tb.id
LEFT OUTER JOIN TableC tc ON ta.id = tc.txn_id
LEFT OUTER JOIN TableD td ON tc.sr_no = td.sr_id
LEFT OUTER JOIN TableE te ON te.name = td.name
WHERE tc.status IS NOT NULL
上面的查询工作非常缓慢,但是使用IFNULL条件稍微重新构架查询可以解决此问题。上面的查询稍作修改如下:-
查询2
Select * from TableA ta INNER JOIN TableB tb ON ta.id = tb.id
LEFT OUTER JOIN TableC tc ON ta.id = tc.txn_id
LEFT OUTER JOIN TableD td ON tc.sr_no = td.sr_id
LEFT OUTER JOIN TableE te ON te.name = td.name
WHERE IFNULL(tc.status,'') <>''
我的问题是:-
1)为什么查询1花费太多时间,而查询2却很快给出结果?
2)通过使用Restrictions.isNotNull(“ aliasName.colName”),根据休眠的限制条件创建查询1。那么是否有一种方法可以通过休眠限制来应用非空的相同条件,但是没有isNull方法呢? (以便最终生成查询2)
3)在同一查询中,如果我删除NOT条件,则可以正常工作。那么为什么IS NULL条件工作得很好,而IS NOT NULL却花费了太多时间才能得出结果,即IS NULL和IS NOT NULL的行为为何如此不同?
P.S。我在JOIN /条件检查中使用的所有列上使用索引。而且我正在使用mariaDB,它与mySQL非常相似。
我们非常感谢您的帮助!