![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Траблы с запросом [D6, IB6.x]
}|{yk © (2005-01-20 13:09:00)Такой вот запрос
SELECT APP_LOG_TIME,
APP_LOG_OPERATION,
APP_LOG_OLD_VALUE,
APP_LOG_NEW_VALUE,
DML_CODE,
APP_LOG_ID,
APP_LOG_TABLE,
STATUS,
REASON
FROM APP_LOG
where
STATUS='not sended' or
STATUS=:inSTATUS1 or
STATUS=:inSTATUS2 or
STATUS=:inSTATUS3
order by APP_LOG_TIME
во первых, при исполнении хавает 60 Мб на таблице из 9000 записей. Но это ладно. Но при прохождении по таблице с начала до конца на 6 тыс записей сообщает Out of memory. Хотя прога занимает 35 Мб памяти, и свободной памяти много. Что сделано неправильно? FB 1.5.2
msguns (2005-01-20 17:53:00) [1]Жук, поясни для тупых: где тормоз-то: на выполнении запроса или на сканировании ?
И зачем вообще сканировать ?
Если не секрет, конечно.
Danilka (2005-01-20 16:05:00) [2]а грид тогда зачем? а если я в гриде буду листать, вылетит?
Ega23 (2005-01-20 16:02:00) [3]2 }|{yk © (20.01.05 15:57) [14]
DisabledControls
EnabledControls
ставил?
}|{yk (2005-01-20 15:57:00) [4]Вобщем, решил эту проблему следующим образом. Перед проходом по датасету устанавливаю dataset грида в nil. После окончания - восстанавливаю обратно. Работает, причем довольно быстро
}|{yk (2005-01-20 15:36:00) [5]В продолжение... Если поставить UniDirectional в true то все работает быстро. Но! Первые двадцать записей с непонятных мне причин имебт такие индексы: 1,20,1,20,1,20...22,23,24 и дальше нормально! Если же UniDirectional = false, то на 6 тысяче Out of memory
Vlad (2005-01-20 15:10:00) [6]
> }|{yk © (20.01.05 15:07) [11]
Сделай индекс по APP_LOG_TIME
}|{yk (2005-01-20 15:07:00) [7]Пожирание 60 Мб было связано с... order by APP_LOG_TIME. Поставил order by LOG_ID - FB на запрос отнимает всего 5 Мб!
Ega23 (2005-01-20 14:48:00) [8]2 }|{yk © (20.01.05 13:09)
Оффтоп.
Я бы на твоём месте поле STATUS или целочисленным сделал, или вообще в отдельную таблицу бы вынес. Хранить строки как-то...
}|{yk (2005-01-20 14:45:00) [9]Можно поставить UniDirectional := True. Но случился какой-то непонятный глюк и 20 записей в нужный файл так и не попало
Johnmen (2005-01-20 14:42:00) [10]>}|{yk ©
Какой размер записи ?
}|{yk (2005-01-20 14:17:00) [11]При выполнении в IBExpert запрос так же хавает 60 Мб памяти сервера. Но отфетчить записи можно.
Desdechado (2005-01-20 14:16:00) [12]у тебя случайно блобы не достаются?
это не блобы ли: APP_LOG_OLD_VALUE, APP_LOG_NEW_VALUE
Out of memory - это ClientDataSet может говорить, если фетчишь много и с блобами (поставь fetchblobondemand)
Danilka (2005-01-20 13:39:00) [13]
> во первых, при исполнении хавает 60 Мб на таблице из 9000
> записей. Но это ладно. Но при прохождении по таблице с начала
> до конца на 6 тыс записей сообщает Out of memory. Хотя прога
> занимает 35 Мб памяти, и свободной памяти много. Что сделано
> неправильно? FB 1.5.2
Если запустить запрос в ИБЭксперте и пролистать результат выполнения до конца, то-же самое происходит?
Сдается мне что дело не в запросе и не в индексах (9к записей без всяких индексов такой запрос шустро отработает), а в том, что ты делаешь "при прохождении по таблице с начала до конца".
Соловьев (2005-01-20 13:28:00) [14]а какой тогда смысл проверки? 8)
Соловьев (2005-01-20 13:27:00) [15]тогда не надо
}|{yk (2005-01-20 13:26:00) [16]Смысл индекса в поле, где может быть только 4 варианта?
Соловьев (2005-01-20 13:14:00) [17]индекс есть по APP_LOG_TIME? STATUS?
Попробуй
...
where STATUS in('not sended', :inSTATUS1, :inSTATUS2, :inSTATUS3)
...