これは実行に 0.001 秒かかり、インデックス シークを使用します。
SELECT * FROM CUSTOMER WHERE ID IN (1008,1122)
これで、例 1 (1008,1122) と同じ ID を返すストアド プロシージャ U_VIP があり、実行に 0.001 秒しかかかりません。
SELECT ID FROM U_VIP //returns (1008,1122)
それらを組み合わせると、実行に約0.5秒かかり、インデックスは使用されません
SELECT * FROM CUSTOMER WHERE ID IN (SELECT ID FROM U_VIP)
上記の例を単純化しましたが、実際のアプリケーションでは、パフォーマンスははるかに大きな影響を受けます。この場合、Firebird にインデックスを強制的に使用させるにはどうすればよいですか?
**Firebird 2.1 を使用
** 編集 **
マークの回答に基づいて、現在インデックスシークを行っているため、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 は中かっこのある部分を嫌います =/