Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

AdoDb.RecordSet и занимаемая им память. [MSSQL]


Страницы:   1 2

Дмитрий Тимохов ©   (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


Может кто-то объяснить сей феномен?


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо