Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Теоритичиский вопрос по запросам / 23 сообщений из 23, страница 1 из 1
09.09.2003, 10:21
    #32259445
Sfagnum
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Теоритичиский вопрос по запросам
есть у меня цепочка сохранённых запросов...

Вопрос в следующем.
При вызове конечного запроса в котором может несколько раз использоваться "подчинёные" запросы, "подчинёные" запросы - будут пересчитываться при каждом их обнаружении или толко раз?
Каждый "подчинёный" запрос во всех случаях выдаёт один и тот же результат.

Access'97
...
Рейтинг: 0 / 0
09.09.2003, 10:48
    #32259493
Теоритичиский вопрос по запросам
У меня уже возникал такой вопрос.
В результате перелопачивания больших объемов информации с иностранных сайтов выяснил, что подчиненные запросы в Microsoft Access до 97 версии включительно вызываются каждый раз заново. Microsoft клятвенно обещал, что этот недочет будет исправлен в следующих версиях (по информации из тех же источников). Появилась эта возможность в новых версиях (2000, XP) или нет - я так и не смог выяснить (нет и инете или просто не нашел).
...
Рейтинг: 0 / 0
09.09.2003, 10:52
    #32259506
Pavel
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Теоритичиский вопрос по запросам
Для того чтобы избежать повторного выполнения подзапросов процессор запросов должен обладать недюжим "интеллектом". От MSJET этого ждать не приходится ни сейчас, ни в будущем, тем более что существует его приемственник - MSDE. А это уже полноценный SQL сервер, с очень мощным оптимизатором запросов.
...
Рейтинг: 0 / 0
09.09.2003, 11:58
    #32259659
Sfagnum
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Теоритичиский вопрос по запросам
Спасибо за разочерование
...
Рейтинг: 0 / 0
09.09.2003, 12:18
    #32259710
Pavel
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Теоритичиский вопрос по запросам
Ну что уж сразу и разочарование? Методы борьбы есть. К примеру результат промежуточного запроса можно выкинуть в табличку, а в основных запросах ее использовать.
...
Рейтинг: 0 / 0
09.09.2003, 12:34
    #32259747
Sfagnum
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Теоритичиский вопрос по запросам
так то оно так... но тогда на кажное обновление надо её переписывать... хотя... что то в этом есть
...
Рейтинг: 0 / 0
09.09.2003, 12:57
    #32259794
Лох Позорный
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Теоритичиский вопрос по запросам
Что-то у меня сомнения в том, что в 97-м оно всегда пересчитывается.
Например, аксесу хватает интелекта чтобы функции не вызывать кждый раз - если оно не надо (иногда оно и мешает). Если не рассматривать коррелированные запросы (должны всегда перевыполняться), то почему бы аксесу не выполнить подчиненный запрос один раз?
Попробую проверить, если что - напишу.
...
Рейтинг: 0 / 0
09.09.2003, 13:53
    #32259912
Лох Позорный
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Теоритичиский вопрос по запросам
Похоже мои сомнения были оправданы

Имеем две таблицы Таблица1 и Таблица2 с полем А. Данные - от целые числа 1 до 5.

Пишем функцию
Код: plaintext
1.
2.
3.
Public Function QueryTracing(value As Long) As Long
    Debug.Print value
    QueryTracing = value
End Function

Пишем Запрос1
Код: plaintext
1.
Seleсt A, QueryTracing(A) As B
From [Таблица1]

После выполнения в дебуге цифры 1-5

Пишем Запрос2
Код: plaintext
1.
Select A, (Select Top  1  B From [Запрос1]) As B
From [Таблица2]

В дебуге - одна цифра. Т.е. запрос исполнился адын раз. Чего и следовало ожидать.

Ну а если Запрос3
Код: plaintext
1.
Select A, (Select Top  1  B From [Запрос1] Where [Запрос1].А=[Таблица2].A) As B
From [Таблица2]

то в дебуге опять пять цифр, т.е. вложенный запрос исполнился для каждой строки, чего тоже следовало ожидать.

P.S. 2 Pavel
Размышления об оптимизаторах выглядят странно. Например рашморовский алгоритм был сначала в фоксе, потом его добавили в аксес, и уж только потом в MS SQL
...
Рейтинг: 0 / 0
09.09.2003, 14:39
    #32260018
Sfagnum
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Теоритичиский вопрос по запросам
2 ЛП
про 3 запрос он его именно выполняет 5 раз, а не выполнив 1 раз юзает данные для сравнения?
Код: plaintext
1.
2.
3.
Select A, (Select Top  1  B From [Запрос1] Where [Запрос1].А=[Таблица2].A) As B
From [Таблица2]
Union A, (Select Top  2  B From [Запрос1] Where [Запрос1].А=[Таблица2].A) As B
From [Таблица2]

А здесь он будет соответсвенно выполняться большее кол-во раз... это и требовалось доказать
...
Рейтинг: 0 / 0
09.09.2003, 14:52
    #32260055
Лох Позорный
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Теоритичиский вопрос по запросам
Дык извини, но у тебя не в 3-м случае не один запрос, а пять разных. Как ты хочешь чтобы пять запросов за один раз исполнились? Как вариант у них могут быть даже разные планы выполнения.
Максимум что может сделать аксес - запихать какие-нибудь промежуточные данные куда-нибудь в свою временную таблицу, но во-первых кто сказал, что он этого не делает, во-вторых если и не делает - это простительно для аксеса.
...
Рейтинг: 0 / 0
09.09.2003, 15:04
    #32260083
Sfagnum
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Теоритичиский вопрос по запросам
Ну да...
Запрос1 - в 3ем варианте выдаёт каждый раз одни и теже результаты и на х... его 5 раз гонять???

>во-вторых если и не делает - это простительно для аксеса.
дааа... многое мы ему прощаем...
...
Рейтинг: 0 / 0
09.09.2003, 15:10
    #32260091
sasha_1
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Теоритичиский вопрос по запросам
>Запрос1 - в 3ем варианте выдаёт каждый раз одни и теже результаты и на
>х... его 5 раз гонять???
человек в любом варианте рано или поздно помирает.
и нах.. тогда жить
:)
...
Рейтинг: 0 / 0
09.09.2003, 15:18
    #32260100
Лох Позорный
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Теоритичиский вопрос по запросам
Я имел ввиду весь вложенный запрос, т.е. Select Top 1 B From [Запрос1] Where [Запрос1].А=[Таблица2].A
А собственно Запрос1 если бы 5 раз исполнялся - вывелось бы 25 значений в дебуг, а не 5
...
Рейтинг: 0 / 0
09.09.2003, 15:51
    #32260157
Лох Позорный
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Теоритичиский вопрос по запросам
Хотя последнее мое утверждение - не есть истина.
В дебуг что-то пишется только при выборке конкретной строки, а вот откуда она выбирается - из уже готового запроса или только что выполненного - хз.
...
Рейтинг: 0 / 0
09.09.2003, 16:25
    #32260226
Sfagnum
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Теоритичиский вопрос по запросам
2 ЛП
во-во
...
Рейтинг: 0 / 0
09.09.2003, 16:27
    #32260231
Хам трамвайный
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Теоритичиский вопрос по запросам
посм. т.1 стр.765-785
...
Рейтинг: 0 / 0
09.09.2003, 16:35
    #32260248
Sfagnum
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Теоритичиский вопрос по запросам
2 Хт
Нетути т.1 и т.2 тоже
...
Рейтинг: 0 / 0
09.09.2003, 16:35
    #32260250
Лох Позорный
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Теоритичиский вопрос по запросам
Хам, ты конечно мастер говорить загадками , но на работе у меня нет Гетца, а дома временно нет интернета :).
Может могущественный джин и т.п. скажет в двух словах, что там писал Великий? Или мне придется номера страниц записать на бумажку и бояться ее потерять по дороге? Не говоря уже про тех, у кого Гетца нихт?
...
Рейтинг: 0 / 0
09.09.2003, 16:45
    #32260271
