Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2003.10.30;
Скачать: [xml.tar.bz2];

Вниз

InterBase   Найти похожие ветки 

 
Ru   (2003-10-09 17:53) [0]

1. Как узнать количество записей в таблице базы (RecordCount стабильно выдает 1)


 
Anatoly Podgoretsky   (2003-10-09 17:57) [1]

Нет не стабильно, сделай Lasr и посмотри снова.


 
Брат   (2003-10-09 17:59) [2]

Сначала делашь так:
IBTable.FetchAll или IBQuery.FetchAll
а затем считываешь RecordCount


 
Ru   (2003-10-09 18:02) [3]

>Anatoly Podgoretsky © (09.10.03 17:57) [1]

А что такое "Lasr"?

>Брат © (09.10.03 17:59) [2]

попробую


 
sniknik   (2003-10-09 18:06) [4]

> А что такое "Lasr"?
это Last набранное слепым методом и кривыми пальцами. :о))


 
kaif   (2003-10-09 18:27) [5]

Вообще-то в IB для этого запросы существуют.
Типа SELECT COUNT(*)...
Побыстрее фетча работают.


 
Johnny Smith   (2003-10-09 18:32) [6]

2kaif © (09.10.03 18:27) [5]
Вообще-то в IB для этого запросы существуют.
Типа SELECT COUNT(*)...
Побыстрее фетча работают.

Когда надо всего-навсего RecordCount узнать?
:)))))))


 
sniknik   (2003-10-09 18:55) [7]

Johnny Smith © (09.10.03 18:32) [6]
> Когда надо всего-навсего RecordCount узнать?
> :)))))))
именно тогда, запрос с ... COUNT(*) ... гораздо быстрее чем фетч до конца даже небольшой таблички, т.к. перекачивается всего 1 запись.
а качать все возможно и не нужно.

ну к примеру, делает юзер запрос а вы ему ограничение ставите если количество записей > 100 тысячь, то пресекать попытку, типа "милый, столько данных и за месяц не обработать. зачем тебе стока в конце рабочего дня?".
забота о юзере однако, заодно и трафик поэкономить. а вот если "всего-навсего RecordCount узнать" и зафетчить ради этого все, то есть вероятность что рабочий день юзера кончится так и не начавшись, потому как юзер он не один, их много и все они с утра начнут бомбардировать сервер неподьемными запросами.


 
dzh2000   (2003-10-09 21:10) [8]

sniknik абсолютно прав.
Правильнее добавить Query и сделать запрос типа select count(*).
Это и удобно и менее загружает систему, чем Last и FetchAll.


 
Ru   (2003-10-10 10:02) [9]

Такой уж совсем глупый вопрос:
Так это что для нормлаьной работы с InterBase мне все на SQL запросах делать?


 
Sergey_Masloff   (2003-10-10 10:12) [10]

Ru © (10.10.03 10:02) [9]
>Так это что для нормлаьной работы с InterBase мне все на SQL >запросах делать?
ес-сно.


 
Anatoly Podgoretsky   (2003-10-10 10:14) [11]

sniknik © (09.10.03 18:55) [7]
Только вот результаты могут быть разные, например запрос с ограничением записей. Но как правило все таки надо использовать count(*), но вопрос был не про это, а про то что мол RecordCount не работает. Во вторых неизвестно, что за запрос, возможно время его формирования значительно превосходит время перекачки результата по сети. Скажем некоторый длительный расчет, в результате которого будет выдано всего несколько записей.

Говорить точно можно только имея эти данные, но никак нельзя одназначно сказать какой метод будет быстрее.


 
Sergey13   (2003-10-10 10:16) [12]

2Ru © (10.10.03 10:02) [9]
>Так это что для нормлаьной работы с InterBase мне все на SQL запросах делать?
Для нормальной так проще.


 
Ru   (2003-10-10 10:20) [13]

В Paradox была такая удобная вещь как:
Table1.Next; а для InterBase (используя IBX) что нельзя сделать IBDataSet1.Next?


 
Mike Kouzmine   (2003-10-10 11:15) [14]

Можно. Но это другая песня.


 
sniknik   (2003-10-10 11:21) [15]

Anatoly Podgoretsky © (10.10.03 10:14) [11]
ну я то не отвечал на вопрос, а на поправку от Johnny Smith © [6], в общем случае. конечно нужно смотреть по конкретному случаю.

а кстати пример неправильной работы с SQL (все на таблицах, не используя возможности sql), у всех перед глазами, имею в виду 1С, все видели. переделывая их отчеты средствами SQL люди добиваются ускорения в сотни раз!!! (сделай так чтобы на твоей программе этого резерва не было :о))

Ru © (10.10.03 10:20) [13]
> В Paradox была такая удобная вещь как:
> Table1.Next; а для InterBase (используя IBX) что нельзя сделать IBDataSet1.Next?
почему нельзя, можно. только желательно знать что происходит, если в парадокс (локальный вариант) просто перемещался указатель таблице (типа Point + размер записи = указатель уже на следующей записи) очень быстро, то в случае с sql сервером два варианта, при уже полученном на локаль датасетом будет то же самое только в памяти а вот в случае с серверным курсором запись будет докачиватся с сервера если конечно она еще не закачена и вот тут возможны тормоза (последовательный перебор в серверном курсоре гораздо дольше чем закачка + перебор в локальном курсоре, тестил на ADO - MSSQL (думаю когда передается сразу весь рекордсет то он пакуется)).
в общем когда с работаеш локальным курсором то тормозит на открытии (данные качаются на клиента), с серверным тормозит на докачке а открывает быстро. узнать что тебе выгоднее, часто только эксперименты могут помоч.
(с каким курсором работает IBX и можно ли менять не знаю, не работал)


 
Жук   (2003-10-10 11:24) [16]


> sniknik © (09.10.03 18:55) [7]
> ну к примеру, делает юзер запрос а вы ему ограничение ставите
> если количество записей > 100 тысячь, то пресекать попытку,
> типа "милый, столько данных и за месяц не обработать. зачем
> тебе стока в конце рабочего дня?".

Предсталяю, что мне скажет главбух, когда после составления круто-навороченной выборки с кучей условий и пятиминутного ожидания выполнения запроса, прога ему мессагнет :"Милый,... и т.п." :-)


 
Danilka   (2003-10-10 11:33) [17]

[16] Жук © (10.10.03 11:24)
Скажет, "Какой-такой милый, я-же девушка, гомосек ты несчастный!"


 
Anatoly Podgoretsky   (2003-10-10 11:35) [18]

Жук © (10.10.03 11:24) [16]
И вот теперь представь, получение Count по такой выборке


 
Sergey13   (2003-10-10 11:38) [19]

2Жук © (10.10.03 11:24) [16]
>Предсталяю, что мне скажет главбух, когда после составления
Может его успокоит тот факт, что он получит сообщение ДО составления. Тогда он поймет что до конца рабочего дня он не успеет все это дело распечатать. 8-)


 
Ru   (2003-10-10 11:41) [20]

>sniknik © (10.10.03 11:21) [15]

пока у меня локальная база.
делаю так:
IBDataBase - для подключения к базе
IBTransaction - говорят надо
IBDataSet - для подключения к конкретной таблице базы
Делаю IBDataSet1.Next; - в результате ничего не происходит.
Я не использую стандартные компоненты для работы с базами (DBAware).


 
Жук   (2003-10-10 11:45) [21]


> Anatoly Podgoretsky © (10.10.03 11:35) [18]
> И вот теперь представь, получение Count по такой выборке

Про это и говорю. Получаем вместо одного запроса - два !
Нет кж. Уж лучше отфетчить и всё...


 
sniknik   (2003-10-10 11:57) [22]

Жук © (10.10.03 11:45) [21]
см. конкретный случай, в Anatoly Podgoretsky © [11] описано.

