|
25.09.2015, 07:41 | #1 |
Участник
|
ax2009, 2012. У кого есть опыт работы с paging в Query? Стоит ли этим заморачиваться?
У кого есть опыт работы с paging в Query? Стоит ли этим заморачиваться?
методы пагинации https://msdn.microsoft.com/en-us/lib...(v=ax.50).aspx https://msdn.microsoft.com/en-us/lib...(v=ax.50).aspx https://msdn.microsoft.com/en-us/lib...(v=ax.50).aspx идея разбиения на страницы, например, здесь http://www.quizful.net/post/paging-in-sql идея в том, чтобы сказать как то SQL'ю что не нужно делать выборку всех-всех-всех записей (а их там может быть сотни тысяч) а достаточно выбрать первые 1000 или 100... но в случае необходимости, дозапросить еще. в режиме paging SQL должен использовать существенно меньше памяти для хранения результатов выборки. а также готовить результат гораздо быстрее. при этом совершенно не хочется делать "закат солнца вручную" и вручную разбивать на страницы и отслеживать уже просмотренные записи... в общем, есть ли у кого-нибудь опыт работы с методам paging? где подсмотреть документацию и примеры работы с этими методам? (на аксфоруме только sumitax: Paging using QueryRun Class in AX ) |
|
25.09.2015, 10:33 | #2 |
Участник
|
Какая интересно задача привела к такой проблеме? т.е. что мешает из квери просто выбрать 100 записей и остановиться или продолжить если нужно. и откуда уверенность что
"в режиме paging SQL должен использовать существенно меньше памяти для хранения результатов выборки. а также готовить результат гораздо быстрее." как минимум если будет сортировка не по индексам это не так |
|
25.09.2015, 10:49 | #3 |
Участник
|
закрытие склада, сопоставление. и подобные задачи.
там где ведется поиск первых подходящих записей... а после того, как найдено, выполняется обработка, которая меняет входящий набор. в результате (языком аксапты) приходится делать queryrun.reset Цитата:
правда SQL напрягается и готовит результаты для всей выборки, а не для 100 записей. а в выборке может быть 100500+ записей Цитата:
Поэтому и спрашиваю. А вообще говоря, весь интернет именно на этом и живет - без paiging ни один боль-мень серьезный форум, ни один фейсбук-вконтакт не выживет. я ж привел ссылку "идея разбиения на страницы, например, здесь http://www.quizful.net/post/paging-in-sql " можно еще поискать. бггг. вообще говоря, выборка индексов и выборка данных по найденным индексам - на SQL - это разные вещи Думаю, что стоит почитать теорию. Давайте вернемся к вопросу. В Аксапте кто-нибудь этот paging использовал? Последний раз редактировалось mazzy; 25.09.2015 в 10:52. |
|
27.09.2015, 14:53 | #4 |
Участник
|
Цитата:
Facebook, VK и другие используют витрины данных, в которых находятся актуальные данные, например, за последнюю неделю или день. Также они использую горячий кэш и другое. Кстати, витрины данных очень часто используются в DWH: когда в хранилище есть данные за 20 лет, а, фактически, для оперативного анализа нужны данные только за последнюю неделю. В качестве решения делают витрину данных, куда с помощью ETL/ELT собирают нужные актуальные часто используемые данные. Даже in-memory системы у которых время выполнения "запроса" на порядки меньше чем у ROLAP, также используют витрины. Иначе не хватит никакой памяти :-) Также можно подумать о партицировании таблицы: то есть физически разбивать таблицу на несколько более мелких таблиц. Этот метод очень активно используется в SSAS на более-менее крупных данных. В AX хорошим примеров витрины данных является InventSum. |
|
|
За это сообщение автора поблагодарили: mazzy (2), Weez (1). |
28.09.2015, 11:52 | #5 |
Участник
|
Цитата:
Цитата:
поэтому и спрашиваю опыт работы, впечатления и ссылку на доку. Цитата:
Сообщение от AP-1055D
Я думаю, что вы немного неправильно употребляете термин пагинация (paging). Пагинация это механизм, с помощью которого можно "отдавать" данные определёнными порциями. В терминах MVC (Model-View-Controller) это C (Controller). По ссылке, которую вы привели, речь идёт как раз о том, как можно отдавать клиенту небольшое количество записей.
... В AX хорошим примеров витрины данных является InventSum. Да, клиент запрашивает порцию, а SQL отдает и готовит только порцию, а не всю выборку. Да, у SQL возникают дополнительные накладные расходы когда запрашивается порция, близкая к концу выборки. но я не зря начал говорить про операции типа "сопоставление" ))) см. начало ветки. да, про витрины данных понял. ========================== мне коллеги подсказали доку. оказывается есть описалово. оказывается по-русски это называется "подкачка данных". кто бы мог подумать! дока в книге "Справочник профессионала. Microsoft Dynamics AX 2009". Авторы Ларс Олсен и прочие. вышло в 2009 году под патронажем АНД Проджект Скриншоты: https://yadi.sk/i/mSWTMBbKjNH8H https://yadi.sk/i/9xTQDYjAjNHAs https://yadi.sk/i/buBvwyYCjNHCw https://yadi.sk/i/yfToQi9sjNHEB Да, как я и ожидал, используется ROW_NUMBER со всеми его ограничениями, достоинствами и недостатками. https://msdn.microsoft.com/ru-ru/lib...=sql.110).aspx https://support.microsoft.com/ru-ru/kb/186133 Спасибо! |
|
|
За это сообщение автора поблагодарили: Maxim Gorbunov (2), Dumfag (1). |
28.09.2015, 12:05 | #6 |
Участник
|
Не совсем так. SQL Server будет обрабатывать все 1000 записей или более, потом наложит на них ограничение в виде TOP или ROW_NUMBER и выдаст как раз те самые 10 записей. Для простых запрос, возможно, получиться сократить объём обрабатываемых данных до 900 записей, а может и не получится.
|
|
25.09.2015, 11:53 | #7 |
Участник
|
Цитата:
Только, количеством записей, возвращаемых с сервера за раз мы не управляем И, как правильно выше заметили - это не значит, что SQL не будет напрягаться и хранить результат, если запрос связан с сортировками/группировками/объединениями
__________________
Axapta v.3.0 sp5 kr2 |
|
25.09.2015, 12:43 | #8 |
Участник
|
Цитата:
но судя по логам и счетчикам на SQL - это не совсем так. по крайней мере для 2009. Цитата:
я также в курсе про параметр "размер буфера", который был в конфигурационной утилите прошлых версий. хорошо, переформулирую вопрос. в Аксапте 2009 в QueryRun появились методы, которые, судя по названию, позволяют каким-то образом управлять paging. в частности, включать(!!) paging. Ссылки на msdn с примерами я привел в самом начале. Вопрос: У кого есть опыт работы с paging-методами в Query? Стоит ли этим заморачиваться? |
|
27.09.2015, 12:23 | #9 |
Модератор
|
Я использовал (опосредованно) с AIF и его change tracking
Цитата:
Стоит ли этим заморачиваться?
Цитата:
Сообщение от Maxim Gorbunov
Если верить вот этому - https://technet.microsoft.com/en-us/.../gg840967.aspx - paging автоматически включается для всех запросов через Query Service
Цитата:
If you pass a NULL paging object to the query service, it will not use any paging and will return all records for the specified query up to the maximum record limit
__________________
-ТСЯ или -ТЬСЯ ? |
|
|
За это сообщение автора поблагодарили: mazzy (2). |
25.09.2015, 13:04 | #10 |
Участник
|
Цитата:
определения:
собственно проблема:
еще раз:
В операциях, которые делают выборку, по каким-то бизнес-условиям забирают несколько записей из выборки и изменяют выборку (операции типа сопоставление)... в таких операциях хотелось бы использовать управляемый paging. собственно отсюда и вопрос - У кого есть опыт работы с paging-методами в Query? Стоит ли этим заморачиваться? в частности, даст ли гемор с pagin'ом лучший результат, чем автоматическая работа с однонаправленным серверным курсором? Последний раз редактировалось mazzy; 25.09.2015 в 13:31. |
|
|
За это сообщение автора поблагодарили: gl00mie (3), -Dmitry- (0). |
26.09.2015, 17:40 | #11 |
Administrator
|
Если верить вот этому - https://technet.microsoft.com/en-us/.../gg840967.aspx - paging автоматически включается для всех запросов через Query Service. Могу ошибаться, но, как мне кажется, этим сервисом пользуется, например, Enterprise Portal, чтобы вытаскивать данные из Аксапты, и поэтому у GridView в web-контролах есть свойство AllowPaging.
Примеров использования в X++ не много, и они, в основном, связаны с реализацией сервисов. Если я правильно тебя понял, то ближе всего к тому, что ты ищешь, чтение из базы картинок перед их деплойментом на портал. Посмотри методы в классе SysEPDeployment deployCompanyImages() -> loopOverImagesInPartition() -> getImagesFromPartition() (это в AX 2012). Только я не очень понимаю, как это тебе поможет оптимизировать закрытие или сопоставление. Исходя из чего ты собираешься ограничивать размер страницы? Кроме того, как уже было замечено, paging накладывает некоторые ограничения на сортировку/группировку (ну или наоборот, сортировка/группировка ограничивает paging).
__________________
Not registered yet? Register here! Have comments, questions, suggestions or anything else regarding our web site? Don't hesitate, send them to me |
|
|
За это сообщение автора поблагодарили: mazzy (2). |
28.09.2015, 12:10 | #12 |
Участник
|
Наверное, в данном случае, это я неправильно понял вас. Если говорить о конечном результате, то, да, всё верно. А вот под капотом SQL Server все немного иначею
|
|
|
За это сообщение автора поблагодарили: mazzy (2). |
12.11.2015, 09:03 | #13 |
Участник
|
Начиная с SQL Server 2012, для пагинации можно использовать OFFSET и FETCH:
SELECT DepartmentID, Name, GroupName FROM HumanResources.Department ORDER BY DepartmentID OFFSET 10 ROWS FETCH NEXT 10 ROWS ONLY; |
|
Теги |
paging, подкачка данных |
|
|