![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как узнать кол-во записей в запросе програмно?
White © (2004-04-01 19:57:00)Через Query забираются записи из таблицы (процедуры) следут узнать сколько записей возвращает запрос. Как узнать.
Vlad (2004-04-02 10:42:00) [1]
> Sergey_Masloff (02.04.04 10:39) [12]
> Vlad, ну ты ж знаешь ;-))
Знаю, знаю :-)
Только вот никак не могу придумать ситуацию когда жизненно необходимо вычислять Count для таких справочников...
;-)
Sergey_Masloff (2004-04-02 10:39:00) [2]Anatoly Podgoretsky ©, Vlad ©
Да я конечно знаю про этот момент. Я имею в виду вариант когда нужно узнать приблизительно кол-во записей. Обычно я делаю так: делаю select count(*) если количество - тысячи (сотни - настраивается) то отлуп "Критерий поиска не эффективен". Если немного то основной запрос и RecordCount. А так у нас справочник клиентов - миллионы (Vlad, ну ты ж знаешь ;-)) и какой-нибудь селект с like может и пару сотен тысяч притащить легко...
Vlad (2004-04-02 10:32:00) [3]Действительно, кол-во записей может меняться постоянно, поэтому данные первого запроса (select count) могут быть не актуальными для второго (с основной выборкой). Тогда уж надо блокировать таблицу или делать соответствующий уровень изоляции транзакции.
Anatoly Podgoretsky (2004-04-02 10:26:00) [4]Sergey_Masloff (02.04.04 09:32) [6]
Это только один аспект, а главный состоит в том, что два отдельных запроса в принципе совсем неправильно, количество записей может оказаться разным, точнее даже стоит считать, что оно разное. Речь не про однопользовательскую систему и не про систему с мелкой нагрузкой, а скажем про нормальную боевую систему. А вот RecordCount ошибки не даст, и не надо про большое количество записей, это тоже в принципе неверная работа, да и сомнение в данном счетчике как то не чувствуется.
Ozone (2004-04-02 10:20:00) [5]TO Sergey_Masloff[6]
Я имел в виду вариант когда нужно "SELECT <not *> FROM ..."
Sergey_Masloff (2004-04-02 09:51:00) [6]Vemer © (02.04.04 09:42) [7]
>Еще быстрее будет Counnt(ID_Field).
Нет будет медленнее так как сервер будет проверять поле на NULL даже если оно объявлено как NOT NULL. Вернее не всякий сервер это будет проверять но в лучшем случае выйдет на скорость select count(*)
Каунт со звездочкой всегда оптимизирован на наибольшую производительность.
Vemer (2004-04-02 09:42:00) [7]Еще быстрее будет Counnt( ID_Field).
Sergey_Masloff (2004-04-02 09:32:00) [8]Ozone © (02.04.04 07:27) [4]
>Не согласен.
А зря. Конечно, если запрос очень "тяжелый" а возвращает гарантировано немного записей то RecordCount сойдет. Если запросом может быть select * from XXX то однозначно Count(*) так при фетче пары миллионов записей на клиента будет как минимум зависание а может и у датасета "морда треснуть"
Кщд (2004-04-02 08:49:00) [9]Ozone © (02.04.04 07:27) [4]
так аргументируй
Ozone (2004-04-02 07:27:00) [10]TO DrPass ©[3]
Не согласен.
DrPass (2004-04-02 00:16:00) [11]А умнее будет сперва выполнить аналогичный запрос, только с агрегатом count(*)
Vemer (2004-04-02 00:08:00) [12]Только FetchAll сделать не забудь.
Vlad (2004-04-01 20:10:00) [13]
> White © (01.04.04 19:57)
Часто Query.RecordCount помогает :-)