|  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. | 
|  | 
|  25.09.2015, 11:53 | #4 | 
| Участник | Цитата: Только, количеством записей, возвращаемых с сервера за раз мы не управляем И, как правильно выше заметили - это не значит, что SQL не будет напрягаться и хранить результат, если запрос связан с сортировками/группировками/объединениями 
				__________________ Axapta v.3.0 sp5 kr2 | 
|  | 
|  25.09.2015, 12:43 | #5 | 
| Участник | Цитата: но судя по логам и счетчикам на SQL - это не совсем так. по крайней мере для 2009. Цитата: я также в курсе про параметр "размер буфера", который был в конфигурационной утилите прошлых версий. хорошо, переформулирую вопрос. в Аксапте 2009 в QueryRun появились методы, которые, судя по названию, позволяют каким-то образом управлять paging. в частности, включать(!!) paging. Ссылки на msdn с примерами я привел в самом начале. Вопрос: У кого есть опыт работы с paging-методами в Query? Стоит ли этим заморачиваться? | 
|  | 
|  25.09.2015, 13:04 | #6 | 
| Участник | Цитата: определения: 
 собственно проблема: 
 еще раз: 
 В операциях, которые делают выборку, по каким-то бизнес-условиям забирают несколько записей из выборки и изменяют выборку (операции типа сопоставление)... в таких операциях хотелось бы использовать управляемый paging. собственно отсюда и вопрос - У кого есть опыт работы с paging-методами в Query? Стоит ли этим заморачиваться? в частности, даст ли гемор с pagin'ом лучший результат, чем автоматическая работа с однонаправленным серверным курсором? Последний раз редактировалось mazzy; 25.09.2015 в 13:31. | 
|  | |
| За это сообщение автора поблагодарили: gl00mie (3), -Dmitry- (0). | |
|  26.09.2015, 17:40 | #7 | 
| 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). | |
|  27.09.2015, 12:23 | #8 | 
| Модератор | 
			
			Я использовал (опосредованно) с 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). | |
|  27.09.2015, 14:53 | #9 | 
| Участник | Цитата: Facebook, VK и другие используют витрины данных, в которых находятся актуальные данные, например, за последнюю неделю или день. Также они использую горячий кэш и другое. Кстати, витрины данных очень часто используются в DWH: когда в хранилище есть данные за 20 лет, а, фактически, для оперативного анализа нужны данные только за последнюю неделю. В качестве решения делают витрину данных, куда с помощью ETL/ELT собирают нужные актуальные часто используемые данные. Даже in-memory системы у которых время выполнения "запроса" на порядки меньше чем у ROLAP, также используют витрины. Иначе не хватит никакой памяти :-) Также можно подумать о партицировании таблицы: то есть физически разбивать таблицу на несколько более мелких таблиц. Этот метод очень активно используется в SSAS на более-менее крупных данных. В AX хорошим примеров витрины данных является InventSum. | 
|  | |
| За это сообщение автора поблагодарили: mazzy (2), Weez (1). | |
|  28.09.2015, 11:52 | #10 | 
| Участник | Цитата: Цитата: поэтому и спрашиваю опыт работы, впечатления и ссылку на доку. Цитата: 
		
			Сообщение от 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 | #11 | 
| Участник | 
			
			Не совсем так. SQL Server будет обрабатывать все 1000 записей или более, потом наложит на них  ограничение в виде TOP или ROW_NUMBER и выдаст как раз те самые 10 записей. Для простых запрос, возможно, получиться сократить объём обрабатываемых данных до 900 записей, а может и не получится.
		 | 
|  | 
|  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, подкачка данных | 
|  | 
| 
 |