1

我有一个函数“fnc_FindIssueId”,它接受一个对象 ID 并返回其分配的问题 ID。

当我使用纯选择语句调用该函数时,它工作正常:

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

但是当我在 Inner Join 中使用它时,它会进入一个永无止境的循环:

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.idand上定义了一个索引,此条件也不使用索引so.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 回答