![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
AdoDb.RecordSet и занимаемая им память. [MSSQL]
Дмитрий Тимохов © (2011-03-18 19:46:00)Добрый день.
1. Сначала ситуация:
У меня есть строка:
RS := Cmd.Execute(...); // RS - это AdoDb.Recordset, а Cmd - это AdoDb.Command
После выполнения строки занятая виртуальная память сразу увеличивается на 1 Гб.
Я возвращаю 500000. Но это данные от силы на 50Мб, ну никак не 1Гб.
Поразбиравшись я пришел к выводу, что 1 Гб - это как раз сумма значений DefinedSize каждого поля, каждой строки RS.
Я был подумал, что неужели авторы AdoDb так устроили менеджмент памяти, что для типов переменной длины резервируют память по максимуму!!!! Не может быть, думаю. Начал делать тесты с другими запросами.
В итоге я пришел к выводу, что в более простых случаях, когда полей не 20, а меньше Recordset хранит данные в памяти более оптимально даже при 500000 и более строк! Даже с полями varchar!
Т.е. картинка такова - при каком-то количестве полей Recordset начинает хранить в памяти данные не оптимально!
2. Теперь, что интересует.
Не видел ли кто-то подобного поведения?
Есть ли документальное объяснение подобному поведению?
Может настройки у AdoDb есть какие?
sniknik (2011-03-18 21:15:00) [21]> Может кто-то объяснить сей феномен?
поменяй порядок "тестов", и получишь другие результаты, скорее всего.
Anatoly Podgoretsky (2011-03-18 20:35:00) [22]Ты неправильно считаешь размер для строк, он реально больше на 12/16 байт. А здесь все понятно, разный размер буфера, как решит система, для 255 решила выделить полный буфер, а в двух других случаях только по 10%
Дмитрий Тимохов (2011-03-18 20:04:00) [23]Да, забыл сказать. В таблице notea Data - это varchar(7500)
Дмитрий Тимохов (2011-03-18 20:02:00) [24]Это феномен какой-то
Такой запрос дает 125Мб прироста (т.е. это 500000*255 байт)
create table #t (Data varchar(255))
insert #t select top 500000 cast(data as varchar(255)) from notea
select * from #t
Такой 12Мб прироста (т.е. реальные данные):
create table #t (Data varchar(200))
insert #t select top 500000 cast(data as varchar(200)) from notea
select * from #t
И такой дает те же 12Мб прироста:
create table #t (Data varchar(400))
insert #t select top 500000 cast(data as varchar(400)) from notea
select * from #t
Может кто-то объяснить сей феномен?