![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Скорость выборки
Piter © (2004-12-18 18:50:00)Есть такое выражение:
'SELECT Count(n) From MyTable Where n=0'
Выборка длится около 4 секунд :(
Всего записей в базе 4700.
Почему так медленно? Правда, стоит заметить, что это только первый раз так долго. Потом такие выражения выполняются не более 100 мс, но все равно - загрузка программы происходит очень долго из-за этого.
Такое ощущение, что это как бы инициализация работы с таблицей. То есть, при первой выборке из этой таблице что-то там делается долго, после чего последующие выборки из этой таблицы отрабатывают оперативно. Ну это мне так кажется.
Можно как-нибудь ускорить процесс? А то 4 секунды - это перебор все таки, имхо, на Athlon 1800. Не понимаю, как тогда работают базы с миллионами записей...
Использую базу Firebird Embedded
DrPass (2005-01-04 00:19:00) [1]Если бы оный пациент покромсал свою прогу и базу, да выложил ее для тестов, все бы решилось в момент. А вообще - побить его да выгнать, дабы не мешал людям новогодние праздники ощущать
Zacho (2005-01-03 22:13:00) [2]Sergey_Masloff (03.01.05 21:56) [108]
Мне это тоже крайне любопытно :)
Sergey_Masloff (2005-01-03 21:56:00) [3]Zacho © (03.01.05 21:35) [107]
>И в трезвом виде тоже не смог :)
Я тоже не смог хотя вообще практически не пью. Но пациент упорствует в ереси. Может какой-то редкий случай?
Zacho (2005-01-03 21:35:00) [4]Sergey_Masloff (03.01.05 21:07) [106]
Я действительно счас пьян, но как не пытался, такого получить не смог. И в трезвом виде тоже не смог :)
Sergey_Masloff (2005-01-03 21:07:00) [5]Zacho © (03.01.05 21:05) [105]
>И ащё - ПК сделай наконец, да ?
Уже сделал он же ж ;-). Ускорение было но недостаточное. Хотя в цифрах бы... Желательно на таблице тысяч 500 записей.
Zacho (2005-01-03 21:05:00) [6]Piter © (03.01.05 15:43) [103]
И ащё - ПК сделай наконец, да ?
Sorry, Миша, пьян я счас...
А воообще, зачем up ? Усё уже разжевали...
DrPass (2005-01-03 19:32:00) [7]Ты все ж таки попробуй поработать с файловой системой - сперва выполни дефрагментацию диска, на котором лежит база, а после этого - backup-restore самой базы.
Piter (2005-01-03 15:43:00) [8]up
Piter (2004-12-21 21:42:00) [9]Anatoly Podgoretsky © (21.12.04 13:13) [101]
И насчет скорости select я думаю тоже лукавит, наверняка серверный курсор и эта скорость только скорость выборки очень небольшой части данных
вполне может быть. Я четко писал что делал - выполнял выражение "SELECT * FROM TestTable" из IBConsole и приводил его статистику.
Anatoly Podgoretsky (2004-12-21 13:13:00) [10]Имено так, плюс сумма выполнения обеих запросов, плюс возможное расхождения количества, по первому и второму запросу (для embeded неважно). И насчет скорости select я думаю тоже лукавит, наверняка серверный курсор и эта скорость только скорость выборки очень небольшой части данных, а не всего запроса.
Zacho (2004-12-21 11:53:00) [11]WondeRu © (21.12.04 11:27) [98]
Не будет он быстрее работать. Ну, разве что, в каких-либо совсем экзотических случаях.
Кстати, я регулярно использую FetchAll и RecordCount для отчетов. Все равно весь резалтсет фетчить, так заче ещё один запрос ?
sniknik (2004-12-21 11:49:00) [12]> а попробуй еще раз - мне кажется ты ошибся. Ибо даже на SQL.ru писали, что count(*) поднимает всю таблицу и кеширует ее.
сколько ж еще пробовать? ;о) я себе доверяю. хотя проверил еще раз, на работе. то же самое (методов не менял)
зависит от компонентов/движка? я же писал использовал ADO для теста.
может я тебе всетаки вышлю прогу (если адрес даш ;)
надо будет скачать OLEDB провайдера (установка элементарная, регистрация dll там bat файл есть для этого)
http://zstyle.dp.ua/rus/iboledb_prod.htm
строка подключения будет примерно такая
Provider=IBOLE.Provider.v4;Password=masterkey;Persist Security Info=True;Data Source=D:\CONMAN.GDB
и вот на нем и пробуй с count(*) и простой запрос. все адекватно работает (небольшая задержка тоже понятна, в прежнем посте писал предполагаемые причины, непонятна была большаязадержка).
(здесь я просто представляю как все работает, а в твоих компонентах х.з. ощущение такое что у тебя для каунта действительно полная выборка используется и проверка recordcount а вот простой селект открывается с серверным курсором... вот кстати проверь, померь время не после Query.Open; а после Query.Open; Query.Last; (закачки на клиента))
WondeRu (2004-12-21 11:27:00) [13]jack128 © (21.12.04 11:13) [97]
Только вот бредовый это способ...
если он быстрее будет работать, тогда чего мучаться??
jack128 (2004-12-21 11:13:00) [14]WondeRu © (21.12.04 9:00) [96]
для IBX RecordCount - это кол-во отфетчиных записей. Для коректной работы нужно в [89] после Open добавить FetchAll. Только вот бредовый это способ...
WondeRu (2004-12-21 09:00:00) [15]Piter © (21.12.04 0:40) [94]
она у тебя ноль выдаст
ты пробовал?????
WondeRu (2004-12-21 09:00:00) [16]Piter © (21.12.04 0:40) [94]
она у тебя ноль выдаст
ты пробовал?????
Piter (2004-12-21 00:40:00) [17]она у тебя ноль выдаст
Piter (2004-12-21 00:39:00) [18]AlterEgo of WondeRu © (21.12.04 0:17) [91]
или я не прав?
не прав
AlterEgo of WondeRu (2004-12-21 00:22:00) [19]попробуй... хотя справка говорит:
Generally, an application should only use RecordCountwith Paradox and dBASE tables.
AlterEgo of WondeRu (2004-12-21 00:17:00) [20]Piter © (21.12.04 0:11) [90]
какой ответ получится если проверять RecordCount?
думаю тоже самое что и при count(*)! или я не прав?