в абсолютном большинстве выборок передача данных гораздо дольше расчета, это если очень сложный запрос а выборке насколько значений то да.
в первом случае 2 запроса лутше во втором 1 с фетчем. а делать предпочтение только одному способу всегда это ...

Ru © (10.10.03 11:41) [20]
> Делаю IBDataSet1.Next; - в результате ничего не происходит.

посмотри может это виртуальный метод.
(и не спрашивай меня по IB, я с ним почти не работал, а с IBX вооще (только 1 раз. стах по IBX 1день :о)) ну чего я могу сказать?)


 
Alexandr   (2003-10-10 12:26) [23]

2Ru
слушай, ты такой крутой специалист по базам данных!
скажи мне только:
1) что такое Dbaware
2) как ты подключаешься к базе данных с помощью IBDatabase
3) как ты выбираешь таблицу, к которой надо подлючится в IBDataset? я не нашел там такого свойства
4) IBDataSet1.Next загружает следующую таблицу из базы данных, да?
если у тебя нет времени, чтоб написать ответы здесь, может подумаешь, сколько бы ты взял денег за пару консультаций по базам данных? У меня нет много денег, но думаю на несколько сотен у.е. сможем договориться.


 
Анонимщик   (2003-10-10 12:34) [24]

На пустом месте дискуссия.
А вообще-то для интербейза, из-за версионности, и count(*) плохо, но лучше, конечно, навигации.


 
Danilka   (2003-10-10 12:36) [25]

[24] Анонимщик © (10.10.03 12:34)
а по чему тогда в орокле с count(*) все хорошо? я имею ввиду то, что он тоже версионник.


 
Alexandr   (2003-10-10 12:41) [26]

оракл не версионник.
Он эмулирует версионник, что хорошо видно по ограничениям


 
Анонимщик   (2003-10-10 12:42) [27]

Danilka
Съел?


 
NickBat   (2003-10-10 12:45) [28]

Из-за чего весь сыр-бор то?

Практически всегда для серверной БД count будет быстрее FetchAll


 
Alexandr   (2003-10-10 12:47) [29]

а если после count все равно надо fetchAll делать, то есть ли смысл в count?


 
Danilka   (2003-10-10 12:50) [30]

[26] Alexandr © (10.10.03 12:41)
Серьезно? Надо будет уточнить, всегда считал его версионником, да и на sql.ru про него говорили что он версионник.
А какие у него ограничения? Что-то я не заметил там никаких ограничений наоборот.


 
Ru   (2003-10-10 12:51) [31]

>Alexandr © (10.10.03 12:26) [23]
>слушай, ты такой крутой специалист по базам данных!

я пытаюсь научиться

>1) что такое Dbaware

если не ошибся в написании (кажется я этого не делал), то это всего-навсего набор компонентов ориентированных на работу с базами данных. Точнее на отображение информации хранящейся в базе (пример: DBGrid)

>2) как ты подключаешься к базе данных с помощью IBDatabase

щелкаем правой клавишей мыши на IBDatabase, выбираем пункт меню "Database Editor ..." в появившемся окне указываем путь к базе, имя пользователя, пароль доступа, кодировку базы.
Подключение происходит при установке свойства IBDatabase в положение true

>3) как ты выбираешь таблицу, к которой надо подлючится в IBDataset? я не нашел там такого свойства

в IBDataset в свойстве "DataBase" указываешь базу (IBDatabase).
Заполняешь "SelectSQL" (Select * from MyTBL)
Затем правым щелчком мыши вызываешь меню, в котором выбираешь пункт "Dataset Editor ..." - нажимаешь кномпу "Generate SQL" - для генерации запросов необходимых для работы с таблицей.

>4) IBDataSet1.Next загружает следующую таблицу из базы данных, да?

данная инструкция (теоретически) переводит указатель с текущей на следующую, тобто если мы находимся на первой записи, то после выполнения данной инструкции мы будем находится на второй.


 
Alexandr   (2003-10-10 12:54) [32]

