2011-11-14 21 views
0

私は、2つの指定された文字列間のLevenshtein距離を計算するSQLで定義された関数を持っています。SQL文の一時変数

現在、私は次のような方法で、この関数を呼び出す:

SELECT * FROM movies M WHERE levenshtein (M.title, "Foobar") < 5; 

私はレーベンシュタイン距離の昇順に順に結果を使用したいのですが、実行する適切な方法を知りませんそう。

これを行う方法はありますか、それとも別の方法で行う必要がありますか?私はあなたがちょうどそうのようにORDER BY句で関数を再利用することができると信じて

答えて

2

levenshtein()は高価な機能です。パフォーマンスがすべて関連している場合は、2回呼び出すことを避けたい場合があります。そのためにはサブ選択を使用します。 (他のRDBMSでは、CTEを使用するかもしれませんが、MySQLにはCTEはありません)

パフォーマンスの向上を確認するテストを実行します。

SELECT some_col 
FROM (SELECT some_col, levenshtein(title, 'Foobar') AS levi FROM movies) AS m 
WHERE levi < 5 
ORDER BY levi; 

ところで、あなたはあなたの例のようにSELECTリストで表の別名を入れたくなかった、あなたがやりましたか?

+0

そのミスについては申し訳ありません!それを私が直した。 ありがとうございます! –

0
ORDER BY levenshtein (M.title, "Foobar") 
+0

私はこれについて考えていましたが、これは関数を2回呼び出さないのです(これはすでに高価なので2回呼び出す必要はないと思います)。それとも最適化していますか? –

0

SELECT * 
FROM movies M 
WHERE levenshtein (M.title, "Foobar") < 5 
ORDER BY levenshtein (M.title, "Foobar"); 

他のオプションは、のために列を追加して、出力にすべてのレコードの結果でありますあなたの関数呼び出しを一時テーブルに格納してから、問題の列のWHEREORDER BY句を使用してそれから選択します。

+0

私はこれについて考えていましたが、これは関数を2回呼び出さないのです(それはすでに高価なので、2回呼び出す必要はないと思います)。それとも最適化していますか? –

+0

@Kaushik私は完全にはわかりません。しかし(テンポラリテーブルを使用して)それを2番目の方法で実行すると、1回だけ呼び出されます。 –

0

同様の回答をお探しの方には、同じ種類の問題について実用的な経験があります。

、それは非常によく動作しますが、との問題...

ORDER BY levenshtein (M.title, "Foobar") 

が...それ50万行のテーブルに対してテストから2回(の機能を実行することはありませんが、私はそれがないとは思いません)、クエリはORDER BYを実行するためにfilesortを使用します。ご存知のように、ORDERed列をWHERE句に組み込むと、filesortの必要性がなくなります。問題は、ORDERされた値が列ではなく、純粋な列参照が機能しないことです。

関連する問題