这需要 0.001 秒来执行,它使用索引查找
SELECT * FROM CUSTOMER WHERE ID IN (1008,1122)
现在我有一个存储过程 U_VIP,它返回与示例一相同的 ID (1008,1122),执行只需 0.001 秒
SELECT ID FROM U_VIP //returns (1008,1122)
现在当我组合它们时,执行大约需要半秒并且不使用索引
SELECT * FROM CUSTOMER WHERE ID IN (SELECT ID FROM U_VIP)
我已经简化了上面的例子,在实际应用中,性能受到更高幅度的影响。在这种情况下如何强制 Firebird 使用索引?
**使用火鸟 2.1
** 编辑 **
根据 Mark 的回答,使用 JOIN 确实可以提高执行时间,因为它现在正在进行索引查找。
SELECT CUSTOMER.*
FROM CUSTOMER
INNER JOIN U_VIP ON U_VIP.ID = CUSTOMER.ID
这很好,但是,它给我带来了另一个问题,我将在下面的示例中尝试解释。
SELECT CUSTOMER.*
FROM CUSTOMER
WHERE (:AREAID = 0 OR ID IN (SELECT ID FROM U_VIP(:AREAID)))
使用 where 子句,我可以根据用户是否提供 :AREAID 有条件地应用过滤器。当我用连接替换 where 子句时,如何实现相同的效果?
就像是:
SELECT CUSTOMER.*
FROM CUSTOMER
{IF :AREAID > 0 THEN}
INNER JOIN (SELECT ID FROM U_VIP(:AREAID)) VIP ON VIP.ID = CUSTOMER.ID
{END IF}
当然,Firebird 不喜欢带大括号的部分 =/