|
Оптимизировать вычисления в запросе
|
|||
---|---|---|---|
#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 |
|
|
start [/forum/topic.php?fid=45&msg=39179012&tid=1613866]: |
0ms |
get settings: |
10ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
39ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
61ms |
get tp. blocked users: |
1ms |
others: | 17ms |
total: | 160ms |
0 / 0 |