powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Сравнение скорости (что быстрей - связать 4 таблицы по индексным полям 1-2-3-4 или сделать 2 запроса)
21 сообщений из 21, страница 1 из 1
Сравнение скорости (что быстрей - связать 4 таблицы по индексным полям 1-2-3-4 или сделать 2 запроса)
    #32559085
vam911
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
К вопросу об индексах и скорости - что быстрей - связать 4 таблицы по индексным полям 1-2-3-4 или сделать 2 запроса

1-2 и 3-4, а потом связать их по 2-3.

т.е наследуют ли запросы индексы родителей???
...
Рейтинг: 0 / 0
Сравнение скорости (что быстрей - связать 4 таблицы по индексным полям 1-2-3-4 или сделать 2 запроса)
    #32559138
Фотография Gyslik.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vam911наследуют ли запросы индексы родителей?
Да, наследуют.
...
Рейтинг: 0 / 0
Сравнение скорости (что быстрей - связать 4 таблицы по индексным полям 1-2-3-4 или сделать 2 запроса)
    #32559143
Фотография Victosha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторт.е. наследуют ли запросы индексы родителей
какой сегодня песенный вечер - просто "подмосковные вечера"...
:))
...
Рейтинг: 0 / 0
Сравнение скорости (что быстрей - связать 4 таблицы по индексным полям 1-2-3-4 или сделать 2 запроса)
    #32559197
N_A
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Быстрее то что при тестировании окажется быстрее, а тестирование такого вопроса займет немного времени и даст более точный ответ.
Тем неменее в большинстве случаев лучше использовать один запрос, т.к. Access сможет точнее выбрать стратегию его выполнения.

Тем немение, вчера лично переделывал процедуру в которой через рекордсет открывался 1 запрос (в нем было тройное обединение двух запросов(отгружено,оплачено) для вычисления выражения (долг=отгружено-оплачено)
Заменил на 2 рекорсета по двум запросам + программный анализ значений полей этих запросов для "программного объединения" и вычисления тогоже выражения.Получил ускорение в 10 раз.
...
Рейтинг: 0 / 0
Сравнение скорости (что быстрей - связать 4 таблицы по индексным полям 1-2-3-4 или сделать 2 запроса)
    #32559486
vam911
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно по пдробней???


+ программный анализ значений полей этих запросов для "программного объединения" и вычисления тогоже выражения.Получил ускорение в 10 раз.
...
Рейтинг: 0 / 0
Сравнение скорости (что быстрей - связать 4 таблицы по индексным полям 1-2-3-4 или сделать 2 запроса)
    #32560524
N_A
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Медленный запрос "zForDolgOplatDoli"
Код: plaintext
1.
SELECT zOtgrujeno.ksgKartID, zOtgrujeno.ktDoktorID, zOtgrujeno.ktGruppID, zOtgrujeno.SumRabota AS DrSumma, zOplaceno.SumOplat AS OplDrSumma, [SumRabota]-[SumOplat] AS DrDolg, zOtgrujeno.bvPrioritet
FROM zOtgrujeno LEFT JOIN zOplaceno ON (zOtgrujeno.ktGruppID = zOplaceno.opldGruppID) AND (zOtgrujeno.ktDoktorID = zOplaceno.opldDoctorID) AND (zOtgrujeno.ksgKartID = zOplaceno.oplKartID);
код
Код: plaintext
1.
2.
3.
4.
    Set r = CurrentDb.OpenRecordset("Select ksgKartID, ktDoktorID,ktGruppID,DrSumma,OplDrSumma,DrDolg FROM zForDolgOplatDoli WHERE ksgKartID=" & kartID & " and DrDolg>0 " _
                & " ORDER BY bvPrioritet;", DAO.dbOpenDynaset)
DrDolg =r!DrDolg'Посчитано в запросе
... 
был заменен приблизительно на такой
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
    Set rOtg = CurrentDb.OpenRecordset("Select ksgKartID, ktDoktorID,ktGruppID,SumRabota FROM zOtgrujeno WHERE ksgKartID=" & kartID & " ORDER BY bvPrioritet;", DAO.dbOpenDynaset)
    Set rOpl = CurrentDb.OpenRecordset("Select oplKartID, opldDoctorID,opldGruppID,SumOplat FROM zOplaceno WHERE oplKartID=" & kartID, DAO.dbOpenDynaset)
'Программное вычисление из  2  запросов
        rOpl.FindFirst "opldGruppID=" & rOtg!ktGruppID & " and opldDoctorID=" & rOtg!ktDoktorID
        If Not rOpl.NoMatch Then
            DrDolg = rOtg!SumRabota - rOpl!SumOplat
        Else
            DrDolg = rOtg!SumRabota
        End If
....
Хотя это очень конкретный, и не очен понятный пример :)
...
Рейтинг: 0 / 0
Сравнение скорости (что быстрей - связать 4 таблицы по индексным полям 1-2-3-4 или сделать 2 запроса)
    #32560534
Фотография Victosha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 N_A
а индексация медленному запросу не помогает?
...
Рейтинг: 0 / 0
Сравнение скорости (что быстрей - связать 4 таблицы по индексным полям 1-2-3-4 или сделать 2 запроса)
    #32560550
vam911
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
N_AМедленный запрос "zForDolgOplatDoli"
Код: plaintext
1.
SELECT zOtgrujeno.ksgKartID, zOtgrujeno.ktDoktorID, zOtgrujeno.ktGruppID, zOtgrujeno.SumRabota AS DrSumma, zOplaceno.SumOplat AS OplDrSumma, [SumRabota]-[SumOplat] AS DrDolg, zOtgrujeno.bvPrioritet
FROM zOtgrujeno LEFT JOIN zOplaceno ON (zOtgrujeno.ktGruppID = zOplaceno.opldGruppID) AND (zOtgrujeno.ktDoktorID = zOplaceno.opldDoctorID) AND (zOtgrujeno.ksgKartID = zOplaceno.oplKartID);
код
Код: plaintext
1.
2.
3.
4.
    Set r = CurrentDb.OpenRecordset("Select ksgKartID, ktDoktorID,ktGruppID,DrSumma,OplDrSumma,DrDolg FROM zForDolgOplatDoli WHERE ksgKartID=" & kartID & " and DrDolg>0 " _
                & " ORDER BY bvPrioritet;", DAO.dbOpenDynaset)
DrDolg =r!DrDolg'Посчитано в запросе
... 
был заменен приблизительно на такой
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
    Set rOtg = CurrentDb.OpenRecordset("Select ksgKartID, ktDoktorID,ktGruppID,SumRabota FROM zOtgrujeno WHERE ksgKartID=" & kartID & " ORDER BY bvPrioritet;", DAO.dbOpenDynaset)
    Set rOpl = CurrentDb.OpenRecordset("Select oplKartID, opldDoctorID,opldGruppID,SumOplat FROM zOplaceno WHERE oplKartID=" & kartID, DAO.dbOpenDynaset)
'Программное вычисление из  2  запросов
        rOpl.FindFirst "opldGruppID=" & rOtg!ktGruppID & " and opldDoctorID=" & rOtg!ktDoktorID
        If Not rOpl.NoMatch Then
            DrDolg = rOtg!SumRabota - rOpl!SumOplat
        Else
            DrDolg = rOtg!SumRabota
        End If
....
Хотя это очень конкретный, и не очен понятный пример :)


Я на это то же нарывался. Почему-то аксесс при связывании по 2-м и более полям притормаживает (занчительно), однако вопрос был немного другой.

Что быстрей (Код - везде индексированно)
1/ SELECT t2.Код, t3.Код
FROM ((t1 INNER JOIN t2 ON t1.Код = t2.Код) INNER JOIN t3 ON t1.Код = t3.Код) INNER JOIN t4 ON t1.Код = t4.Код;

2/ или тоже, но побитое на 2 запроса и потом объединенное вместе.
запрос 1
SELECT t2.Код
FROM t1 INNER JOIN t2 ON t1.Код = t2.Код;
запрос 2
SELECT t3.Код
FROM t3 INNER JOIN t4 ON t3.Код = t4.Код;

запрос 3 - конечный
SELECT Запрос1.Код, Запрос2.Код
FROM Запрос1 INNER JOIN Запрос2 ON Запрос1.Код = Запрос2.Код;

Необходимо когда в запросе 6-7 таблиц и без сникерса врубиться что все это значит невозможно. Логично разибть на чати, но производитьельность???
...
Рейтинг: 0 / 0
Сравнение скорости (что быстрей - связать 4 таблицы по индексным полям 1-2-3-4 или сделать 2 запроса)
    #32560555
Фотография Victosha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
автор Логично разибть на чати
логично выбросить из запроса t1 и t4, поскольку НИКАКИХ условий фильтрации на этих таблицах не заявлено.
...
Рейтинг: 0 / 0
Сравнение скорости (что быстрей - связать 4 таблицы по индексным полям 1-2-3-4 или сделать 2 запроса)
    #32560571
vam911
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Victosha автор Логично разибть на чати
логично выбросить из запроса t1 и t4, поскольку НИКАКИХ условий фильтрации на этих таблицах не заявлено.

Связь сама по себе является условием фильтрации (ну и ведь это просто упрощение. Ясно, что в практике запрос по сложней будет).

Если индексы наследуются - то скорость должна быть одинакова, а если нет - то второй вариант будет на много медленней. Вот в этом-то и состоит вопрос - наследуются или нет...
...
Рейтинг: 0 / 0
Сравнение скорости (что быстрей - связать 4 таблицы по индексным полям 1-2-3-4 или сделать 2 запроса)
    #32560583
N_A
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
автора индексация медленному запросу не помогает?
Может и поможет, но не хотелось бы добавлять индексы, если их можно избежать (т.к. таблицы большие и в них осуществляется достаточно интенсивный ввод (3 кассы)).
Я думаю проблема в 3-ом объединении и последующем фильтре "WHERE ksgKartID=" & kartID & " and DrDolg>0 ", где DrDolg вычисляется в запросе ([SumRabota]-[SumOplat] AS DrDolg). Мне кажется что Access вычисляет это выражение для всех записей, а потом фильтрует по ksgKartID, еслиб делал наооборот - было бы быстрей.
Я привел пример лишь для того, чтобы показать, что не надо во всем расчитывать на ядро Jet и впихивать в запрос все. Иногда (быть может не часто) приходится вычислять самому или пересматривать подход, анализируя узкие места.
...
Рейтинг: 0 / 0
Сравнение скорости (что быстрей - связать 4 таблицы по индексным полям 1-2-3-4 или сделать 2 запроса)
    #32560585
vam911
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
N_A автора индексация медленному запросу не помогает?
Может и поможет, но не хотелось бы добавлять индексы, если их можно избежать (т.к. таблицы большие и в них осуществляется достаточно интенсивный ввод (3 кассы)).
Я думаю проблема в 3-ом объединении и последующем фильтре "WHERE ksgKartID=" & kartID & " and DrDolg>0 ", где DrDolg вычисляется в запросе ([SumRabota]-[SumOplat] AS DrDolg). Мне кажется что Access вычисляет это выражение для всех записей, а потом фильтрует по ksgKartID, еслиб делал наооборот - было бы быстрей.
Я привел пример лишь для того, чтобы показать, что не надо во всем расчитывать на ядро Jet и впихивать в запрос все. Иногда (быть может не часто) приходится вычислять самому или пересматривать подход, анализируя узкие места.

А про кассы у меня ничего не было %))) Съехали с темы..
...
Рейтинг: 0 / 0
Сравнение скорости (что быстрей - связать 4 таблицы по индексным полям 1-2-3-4 или сделать 2 запроса)
    #32560587
vam911
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сделаем по проще. Может кто-либо скинуть кусок кода для сверки скорости выборки двух запросов ( с учетом кэширования)
...
Рейтинг: 0 / 0
Сравнение скорости (что быстрей - связать 4 таблицы по индексным полям 1-2-3-4 или сделать 2 запроса)
    #32560591
N_A
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Возьми реальные таблицы и заполни типичными значениями, предположительным числом записей+большой запас. Потом выполни свои 2 варианта запросов, посортируй, пофильтруй. Если на глаз разницы в скорости не заметишь, то делай как удобней.
...
Рейтинг: 0 / 0
Сравнение скорости (что быстрей - связать 4 таблицы по индексным полям 1-2-3-4 или сделать 2 запроса)
    #32560599
vam911
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А кэширование??? так просто не получится...
Надо прогу писать, а что бы кэш 100% отрезать надо еще дополнительные знания по работе с кэшом в акссессе иметь ( у меня их нет)
...
Рейтинг: 0 / 0
Сравнение скорости (что быстрей - связать 4 таблицы по индексным полям 1-2-3-4 или сделать 2 запроса)
    #32560609
N_A
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Важно и с кешированием и без. Для теста без кеширования при каждом следующем тесте можно выходить из Access (можно и перегрузить комп). Если есть серьезная разница, то это будет заметно на глаз, а парится из за нескольких процентов я бы не стал.
...
Рейтинг: 0 / 0
Сравнение скорости (что быстрей - связать 4 таблицы по индексным полям 1-2-3-4 или сделать 2 запроса)
    #32560612
vam911
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
N_AВажно и с кешированием и без. Для теста без кеширования при каждом следующем тесте можно выходить из Access (можно и перегрузить комп). Если есть серьезная разница, то это будет заметно на глаз, а парится из за нескольких процентов я бы не стал.

Логично... Попробую .

Но если у кого есть прога и Вам не влом - скиньте Кодик (там не много должно быть)
...
Рейтинг: 0 / 0
Сравнение скорости (что быстрей - связать 4 таблицы по индексным полям 1-2-3-4 или сделать 2 запроса)
    #32560614
N_A
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тут можно качнуть пример с измерением скорости, может что подойдет.
http://rlsys.net/access/index.php?type=103&urok=37
...
Рейтинг: 0 / 0
Сравнение скорости (что быстрей - связать 4 таблицы по индексным полям 1-2-3-4 или сделать 2 запроса)
    #32560636
Фотография Victosha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторСвязь сама по себе является условием фильтрации (ну и ведь это просто упрощение. Ясно, что в практике запрос по сложней будет).

приведенный пример хорош именно тем, что в нем очевидна бессмысленность такой "фильтрации".
В "практике" это и просмотреть можно :))
...
Рейтинг: 0 / 0
Сравнение скорости (что быстрей - связать 4 таблицы по индексным полям 1-2-3-4 или сделать 2 запроса)
    #32560651
vam911
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
N_AВажно и с кешированием и без. Для теста без кеширования при каждом следующем тесте можно выходить из Access (можно и перегрузить комп). Если есть серьезная разница, то это будет заметно на глаз, а парится из за нескольких процентов я бы не стал.

Сволочи - оба быстро выполняются, не поймещь, кто быстрей :(((.
...
Рейтинг: 0 / 0
Сравнение скорости (что быстрей - связать 4 таблицы по индексным полям 1-2-3-4 или сделать 2 запроса)
    #32560870
Bely
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vam9111/ SELECT t2.Код, t3.Код
FROM ((t1 INNER JOIN t2 ON t1.Код = t2.Код) INNER JOIN t3 ON t1.Код = t3.Код) INNER JOIN t4 ON t1.Код = t4.Код;

2/ или тоже, но побитое на 2 запроса и потом объединенное вместе.
запрос 1
SELECT t2.Код
FROM t1 INNER JOIN t2 ON t1.Код = t2.Код;
запрос 2
SELECT t3.Код
FROM t3 INNER JOIN t4 ON t3.Код = t4.Код;

запрос 3 - конечный
SELECT Запрос1.Код, Запрос2.Код
FROM Запрос1 INNER JOIN Запрос2 ON Запрос1.Код = Запрос2.Код;

Есть мнение, что скорость зависит в каждом конкретном случает от интелекуальности планировщика запроса.
Может оказаться, что вариант (1) быстрее а может оказаться, что (2) будет быстрее.
И еще не стоит забывать, что возможны различные потребности по памяти для исполнения этих запросов.
При недостатке свободной памяти - это может оказаться рещающим фактором в скорости выполнения запроса.
...
Рейтинг: 0 / 0
21 сообщений из 21, страница 1 из 1
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Сравнение скорости (что быстрей - связать 4 таблицы по индексным полям 1-2-3-4 или сделать 2 запроса)
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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