我正在处理的项目需要以下查询:
SELECT translations.id, GetInheritedTranslationTokenTranslationText(translations.id, translationtokens.id) AS inherited_text
FROM translations
JOIN translationtokens
LEFT JOIN translationtokentranslations translation_value ON translation_value.translationid = translations.id AND translation_value.translationtokenid = translationtokens.id
GetInheritedTranslationTokenTranslationText是一个用户定义的函数,用于在树中找到更高的文本值(层次结构在' translations'表中定义)。
使用过的表目前有以下数量的记录(将来会有更多记录):
translations: 10
translationtokens: 866
translationtokentranslations: 870
上面的查询在+ - 240毫秒内执行,并返回+ - 12.000条记录。
但是当我添加order by translations.id
或group by
语句时,执行时间乘以10,所以大约需要2.4秒。
当我删除自定义用户功能并使用order by
语句时,性能良好(+ - 100毫秒)。
我的问题是:为什么在结果集不变的情况下对结果进行排序需要2秒。为什么自定义函数对其他列的排序有如此不好的影响?有一个很好的解决方法吗?
我知道一种解决方法可能是将查询包装在子查询中并对结果进行排序,但这并不适用于分组。