Страница 1 из 1
Чем заменит MAX в запросе?
Добавлено: 17 май 2006, 10:22
avenger
Привет всем!
Подскажите пожалуйста, чем можно заменит MAX в данном запросе?
Код: Выделить всё
$sql = "SELECT MAX(MESSAGEID) FROM MESSAGES WHERE CHANNELFK = $sessv[channelid]";
CREATE TABLE Messages (
MessageID INTEGER NOT NULL,
ChannelFK INTEGER NOT NULL,
CONSTRAINT PK_Messages PRIMARY KEY (MessageID)
);
Когда в базе значение ключа доростает до 50000, то этот запрос очень долго выполняется (порядка 7 сек), а в моем случае это недопустимо.
С уважением, Иван.
Добавлено: 17 май 2006, 10:28
kdv
смотря зачем ты используешь max.
Добавлено: 17 май 2006, 10:30
avenger
kdv писал(а):смотря зачем ты используешь max.
У меня работает чат в реальнов времени и раз в 3-и секунды идет такой запрос к базе. Далее везде условие
Если в базе держать архив сообщений скажем 5000 строк, то все ок, а если архив 100000 - то этот запрос подводит...
А в плане индекс по MESSAGEID вообще не используется.
Код: Выделить всё
План
PLAN (MESSAGES INDEX (CHANNELS_MESSAGES_FK_CHANNELFK))
Адаптированный план
PLAN (MESSAGES INDEX (CHANNELS_MESSAGES_FK_CHANNELFK))
------ Performance info ------
Prepare time = 0ms
Execute time = 0ms
Avg fetch time = 0,00 ms
Current memory = 1 061 612
Max memory = 1 196 528
Memory buffers = 2 048
Reads from disk to cache = 0
Writes from cache to disk = 6
Fetches from cache = 571
Добавлено: 17 май 2006, 12:10
kdv
а чем ты messageid генерируешь? если генератором, то тогда зачем max, если максимальный номер сообщения у тебя уже есть?
А в плане индекс по MESSAGEID вообще не используется.
и не должен
Добавлено: 17 май 2006, 12:38
avenger
kdv писал(а):а чем ты messageid генерируешь? если генератором, то тогда зачем max, если максимальный номер сообщения у тебя уже есть?
ID генерируется генератором. Т.е. достаточно вытащить текущее значение генератора. Если да, то подскажите как?
Добавлено: 17 май 2006, 13:02
kdv
Т.е. достаточно вытащить текущее значение генератора. Если да, то подскажите как?
www.ibase.ru/devinfo/generator.htm
p.s. как ты генераторы используешь, если о них ничего не знаешь???
Добавлено: 17 май 2006, 13:48
Ivan_Pisarevsky
Индексы в ФБ "односторонние", нужен индекс по убыванию, тогда оптимизатор его подхватит, на что КДВ выше тебе и намекал.
Добавлено: 17 май 2006, 14:41
avenger
kdv писал(а):
p.s. как ты генераторы используешь, если о них ничего не знаешь???
Код: Выделить всё
SELECT GEN_ID(NEWCLIENT, 0) FROM RDB$DATABASE
Как видно из приведенного кода запрос идет к системной таблице, а всех системных таблиц не упомнищь.
Индексы в ФБ "односторонние", нужен индекс по убыванию, тогда оптимизатор его подхватит, на что КДВ выше тебе и намекал.
IB Expert не дает изменить индекс на ключевое поле (MessageID). Как его поменять?
Добавлено: 17 май 2006, 15:04
kdv
Как видно из приведенного кода запрос идет к системной таблице, а всех системных таблиц не упомнищь.
что-что? ты это о чем, вообще? зачем в данном случае надо помнить имена системных таблиц?
ты статью-то читал?
"SELECT GEN_ID(NEWID, 1) FROM RDB$DATABASE
rdb$database здесь используется как таблица, содержащая только одну запись. В результате этим запросом также будет выдана 1 запись со значением генератора, увеличенным на 1."
IB Expert не дает изменить индекс на ключевое поле (MessageID). Как его поменять?
никак не поменять.
Добавлено: 18 май 2006, 11:00
Ivan_Pisarevsky
>Как его поменять?
Добавить еще один десендинг индекс совсем не судьба?
Добавлено: 18 май 2006, 16:10
avenger
Ivan_Pisarevsky писал(а):>Как его поменять?
Добавить еще один десендинг индекс совсем не судьба?
А как этот индекс повлияет на операцию выборки и добавления в данную таблицу? Не будет ли "лишнего индекса"?
Добавлено: 18 май 2006, 16:15
avenger
kdv писал(а):
что-что? ты это о чем, вообще? зачем в данном случае надо помнить имена системных таблиц?
ты статью-то читал?
Что такое генератор я прекрасно себе представляю. Вы значение вытаскиваете из системной таблицы RDB$DATABASE, которую мне не так уж и часто приходится использовать.
А что приведенный запрос вернет одну запись с новым значением генератора и так понятно.
Добавлено: 18 май 2006, 16:24
kdv
Вы значение вытаскиваете из системной таблицы RDB$DATABASE, которую мне не так уж и часто приходится использовать.
разумеется. вместо этой таблицы можно использовать вообще любую таблицу. только когда нужна всего одна запись, берется таблица
а) которая всегда есть в БД, даже в пустой
б) в которой всегда есть только одна запись
обоим условиям удовлетворяет rdb$database.
в этом контексте была странной фраза
Как видно из приведенного кода запрос идет к системной таблице, а всех системных таблиц не упомнищь.
Добавлено: 18 май 2006, 16:30
avenger
kdv писал(а):в этом контексте была странной фраза
Я имел ввиду имя системной таблицы RDB$DATABASE, о которой я наслышен, но использовать не приходилось.
Добавлено: 18 май 2006, 17:31
kdv
avenger писал(а):ID генерируется генератором. Т.е. достаточно вытащить текущее значение генератора. Если да, то подскажите как?
avenger писал(а):Что такое генератор я прекрасно себе представляю
avenger писал(а):А что приведенный запрос вернет одну запись с новым значением генератора и так понятно.
в общем, тему можно закрыть.
Добавлено: 20 май 2006, 15:11
avenger
kdv писал(а):rdb$database здесь используется как таблица, содержащая только одну запись
Не правильно "прочитал" твою мысль. Теперь понял твою идею. Спасибо за то, что исправляещь наш "лепет"

...
Всем спасибо!
Отдельное спасибо
Ivan_Pisarevsky!
Код: Выделить всё
CREATE UNIQUE DESC INDEX IDX_Messages_MessageID_Desc ON Messages (MessageID);
очень помог!
