Вопрос: использует ли кто и чем хороша? 

Объясни плиз чё такое "default имя функции или запрос к СУБД" ?
Значение генератора ты можешь получить в любое время суток
select gen_id(Gen_Accounts, 0) from RDB$Database
от отсутвия частичных индексов я никогда не страдал
сурьёзную систему для большого предприятия
я нифига не понял
Сложная логика тока через триггеры. Не вижу здесь проблемы или неудобства. Даже наоборот: вижу здесь некоторе преимущество. Тебе не надо заботиться о валидности процедуры. Т.е. если тригеру передаются переменные, которые пользователь может менять или нет. То что будет, если новичёк в команде разработки поменяет тип возвращаемоего значения, а если количество возвращаемых параметров ?
Генераторы в firebird вне контекста транзакций. Они от транзакций не зависят. Значение действительно на момент получения.
Я подумал и так и не нашёл применение "последнему полученному в текущей транзакции занчению генератора". Если речь идёт об уникальном идентификаторе в базе только что вставленной записи, то, как я уже приводил пример с хранимой процедурой, делается всё элементарно.
Хотел попробовать pg на одном интернет проекте (cms), но ты меня напугал тормозными count(*). Кто-нибудь делал обстоятельный тест быстродействия таких моментов ? Почитать где-нибудь можно на эту тему что-нибудь ?
Пример для Делфы. Например есть код, который вставляет запись в БД (ну например DB грид, или просто DataSet) и хочется получить не много не мало значение поля ID которое вставилось на в БД. Этого сделать нельзя. Да, я прекрастно понимаю, что это можно обойти, и в конце концов везде обходится, но когда с этим столкнулся при добавлении в проект поддержки FireBird пришлось попотеть что бы переделать логику работы приложения.
В FIBPlus с использованием TpFIBDataSet.AutoUpdateOptions подобных проблем нет
Твой пример с count в файербёрд мне воспроизвести не удалось - работает как часы. Но. Буду пытаться.
первый запрос через ibexpert
select count(*) from test_table;
где в test_table 300000 уникальных строковых неиндексированных записей 500ms
на p4 3.2GHz, 1GB ram, 120 Gb IDE
Индекс по полю есть но он не используется
И не должен.
Здрасте. Если делаем выборку по всем записям без упорядочений - где тут место индексу??? Он только тормозить выборку будет.
Индекс - это набор полей, хранящийся в упорядоченном виде для ускорения доступа по ключу.
Как ты собрался по индексу определять количество записей?
В таком случае количество записей и индекс меж собой ну никак не взаимосвязаны. Я тебе так же скажу, что таблица (без индексов) имеет нее..чески сложную структуру и там вполне может найтись место для количества записей. Дело индекса - быстрая выборка. А такая фигулька, как кол-во записей храниться может где угодно. Приплетать к этому индекс, который может дропаться/создаваться заново, смысла не вижу.
Продолжаем разговор.
Пусть есть таблица A на 10^7 записей, тобто десять лимонов. Каждая запись "весит" пусть по 2Кб. Есть индекс по полю a, который отсеивает в 10 раза, т.е. остается 10^6. Естественно, что select count(a) FROM huge_table WHERE a=3 будет использовать индекс для фильтрации, но не будет для count(a). А мог бы. По крайней мере в теории.
Цитата:
Продолжаем разговор.
Забыл добавить (C)
При чем тут вес записи?
Что значит "индекс ... , который отсеивает" Сам по себе индекс, как структура в базе, ничего не отсеивает. Что ты хотел этим сказать?
select count(a) FROM huge_table WHERE a=3 будет использовать индекс для фильтрации
Угу.
но не будет для count(a)
А тут то зачем? Count имеет дело с уже отфильтрованной выборкой. Фильтрация проводилась по индексу и это правильно. А чтобы посчитать количество записей, нужно пробежаться по всей выборке. Конечно, можно количество считать в процессе выборки, но опять таки индекс приплетать незачем. Записи выбираются по индексу - это да. А при выполнении fCount++ на каждой полученной записи, индексу места нет - он уже отработал - выдал очередную запись.
Сдается мне, мы по разному понимаем, что такое индекс. Для меня индекс - упорядоченная структура в базе, каждый элемент которой ссылается на свою запись для ускорения доступа к записи по ключу. И не более. Если для тебя это нечто другое, приведи свое определение.
Ну, не записи, а ссылки на записи получаются из индекса.
Индекс занимает существенно меньше места, и "легче" "поднимается" в память, соответсвенно это будет гораздо быстрее. Размер индекса может быть в десятки/сотни раз меньше размера таблицы (в байтах).
А для count() нет, хотя мог бы
Вон оно что имелось в виду. Теперь ясно.
Хм, тут палка с двумя окончаниями Если проверять, существует ли запись в таблице реально (вдруг индекс порушенный) то не мог бы - все равно ведь как минимум ключевое поле каждой записи (закоммиченной, ессно, если она вставлена и еще не коммичена, ей может и ролбак прилететь) пощупать для уверенности надо.
орошо бы узнать, как реализован count() у фаерберда, с проверкой, али без.
Запросы могут содержать выборку данных в определенное время, в определенном интервале времени. Например, результатом запроса
SELECT city, population FROM cities['epoch','now'] WHERE city='Moscow';
будет являться следующая таблица: city population
Moscow 7 360 000
Moscow 8 950 000
Предыдущая тема: WinAPI