1

オブジェクト ID を受け取り、割り当てられた課題 ID を返す関数「fnc_FindIssueId」があります。

純粋な select ステートメントを使用して関数を呼び出すと、正常に動作します。

select fnc_FindIssueId(150083); // returns 1 as issueId for objectId of 150083
select fnc_FindIssueId(150072); // returns 2 as issueId for objectId of 150072

しかし、内部結合内で使用すると、終わりのないループに入ります。

select so.id, si.id
from smart_objects as so 
       LEFT OUTER join smart_issues as si 
        on si.id = fnc_FindIssueId(so.id)
where so.id in (150083, 150072);

その理由と解決方法は?

4

2 に答える 2

1

無限ループは行いません。

その理由は、サーバーのパフォーマンスFULL TABLE SCANが非常に遅いためです。この条件は、 と でインデックスを定義してsi.id = fnc_FindIssueId(so.id)いても、インデックスを使用しません。si.idso.id

あなたができる最善の方法は次のとおりです。

  • テーブルを変更するsmart_objects
  • の別の列assigned issue Id
  • 新しい列にインデックスを定義する
于 2013-02-11T12:03:12.970 に答える
0

回避策は、ObjectId 列と IssueId 列を含む新しいビューを作成し、そのビュー内からその関数を呼び出すことでした! しかし、今では非常に遅くなりました。

CREATE ALGORITHM=UNDEFINED DEFINER=`mysql`@`%` SQL SECURITY DEFINER VIEW `vw_smart_objectissue` AS select `so`.`id` AS `objectid`,`fnc_FindIssueId`(`so`.`id`) AS `issueid` from `smart_objects` `so` order by `so`.`id`$$
于 2013-02-11T13:03:52.543 に答える