Получить ответ от БД пока запрос ещё не окончен
От: Jules  
Дата: 08.04.24 20:29
Оценка:
Допустим я прошу выполнить запрос вида
SELECT 
  name, version
FROM 
  view_name
WHERE
  condition
ORDER BY 
  rank

но данных очень много или запрос сложный.

Могу ли я как-то указать БД и получить гарантии, что
1. результаты будут возвращаться пачками (например, по 10 штук) пока запрос ещё не завершён (допустим он минуты длится)
2. если в первой пачке вернулись rank-и 1,3,10, то в следующей будут уже 10 или больше
3. запрос можно отменить

Интересует в первую очередь про PostgreSQL из-под .net core EF.
postgresql ef
Re: Получить ответ от БД пока запрос ещё не окончен
От: cppguard  
Дата: 08.04.24 20:48
Оценка: +1
Здравствуйте, Jules, Вы писали:

J>Могу ли я как-то указать БД и получить гарантии, что

J>1. результаты будут возвращаться пачками (например, по 10 штук) пока запрос ещё не завершён (допустим он минуты длится)
J>2. если в первой пачке вернулись rank-и 1,3,10, то в следующей будут уже 10 или больше
J>3. запрос можно отменить

курсоры, при условии что есть индекс по rank

А что, на ваших вайтишных курсах даже этого не рассказывают?
Re: Получить ответ от БД пока запрос ещё не окончен
От: m2user  
Дата: 08.04.24 22:46
Оценка:
J>Интересует в первую очередь про PostgreSQL из-под .net core EF.

См. DbDataReader, и DbDataReader.ReadAsync
Если используется ADO.NET провайдер Npgsql, то также NpgsqlDataReader
Прo EF ничего подсказать не могу . См. https://www.npgsql.org/efcore/index.html
Re: Получить ответ от БД пока запрос ещё не окончен
От: romangr Россия  
Дата: 09.04.24 13:29
Оценка: +1
Здравствуйте, Jules, Вы писали:

J>Могу ли я как-то указать БД и получить гарантии, что

J>1. результаты будут возвращаться пачками (например, по 10 штук) пока запрос ещё не завершён (допустим он минуты длится)
J>2. если в первой пачке вернулись rank-и 1,3,10, то в следующей будут уже 10 или больше
J>3. запрос можно отменить

J>Интересует в первую очередь про PostgreSQL из-под .net core EF.


В MS SQL Server есть возможность в тексте запроса указать нужные хинты
SELECT *
FROM [AdventureWorks].[Sales].[SalesOrderDetail] s
     INNER JOIN [AdventureWorks].[Production].[Product] p ON p.ProductID = s.ProductID
   OPTION ( FAST 1);


В PostgreSQL, насколько я знаю, есть некий модуль pg_hint_plan, делающий что-то похожее, см, например, тут.
Ну и отдельный момент, как это все подружить с EF. Я использую linq2db, и там такая возможность есть.
... << RSDN@Home 1.3.110 alpha 5 rev. 62>>
Re: Получить ответ от БД пока запрос ещё не окончен
От: Maniacal Россия  
Дата: 09.04.24 13:42
Оценка: 2 (1) +1
Здравствуйте, Jules, Вы писали:

J>Могу ли я как-то указать БД и получить гарантии, что

J>1. результаты будут возвращаться пачками (например, по 10 штук) пока запрос ещё не завершён (допустим он минуты длится)
J>2. если в первой пачке вернулись rank-и 1,3,10, то в следующей будут уже 10 или больше
J>3. запрос можно отменить

J>Интересует в первую очередь про PostgreSQL из-под .net core EF.


У PostgreSQL точно есть bulk fetch, когда запрашиваешь пачку из заданного количества записей. Вернётся или сколько запросил или меньше, если столько записей нет. Повторный fetch вернёт следующую порцию.
Насчёт .NET не знаю, делал через самописную обёртку над библиотекой libpq. Через объявление курсора (DECLARE <имя курсора> CURSOR FOR дальше SELECT), потом уже PQexecParams с указанием запроса "FETCH <количество записей> IN <имя курсора>" с предварительно заготовленными параметрами.
Re: Получить ответ от БД пока запрос ещё не окончен
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 09.04.24 14:38
Оценка: +1
Здравствуйте, Jules, Вы писали:

J>Интересует в первую очередь про PostgreSQL из-под .net core EF.


База данных отдает строки сразу же как может.
Например если у тебя строки упорядочены при чтении (индекс), то первая строка будет отдана сразу как только будет прочитана.
А если у тебя есть сортировка в плане запроса, то первая строка появится после того как резалтсет будет отсортирован, а это случится после того как все будет прочитано.

Поэтому готовь нормально индексы и строки будут отдаваться сразу, до того как все прочитается.
Re: Получить ответ от БД пока запрос ещё не окончен
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 09.04.24 18:13
Оценка:
Здравствуйте, Jules, Вы писали:

Пять способов пагинации в Postgres, от базовых до диковинных
и солнце б утром не вставало, когда бы не было меня
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.