Хам трамвайный
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Теоритичиский вопрос по запросам
тама про план
выполнения запросов
написано (ShowPlan и ISAMStats).
можно яво посмореть
и как
а такжа: как аксесс
переваривает
запросы
...
Рейтинг: 0 / 0
09.09.2003, 16:53
    #32260289
Sfagnum
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Теоритичиский вопрос по запросам
2 Хам
Спасибо за подробную инфу :)
...
Рейтинг: 0 / 0
09.09.2003, 19:26
    #32260494
assa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Теоритичиский вопрос по запросам
интересно, что на малом объеме он (акес) In(SELECT ...) обсчитывает так же как EXISTS (с передачей параметра внутрь). Что на некоторых SQL серверах не вернО. (времена расходятся на порядки - на больших объемах)

Тест:
данные: A.t - (a;b;c;d) B.t - (A;B;C)

AABABCABCabc
AABABCABCabc
/*
Public Function QueryTracing(value As String) As String
Debug.Print value;
QueryTracing = value
End Function
*/
/*
SELECT A.t, A.a, QueryTracing([t]) AS q
FROM A
WHERE A.t In (SELECT QueryTracing([t]) AS q
FROM B);
*/
/*
SELECT A.t, A.a, QueryTracing([t]) AS q
FROM A
WHERE Exists (SELECT * FROM B WHERE QueryTracing(B.t) =A.t);
*/
Именно поэтому, видимо конструкция с явной сшивкой In(строка) в Акесе работает быстрее.
...
Рейтинг: 0 / 0
10.09.2003, 09:06
    #32260702
Sfagnum
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Теоритичиский вопрос по запросам
2 assa
Но всегда медленее чем JOIN имхо
...
Рейтинг: 0 / 0
10.09.2003, 13:04
    #32261096
assa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Теоритичиский вопрос по запросам
У меня была проблема с Not IN (что JOIN-ами реализуется так: {(какой-нить)OUTER JOIN ... where ... is null}, и не во всех сложных запросах можно эдак сджойнить, а вот In() в WHERE воткнуть можно практически всегда, в некоторых случаях (не в Аксесе) допустимо даже {WHERE (f1,f2,...fn) {Not] In(SELECT f1,f2,...fn FROM ... )} (то же самое можно и с NOT EXISTS, но передачей значения(й) из строки во вложенный -т.е. заведомо построчным счетом). Такоже, если джойнить надо запрос (да еще с подзапросами) - могут (в том же аксесе) быть проблемы с уровнем вложенности. К тому же есть и чисто Акесовская проблема - когда в одном запросе приконнеченная табличка какого нить формата (например - какой-нить SQL -сервер, или тот же Btrieve) и акесовская. тогда, вместо того, чтоб джойнить (особо, если в In(Select .. FROM AccessTable ...) получается мало записей), шустрее прослать запрос + (масенький) набор, полученный из IN на выполнение серверу ("менеджеру" - в Btrieve). Но он (Акес) ведь этого не деет. Приходится руками (т.е. прогой) шить строку-перебор в In() (Выбрасывая "разноприродность" таблиц из запроса), а уж драйвер, похоже, просылает "простой" запрос серверу (даже когда не пишешь его как "запрос к серверу"). А в лоб, т.е. джойном - до второго пришествия считать будет. Данные туда-сюда по сетке гонять. (А это все обычные задачи слива данных откуда-то куда-то. Например - в тот же акес, или из него, или просто с его помощью).

Зы. А джойном, обычно, и точно быстрее. Но, опять таки, JOIN, если он INNER, обычным WHERE пишется :0). И токо OUTER-ы дают действительную приятсвенность (по сравнению с WHERE).
...
Рейтинг: 0 / 0
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Теоритичиский вопрос по запросам / 23 сообщений из 23, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]