Запросы, планы, оптимизация запросов, ...
Модераторы: kdv, CyberMax
-
avenger
- Сообщения: 141
- Зарегистрирован: 25 окт 2005, 11:53
Сообщение
avenger » 17 май 2006, 10:22
Привет всем!
Подскажите пожалуйста, чем можно заменит 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 сек), а в моем случае это недопустимо.
С уважением, Иван.
-
kdv
- Forum Admin
- Сообщения: 6595
- Зарегистрирован: 25 окт 2004, 18:07
Сообщение
kdv » 17 май 2006, 10:28
смотря зачем ты используешь max.
-
avenger
- Сообщения: 141
- Зарегистрирован: 25 окт 2005, 11:53
Сообщение
avenger » 17 май 2006, 10:30
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
-
kdv
- Forum Admin
- Сообщения: 6595
- Зарегистрирован: 25 окт 2004, 18:07
Сообщение
kdv » 17 май 2006, 12:10
а чем ты messageid генерируешь? если генератором, то тогда зачем max, если максимальный номер сообщения у тебя уже есть?
А в плане индекс по MESSAGEID вообще не используется.
и не должен
-
avenger
- Сообщения: 141
- Зарегистрирован: 25 окт 2005, 11:53
Сообщение
avenger » 17 май 2006, 12:38
kdv писал(а):а чем ты messageid генерируешь? если генератором, то тогда зачем max, если максимальный номер сообщения у тебя уже есть?
ID генерируется генератором. Т.е. достаточно вытащить текущее значение генератора. Если да, то подскажите как?
-
kdv
- Forum Admin
- Сообщения: 6595
- Зарегистрирован: 25 окт 2004, 18:07
Сообщение
kdv » 17 май 2006, 13:02
Т.е. достаточно вытащить текущее значение генератора. Если да, то подскажите как?
www.ibase.ru/devinfo/generator.htm
p.s. как ты генераторы используешь, если о них ничего не знаешь???
-
Ivan_Pisarevsky
- Заслуженный разработчик
- Сообщения: 644
- Зарегистрирован: 15 фев 2005, 11:34
Сообщение
Ivan_Pisarevsky » 17 май 2006, 13:48
Индексы в ФБ "односторонние", нужен индекс по убыванию, тогда оптимизатор его подхватит, на что КДВ выше тебе и намекал.
-
avenger
- Сообщения: 141
- Зарегистрирован: 25 окт 2005, 11:53
Сообщение
avenger » 17 май 2006, 14:41
kdv писал(а):
p.s. как ты генераторы используешь, если о них ничего не знаешь???
Код: Выделить всё
SELECT GEN_ID(NEWCLIENT, 0) FROM RDB$DATABASE
Как видно из приведенного кода запрос идет к системной таблице, а всех системных таблиц не упомнищь.
Индексы в ФБ "односторонние", нужен индекс по убыванию, тогда оптимизатор его подхватит, на что КДВ выше тебе и намекал.
IB Expert не дает изменить индекс на ключевое поле (MessageID). Как его поменять?
-
kdv
- Forum Admin
- Сообщения: 6595
- Зарегистрирован: 25 окт 2004, 18:07
Сообщение
kdv » 17 май 2006, 15:04
Как видно из приведенного кода запрос идет к системной таблице, а всех системных таблиц не упомнищь.
что-что? ты это о чем, вообще? зачем в данном случае надо помнить имена системных таблиц?
ты статью-то читал?
"SELECT GEN_ID(NEWID, 1) FROM RDB$DATABASE
rdb$database здесь используется как таблица, содержащая только одну запись. В результате этим запросом также будет выдана 1 запись со значением генератора, увеличенным на 1."
IB Expert не дает изменить индекс на ключевое поле (MessageID). Как его поменять?
никак не поменять.
-
avenger
- Сообщения: 141
- Зарегистрирован: 25 окт 2005, 11:53
Сообщение
avenger » 18 май 2006, 16:10
Ivan_Pisarevsky писал(а):>Как его поменять?
Добавить еще один десендинг индекс совсем не судьба?
А как этот индекс повлияет на операцию выборки и добавления в данную таблицу? Не будет ли "лишнего индекса"?
-
avenger
- Сообщения: 141
- Зарегистрирован: 25 окт 2005, 11:53
Сообщение
avenger » 18 май 2006, 16:15
kdv писал(а):
что-что? ты это о чем, вообще? зачем в данном случае надо помнить имена системных таблиц?
ты статью-то читал?
Что такое генератор я прекрасно себе представляю. Вы значение вытаскиваете из системной таблицы RDB$DATABASE, которую мне не так уж и часто приходится использовать.
А что приведенный запрос вернет одну запись с новым значением генератора и так понятно.
-
kdv
- Forum Admin
- Сообщения: 6595
- Зарегистрирован: 25 окт 2004, 18:07
Сообщение
kdv » 18 май 2006, 16:24
Вы значение вытаскиваете из системной таблицы RDB$DATABASE, которую мне не так уж и часто приходится использовать.
разумеется. вместо этой таблицы можно использовать вообще любую таблицу. только когда нужна всего одна запись, берется таблица
а) которая всегда есть в БД, даже в пустой
б) в которой всегда есть только одна запись
обоим условиям удовлетворяет rdb$database.
в этом контексте была странной фраза
Как видно из приведенного кода запрос идет к системной таблице, а всех системных таблиц не упомнищь.
-
avenger
- Сообщения: 141
- Зарегистрирован: 25 окт 2005, 11:53
Сообщение
avenger » 18 май 2006, 16:30
kdv писал(а):в этом контексте была странной фраза
Я имел ввиду имя системной таблицы RDB$DATABASE, о которой я наслышен, но использовать не приходилось.
-
kdv
- Forum Admin
- Сообщения: 6595
- Зарегистрирован: 25 окт 2004, 18:07
Сообщение
kdv » 18 май 2006, 17:31
avenger писал(а):ID генерируется генератором. Т.е. достаточно вытащить текущее значение генератора. Если да, то подскажите как?
avenger писал(а):Что такое генератор я прекрасно себе представляю
avenger писал(а):А что приведенный запрос вернет одну запись с новым значением генератора и так понятно.
в общем, тему можно закрыть.
-
avenger
- Сообщения: 141
- Зарегистрирован: 25 окт 2005, 11:53
Сообщение
avenger » 20 май 2006, 15:11
kdv писал(а):rdb$database здесь используется как таблица, содержащая только одну запись
Не правильно "прочитал" твою мысль. Теперь понял твою идею. Спасибо за то, что исправляещь наш "лепет"

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