В Oracle 12C вы можете использовать лимит LIMIT
и OFFSET
для нумерации страниц.
Пример. Предположим, у вас есть таблица tab
, из которой необходимо извлечь данные на основе столбца DATE
типа данных dt
в порядке убывания с разбивкой на страницы.
page_size:=5
select * from tab
order by dt desc
OFFSET nvl(page_no-1,1)*page_size ROWS FETCH NEXT page_size ROWS ONLY;
Объяснение:
page_no = 1 page_size = 5
OFFSET 0 ROWS FETCH NEXT 5 ROWS ONLY
- Выбрать только первые 5 строк
page_no = 2 page_size = 5
OFFSET 5 ROWS FETCH NEXT 5 ROWS ONLY
- получить следующие 5 строк
и т. д.
Референсные страницы -
https://oracle-base.com/articles/12c/row-limiting-clause-for-top-n-queries-12cr1#paging
Это не будет работать для любого ссылочного типа . Это будет работать для Сериализуемых типов. Подключите BinaryFormatter
к потоку сжатия, который передается в файл:
var formatter = new BinaryFormatter();
using (var outputFile = new FileStream("OutputFile", FileMode.CreateNew))
using (var compressionStream = new GZipStream(
outputFile, CompressionMode.Compress)) {
formatter.Serialize(compressionStream, objToSerialize);
compressionStream.Flush();
}
Вы можете использовать MemoryStream
для хранения содержимого в памяти, а не для записи в файл. Однако я сомневаюсь, что это действительно эффективное решение для кеша.
Какие объекты вы помещаете в кэш? Это типизированные объекты? Или что-то вроде DataTable
? Для DataTable
, возможно, сохраните как xml, сжатый через GZipStream
. Для типизированных (сущностных) объектов вам, вероятно, потребуется сериализовать их.
Вы можете использовать BinaryFormatter
и GZipStream
, или вы можете просто использовать что-то вроде protobuf- net сериализацию (бесплатно), которая уже очень компактна (добавление GZipStream
обычно увеличивает размер данных - что типично для плотных двоичных файлов). В частности, преимущество таких вещей, как protobuf-net, заключается в том, что вы получаете уменьшенный размер без необходимости оплачивать затраты ЦП за его разархивирование во время десериализации. В некоторых тестах до добавления GZipStream
он был в 4 раза быстрее, чем BinaryFormatter
. Добавьте дополнительное время на BinaryFormatter
для GZip, и он должен выиграть с значительной разницей.