本文发表在 rolia.net 枫下论坛根据你所讲的, 猜测T16与T12和T14的foreign key是CLL与CLLCODE. 如果对的话, CLL是T16的一个INDEX. 还有VID和 IID是T2, T12和T14上的INDEX. NUM可能是T16的INDEX或不是. 即使是, 这个INDEX也可能不起太大作用因为34 is a frequent value in T16.NUM.
第一个QUERY的第一层SUBQUERY "EXISTS(SELECT 1 FROM T16 WHERE (T16.NUM = 34)... " 可能造成在ACCESS T1, T2, T3, T4, T12和T14之前ACCESST16.这样T2, T12和T14的INDEX都不会被用上, 这是造成巨慢的原因.
第二个QUERY只有一层SUBQUERY. T16 和T12, T14在同一层. 因为T12和T14相对T16要小很多, 所以T2, T12和T14先被ACCESS.这样一来T12和T14的INDEX VID和 IID就会被用上.但因为T16.CLL IN (T14.CLLCODE, -1),造成T16的INDEX CLL不会被使用.但因为其它TABLE的INDEX被使用了,所以速度快很多.
在第二个QUERY上,当把T16.CLL IN (T14.CLLCODE, -1)该成T16.CLL =T14.CLLCODE,INDEX T16.CLL就会被用到.达到最佳效果.
如果-1是一定需要的话,你可以先做个QUERY SELECT 1 FROM T16 WHERE T16.NUM = 34 AND T16.CLL = -1.如果结果是空,就用优化后的QUERY. 如果不是空,就把T16从QUERY里去掉.更多精彩文章及讨论,请光临枫下论坛 rolia.net
第一个QUERY的第一层SUBQUERY "EXISTS(SELECT 1 FROM T16 WHERE (T16.NUM = 34)... " 可能造成在ACCESS T1, T2, T3, T4, T12和T14之前ACCESST16.这样T2, T12和T14的INDEX都不会被用上, 这是造成巨慢的原因.
第二个QUERY只有一层SUBQUERY. T16 和T12, T14在同一层. 因为T12和T14相对T16要小很多, 所以T2, T12和T14先被ACCESS.这样一来T12和T14的INDEX VID和 IID就会被用上.但因为T16.CLL IN (T14.CLLCODE, -1),造成T16的INDEX CLL不会被使用.但因为其它TABLE的INDEX被使用了,所以速度快很多.
在第二个QUERY上,当把T16.CLL IN (T14.CLLCODE, -1)该成T16.CLL =T14.CLLCODE,INDEX T16.CLL就会被用到.达到最佳效果.
如果-1是一定需要的话,你可以先做个QUERY SELECT 1 FROM T16 WHERE T16.NUM = 34 AND T16.CLL = -1.如果结果是空,就用优化后的QUERY. 如果不是空,就把T16从QUERY里去掉.更多精彩文章及讨论,请光临枫下论坛 rolia.net