Я унаследовал приложение, которое делает следующий вид запроса в большом количестве мест:Почему SQL-запросы с функцией VBA работают так медленно?
select foo.f1, foo.f2, foo.f3
from foo
where foo.f4 = getFooF4()
getFooF4 выглядит следующим образом
Public Function getFooF4()
Dim dbCurrent As Database
Dim rstBar As Recordset
Set dbCurrent = CurrentDb
Set rstBar = dbCurrent.OpenRecordset("Bar", _
dbOpenDynaset, _
dbSeeChanges)
getFooF4 = rstBar![myF4]
''yes this appears broken... Bar only contains one row :-/
rstBar.close
Set rstBar = Nothing
dbCurrent.close
Set dbCurrent = Nothing
End Function
'' Note: in my experimentation getFooF4 only runs once during the
'' execution of the query.
Это заканчивается работает довольно медленно. Если удалить getFooF4() из запроса с константой:
select foo.f1, foo.f2, foo.f3
from foo
where foo.f4 = 123456
или параметр:
select foo.f1, foo.f2, foo.f3
from foo
where foo.f4 = [myFooF4]
или с объединением:
select foo.f1, foo.f2, foo.f3
from foo
INNER JOIN bar ON bar.myF4 = foo.f4
Он работает гораздо быстрее.
Почему?
функции: App написана и работает в MS Access 2003, фоновым базы данных SQL Server 2008.
Я также отмечу, что запросы статически определяются как объекты запроса в MS Access, а не на стороне SQL Server. – BIBD
Посмотрите, насколько чистый и простой запрос 'INNER JOIN'. Неужели вы не видите, как заставить конкретный план (например, требуя второго подключения для поиска значения в таблице) не позволяет оптимизатору выполнять свою работу? – onedaywhen
@ODW - Да, на самом деле я переключил большинство из них на использование запроса INNER JOIN. Есть пара, которой я еще не могу по некоторым другим причинам WTF. Меня больше интересует ПОЧЕМУ исходный код настолько медленный. В настоящее время это похоже на эффект неявного типа Variant, возвращаемого функцией. – BIBD