Danilka ©
там версии пишутся в отдельном журнале каком-то который может переполниться.
примерно так.


 
Alexandr   (2003-10-10 12:56) [33]

2Ru © (10.10.03 12:51) [31]
спасибо за подробный ответ.


 
Ru   (2003-10-10 12:57) [34]

>Alexandr © (10.10.03 12:56) [33]

но у меня сложилось впечатление, что вы знаете InterBase лучше меня


 
Анонимщик   (2003-10-10 12:59) [35]

Вообще-то я распоясался, Данилка, извини.
Насчет Оракла вообще ничего не знаю.
Насколько я понял из объяснений разработчиков FireBird"а, а они долго и упорно рассказывали о том, что никогда не будут делать ускорения count(*) (хотя, по моему, неправильному, возможно, мнению, во многих случаях это можно было бы им и сделать), этого самого ускорения не будет.
А автору вопроса могу предложить вариант: сделать триггер на внесение и удаление записей в таблицу, в котором изменять на единицу значение количества записей, и хранить это значение в отдельной таблице.
Предполагаю, также, что с этим возможны особенности, но описать их не берусь. Но в простейших случаях будет работать.


 
Alexandr   (2003-10-10 13:05) [36]

1) вот именно на триггере и можно сделать в особых случаях.
2) count по полной таблице не имеет большого смысла. Ибо главное - count по выборке. А тут уже на триггере не реализовать.
3) mssql например count вычисляет по индексу, ибо блокировочник.
interbase так не может, зато он может многое другое.


 
Johnmen   (2003-10-10 13:13) [37]

>Danilka © (10.10.03 12:50)

Оракл - блокировочник.

>Alexandr © (10.10.03 12:54)

Не совсем версии, а т.н. блоки отката и сегменты отката. Их данные помещаются в журнальный буфер, который можно сбрасывать на диск. Поэтому и появляется возможность "откатить" подтвержденные транзакции...
Вобщем присутствуют лишь некоторые признаки версионника :)


 
sts   (2003-10-10 13:19) [38]

Анонимщик © (10.10.03 12:59) [35]

Этого не делать ни в коем случае (впустую потраченное время).

Alexandr © (10.10.03 12:54) [32]

В сегменте отката они хранятся. С версиями там все хорошо.

ИМХО в IB можно пользоваться Count(*) хотя бы потому, что там сложный запрос не написать (во всяком случае без ХП) и они в основном простые. В Fib+ есть возможность делать это автоматически.

Ru © (09.10.03 17:53)

Кроме корректного отображения ScrollBar и прогресса обработки записей трудно представить для чего это может понадобиться.
ИМХО это дурь лишние запросы кидать на сервер.


 
Анонимщик   (2003-10-10 13:30) [39]

sts
Может, Нимцовича еще процитируешь о потере времени?
Почти уверен, что автор вопроса все равно будет делать долгий count(*)


 
Ru   (2003-10-10 13:35) [40]

>Анонимщик © (10.10.03 13:30) [39]

автор вопроса благоволучно сделал:
function TData.GetTabCnt(input: TIBDataSet): integer;
var
cn:integer;
begin
{отримати кількість записів у таблиці}
cn:=input.RecNo;
input.Last;
result:=input.RecNo;
input.First;
input.MoveBy(cn);
end;

И автора вопроса волнует другой вопрос: в чем состоит глюк, что не работает IBDataSet1.Next; ?



Страницы: 1 2 вся ветка

Форум: "Базы";
Текущий архив: 2003.10.30;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.56 MB
Время: 0.03 c
1-98651
учу
2003-10-17 11:03
2003.10.30
Перерисовка Image


1-98602
Эл
2003-10-19 14:08
2003.10.30
Зависимость форм от разрешения экрана


1-98591
kull
2003-10-17 14:35
2003.10.30
Проблема с модальными окнами!


1-98708
Hook
2003-10-21 09:45
2003.10.30
Проблема с компилятором (record)


1-98563
Герман
2003-10-20 12:44
2003.10.30
Система, ядро





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский