|
Оптимизировать вычисления в запросе
|
|||
---|---|---|---|
#18+
Здравствуйте! Access 2003: В конструкторе я создал запрос для вычисления значения Y как функции от полей X1 и Х2 в таблице myTable. Но я хочу чтобы запрос выдавал только значения Y больше 1 и причем в отсортированном виде. Когда я перешел в Режим SQL то получил: SELECT X1, X2, (X1 + X2)/2 as Y FROM myTable WHERE (X1 + X2)/2 > 1 ORDER BY (X1 + X2)/2; Подозреваю, что для исполнения такого запроса, для каждой строки из myTable Access 3 раза вычисляет (X1+X2)/2 Как заставить Access 2003 делать одно вычисление и использовать его результат и для SELECT и для WHERE и для ORDER BY Спасибо ... |
|||
:
Нравится:
Не нравится:
|
|||
24.02.2016, 21:58 |
|
Оптимизировать вычисления в запросе
|
|||
---|---|---|---|
#18+
Дмитрий П., А зачем ??? (чё очень долго,порядка 2 минут,работает) ... |
|||
:
Нравится:
Не нравится:
|
|||
24.02.2016, 23:25 |
|
Оптимизировать вычисления в запросе
|
|||
---|---|---|---|
#18+
Дмитрий П., Код: sql 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
25.02.2016, 05:51 |
|
Оптимизировать вычисления в запросе
|
|||
---|---|---|---|
#18+
\\\\Дмитрий П., Код: sql 1.
Вот я тоже так подумала. Но решила проверить. Взяла таблицу с одной записьюAB2030Два запроса 1. Код: sql 1.
2. Код: sql 1.
Функция Код: vbnet 1. 2. 3. 4.
Получилось по Debug.Print, что для обоих запросов обращение к функции происходит трижды (при одной записи в таблице).20,30 20,30 20,30 20,30 20,30 20,30 Если же записей в таблице две, то обращений к функции и в одном, и в другом запросе - семь.20,30 20,30 40,50 40,50 40,50 20,30 40,50 20,30 20,30 40,50 40,50 40,50 20,30 40,50 Если записей в таблице три, то получилось по девять обращений к функции20,30 20,30 40,50 40,50 60,70 60,70 60,70 40,50 20,30 20,30 20,30 40,50 40,50 60,70 60,70 60,70 40,50 20,30 В общем, у меня получается, что количество обращений из обоих запросов одинаково. Посмотрите, пожалуйста, есть ли ошибка в моих "изысканиях"? ... |
|||
:
Нравится:
Не нравится:
|
|||
25.02.2016, 09:40 |
|
Оптимизировать вычисления в запросе
|
|||
---|---|---|---|
#18+
добавить в таблицу колонку и пересчитывать ее при необходимости? ... |
|||
:
Нравится:
Не нравится:
|
|||
25.02.2016, 10:25 |
|
Оптимизировать вычисления в запросе
|
|||
---|---|---|---|
#18+
в конце концов - были вычислимые поля. они скорее всего много раз пересчитываться не станут. https://support.office.com/ru-ru/article/Добавление-вычисляемого-поля-в-таблицу-14a60733-2580-48c2-b402-6de54fafbde3 ... |
|||
:
Нравится:
Не нравится:
|
|||
25.02.2016, 10:30 |
|
Оптимизировать вычисления в запросе
|
|||
---|---|---|---|
#18+
Да, можно порыться в литературе, но лень и узнать КАК выполняется запрос SQL на более низком уровне-сдается мне,что программисты не идиёты и вычисления выполняются без многократных пересчетов ... |
|||
:
Нравится:
Не нравится:
|
|||
25.02.2016, 11:03 |
|
Оптимизировать вычисления в запросе
|
|||
---|---|---|---|
#18+
sdkuДа, можно порыться в литературе, но лень и узнать КАК выполняется запрос SQL на более низком уровне-сдается мне,что программисты не идиёты и вычисления выполняются без многократных пересчетовКак же так? Эксперимент же показал n-кратное обращение к функции, это и есть многократные пересчеты. Нет разве? ... |
|||
:
Нравится:
Не нравится:
|
|||
25.02.2016, 11:07 |
|
Оптимизировать вычисления в запросе
|
|||
---|---|---|---|
#18+
__Michelle... Эксперимент же показал ... Эксперимент показал, что в случае пользования VBA функции... Для случая НЕ пользования VBA функции он ничего НЕ показал. :) ... |
|||
:
Нравится:
Не нравится:
|
|||
25.02.2016, 11:19 |
|
Оптимизировать вычисления в запросе
|
|||
---|---|---|---|
#18+
Predeclared__Michelle... Эксперимент же показал ... Эксперимент показал, что в случае пользования VBA функции... Для случая НЕ пользования VBA функции он ничего НЕ показал. :)Вычисление выражения с функцией или без функции - все равно вычисление выражения. Применение функции просто позволяет это отследить. А как отследить вычисление выражения без функции? Я не знаю. Если знаете способ, подскажите, пожалуйста. Может, и обнаружится искомая разница в подходах. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.02.2016, 11:26 |
|
Оптимизировать вычисления в запросе
|
|||
---|---|---|---|
#18+
__MichelleПосмотрите, пожалуйста, есть ли ошибка в моих "изысканиях"? Поскольку мы не знаем "начинки", трудно искать ошибку. Я, например, попробовал то же самое, но на другом коде (при той же структуре таблицы, значение поля А строго больше нуля): Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28.
Вызов функции выполняется дважды на количестве записей в таблице до 100 тыс. для всех трёх версий запроса. Как интерпретировать - пока не понимаю. Но есть подозрение, что пользовательская функция просто считается безусловно недетерминированной. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.02.2016, 11:33 |
|
Оптимизировать вычисления в запросе
|
|||
---|---|---|---|
#18+
__Michelle... А как отследить вычисление выражения без функции? ... Пробовать менять вычисляемое выражение и отслеживать изменение времени исполнения. Не? Например: изменение выражений в секциях WHERE и ORDER BY на ... WHERE X1 + X2 > 2 ORDER BY X1 + X2 уменьшило время исполнения (на моем стенде) на 20%, при том-же возвращаемом наборе данных. А в таком варианте секции ORDER BY: ... ORDER BY 3 время не изменяется, несмотря на отсутствие формулы вычисления в секции. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.02.2016, 11:38 |
|
Оптимизировать вычисления в запросе
|
|||
---|---|---|---|
#18+
План запроса для MsAccess дает одинаковые результаты showplan.out--- q1 --- - Inputs to Query - Table 't' - End inputs to Query - 01) Restrict rows of table t by scanning testing expression "x1-x2>0" 02) Sort result of '01)' --- q2 --- - Inputs to Query - Table 't' - End inputs to Query - 01) Restrict rows of table t by scanning testing expression "x1-x2>0" 02) Sort result of '01)' ... |
|||
:
Нравится:
Не нравится:
|
|||
25.02.2016, 13:03 |
|
Оптимизировать вычисления в запросе
|
|||
---|---|---|---|
#18+
Akina __MichelleПосмотрите, пожалуйста, есть ли ошибка в моих "изысканиях"? Поскольку мы не знаем "начинки", трудно искать ошибку. Я, например, попробовал то же самое, но на другом коде (при той же структуре таблицы, значение поля А строго больше нуля): Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28.
Вызов функции выполняется дважды на количестве записей в таблице до 100 тыс. для всех трёх версий запроса. Как интерпретировать - пока не понимаю. Но есть подозрение, что пользовательская функция просто считается безусловно недетерминированной. 1. Да, действительно, считает дважды для каждой записи. Но так считает только, если открывать рекордсет - только для WHERE и ORDER BY. 2. Если же открывать аналогичный сохраненный запрос, то посчитает трижды для каждой записи - для WHERE, ORDER BY и SELECT. Если при этом открытый запрос перекрыть другим окном, то при возвращении в окно запроса пересчитает еще по разу для каждой видимой записи. И так каждый раз. При закрытии запроса опять пересчитает еще по разу для каждой видимой записи. 3. Если же присваивать аналогичный RecordSource ленточной форме, то посчитает дважды для всех записей (для WHERE и ORDER BY) + столько раз, сколько записей видно (для SELECT). В форме тоже, как и в открытом запросе, постоянно пересчитывает, если форма не видна/видна. Какая-то погибель.))) ... |
|||
:
Нравится:
Не нравится:
|
|||
25.02.2016, 15:52 |
|
Оптимизировать вычисления в запросе
|
|||
---|---|---|---|
#18+
Predeclared__Michelle... А как отследить вычисление выражения без функции? ... Пробовать менять вычисляемое выражение и отслеживать изменение времени исполнения. Не?Можно ли таким образом с уверенностью определить количество проходов вычислений? Довольно "косвенный" способ. Хотя определенные результаты даст, конечно. PredeclaredНапример: изменение выражений в секциях WHERE и ORDER BY на ... WHERE X1 + X2 > 2 ORDER BY X1 + X2 уменьшило время исполнения (на моем стенде) на 20%, при том-же возвращаемом наборе данных. А в таком варианте секции ORDER BY: ... ORDER BY 3 время не изменяется, несмотря на отсутствие формулы вычисления в секции.А какова причина уменьшения времени исполнения? Возможно, не в том, что предположительно сократилось число проходов вычислений, а в том, что не пришлось расшифровывать 3 и переводить в X1 + X2? ... |
|||
:
Нравится:
Не нравится:
|
|||
25.02.2016, 16:03 |
|
Оптимизировать вычисления в запросе
|
|||
---|---|---|---|
#18+
showplan План запроса для MsAccess дает одинаковые результаты showplan.out--- q1 --- - Inputs to Query - Table 't' - End inputs to Query - 01) Restrict rows of table t by scanning testing expression "x1-x2>0" 02) Sort result of '01)' --- q2 --- - Inputs to Query - Table 't' - End inputs to Query - 01) Restrict rows of table t by scanning testing expression "x1-x2>0" 02) Sort result of '01)' ... |
|||
:
Нравится:
Не нравится:
|
|||
25.02.2016, 16:06 |
|
Оптимизировать вычисления в запросе
|
|||
---|---|---|---|
#18+
__Michelle... Можно ли таким образом с уверенностью определить ... С уверенностью можно констатировать то, что Jet дело темное. :) __Michelle... А какова причина уменьшения времени исполнения?... В уменьшении математических операций выражения в секции WHERE, полагаю. __Michelle... , а в том, что не пришлось расшифровывать 3 и переводить в X1 + X2? Что означает расшифровывать и переводить? Я указал сортировать по значениям третьего столбца. Прироста скорости в замене выражения на номер столбца не обнаружилось. Сделал вывод: выражение в секции ORDER BY в данном случае не вычисляется. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.02.2016, 19:04 |
|
Оптимизировать вычисления в запросе
|
|||
---|---|---|---|
#18+
вывод:(полностью солидарен с нижесказанным) PredeclaredС уверенностью можно констатировать то, что Jet дело темное. :) Ура,товарищи! ... |
|||
:
Нравится:
Не нравится:
|
|||
25.02.2016, 19:22 |
|
Оптимизировать вычисления в запросе
|
|||
---|---|---|---|
#18+
PredeclaredЯ указал сортировать по значениям третьего столбца. Прироста скорости в замене выражения на номер столбца не обнаружилось. Сделал вывод: выражение в секции ORDER BY в данном случае не вычисляется.Проверила. Выражение в секции ORDER BY вычисляется и тогда, когда задан лишь номер столбца, выражение берется из определения этого столбца в секции SELECT. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.02.2016, 21:17 |
|
Оптимизировать вычисления в запросе
|
|||
---|---|---|---|
#18+
__Michelle... выражение берется из определения этого столбца в секции SELECT. Нетъ. :) В целях сортировки берется готовый результат выражения. showplan же показал это. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.02.2016, 21:27 |
|
Оптимизировать вычисления в запросе
|
|||
---|---|---|---|
#18+
Но Debug.Print из функции (дополнительно передаю индекс 1 - Select, 2 - Where, 3 - Order By, который и распечатывается) показывает, что выражение вычисляется заново. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.02.2016, 21:37 |
|
Оптимизировать вычисления в запросе
|
|||
---|---|---|---|
#18+
__MichelleНо Debug.Print из функции ... ... |
|||
:
Нравится:
Не нравится:
|
|||
25.02.2016, 21:49 |
|
Оптимизировать вычисления в запросе
|
|||
---|---|---|---|
#18+
Пример работы оптимизатора с функциями в запросе: Смотреть попарно: Запрос1 и Запрос2 Запрос3 и Запрос4 ... |
|||
:
Нравится:
Не нравится:
|
|||
25.02.2016, 22:13 |
|
Оптимизировать вычисления в запросе
|
|||
---|---|---|---|
#18+
Predeclared, Ваш пример обязательно посмотрю. Спасибо. Вот мое. На основе методики Akina (изменения в функции помечены красным). Затем в Sub test() описываю рекордсеты с запросом "по нарастанию" - сначала только SELECT, затем добавляю WHERE, затем добавляю ORDER BY, наконец меняю в ORDER BY выражение на номер столбца. Выполнение в окне Immediate через call test. Там все хорошо видно, в какой секции идут вычисления. Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42.
... |
|||
:
Нравится:
Не нравится:
|
|||
25.02.2016, 22:31 |
|
Оптимизировать вычисления в запросе
|
|||
---|---|---|---|
#18+
Еще: Для сокращения вывода диагностики в таблице только одна запись. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.02.2016, 22:33 |
|
Оптимизировать вычисления в запросе
|
|||
---|---|---|---|
#18+
Спасибо всем! Спасибо Michelle и Akina за изыскания! Спасибо showplan за очень полезную информацию про План запроса. showplan План запроса для MsAccess дает одинаковые результаты --- q1 --- ... --- q2 --- ... showplan , я не очень понял что такое q1 и q2? На самом деле я общаюсь с базой из программы на VB6. В Access 2003 я просто конструирую SQL, которые использую в программе. Реальная таблица содержит порядка 40 000 записей, а запрос вычисляется около 3000 раз. И реальные WHERE и формула вычислений конечно сложнее. Эксперимент показал - время работы программы существенно снижается, если один сложный запрос заменить на два простых: первый создает и вычисляет промежуточную таблицу X1, X2, Y , а второй - сортирует и ограничивает по Y ... |
|||
:
Нравится:
Не нравится:
|
|||
25.02.2016, 22:40 |
|
Оптимизировать вычисления в запросе
|
|||
---|---|---|---|
#18+
Дмитрий П., и какова цель расчета --выбрать десяток минимальных-максимальных --получить все 40т(вернее больше 1) при сортировке мин/макс или наоборот макс/мин ... |
|||
:
Нравится:
Не нравится:
|
|||
26.02.2016, 09:57 |
|
Оптимизировать вычисления в запросе
|
|||
---|---|---|---|
#18+
ПЕНСИОНЕРКАДмитрий П., и какова цель расчета --выбрать десяток минимальных-максимальных --получить все 40т(вернее больше 1) при сортировке мин/макс или наоборот макс/мин Представте: в плоскости XY есть много (2000 - 4000) замкнутых контуров (запрещенные зоны) разной формы. Все они представлены смежными отрезками (круглые зоны - это много коротких отрезков). Еще есть тестовые точки (до 3000) Координаты тестовых точек и концов отрезков заданы в 2х таблицах ACCESS. Задача - проверить, какие тестовые точки оказались внутри каких зон и насколько глубоко. Вобщем это очень специализированная задачка, которая возникла из-за несовершенства ПО установки внутрисхемного контроля электронных модулей. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.02.2016, 19:23 |
|
Оптимизировать вычисления в запросе
|
|||
---|---|---|---|
#18+
Дмитрий П.замкнутых контуров (запрещенные зоны) разной формы интересно, они выпуклые или есть вогнутости(например полумесяц) ... |
|||
:
Нравится:
Не нравится:
|
|||
26.02.2016, 19:31 |
|
Оптимизировать вычисления в запросе
|
|||
---|---|---|---|
#18+
Дмитрий П., например ... |
|||
:
Нравится:
Не нравится:
|
|||
26.02.2016, 19:40 |
|
Оптимизировать вычисления в запросе
|
|||
---|---|---|---|
#18+
sdku, Типичный ответ. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.02.2016, 21:33 |
|
Оптимизировать вычисления в запросе
|
|||
---|---|---|---|
#18+
ПЕНСИОНЕРКАДмитрий П.замкнутых контуров (запрещенные зоны) разной формы интересно, они выпуклые или есть вогнутости(например полумесяц) Хорошо, раз интересно, попробую краткий экскурс (главное не погрязнуть) : Плоскость - это печатная плата (ПП - на рис. коричневым) с установленными компонентами. На рис. синим показаны 2 (летающих) щупа установки. Всего их 6 - еще 2 сверху (с другим углом наклона) и 2 снизу. Как видно, из-за наклона, для каждого щупа вблизи любого компонента есть запрещенная (недоступная) для контактирования зона ("тень") на ПП. Так для правого щупа правая контактная площадка(показаны красным) нижнего комопонента - недоступна Т.е. ее нельзя назначать в качестве тестовой точки (она внутри контура тени). "Тень" включает в себя и зону под компонентом. Т.о. на поверхности ПП вокруг каждого компонента образуется контур "тени", форма и размер которого зависит от контура компонента, его высоты и наклона щупа. У каждого щупа свой контур - но зона под компонентом общая. Часто контур компонента (т.е. его условное изображение на Layout) это прямоугольник, один или несколько. Электролитич. конденсатор - это круг и т.д. Надо учитывать, что рисунок комопнента включаети также и его выводы т.к. они тоже могут "отбрасывать тень". А еще могут быть разные радиаторы и прочие конструктивные элемены. Т.о. могут быть и вогнутости. А еще, контуры зон (даже для одного щупа) от разных (высоких) компонентов могут пересекаться. В своем алгоритме я рассчитываю что форма контура может быть любой замкнутой ломанной. Но эта ломанная не может сама себя пересекать (типа "восьмерки"). ... |
|||
:
Нравится:
Не нравится:
|
|||
28.02.2016, 22:35 |
|
Оптимизировать вычисления в запросе
|
|||
---|---|---|---|
#18+
Дмитрий для решения подобных задач ACCESS однозначно не тот инструмент, который нужен ... |
|||
:
Нравится:
Не нравится:
|
|||
28.02.2016, 23:07 |
|
|
start [/forum/topic.php?all=1&fid=45&tid=1613866]: |
0ms |
get settings: |
10ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
420ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
64ms |
get tp. blocked users: |
1ms |
others: | 333ms |
total: | 858ms |
0 / 0 |