6

これは実行に 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 は中かっこのある部分を嫌います =/

4

1 に答える 1