Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Informix [игнор отключен] [закрыт для гостей] / Тормозит простой запрос - помогите! / 17 сообщений из 17, страница 1 из 1
01.11.2007, 13:00
    #34910033
yack
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Тормозит простой запрос - помогите!
Тупой запрос:
SELECT count(id) AS count FROM my_table WHERE verify=1
таблица с 90 000 записей.
Из них verify=1 имеют ~88000 записей
Работает около 5 секунд.

Как можно ускорить?
...
Рейтинг: 0 / 0
01.11.2007, 13:16
    #34910108
Евгений Фадеев
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Тормозит простой запрос - помогите!
Попробуйте индекс построить на (verify, id)
И план покажите.
...
Рейтинг: 0 / 0
01.11.2007, 14:00
    #34910305
Журавлев Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Тормозит простой запрос - помогите!
yackТупой запрос:
SELECT count(id) AS count FROM my_table WHERE verify=1
таблица с 90 000 записей.
Из них verify=1 имеют ~88000 записей
Работает около 5 секунд.

Как можно ускорить?А сколько должен работать?
Если у вас oltp, то просто не надо делать таких запросов (или добавить слабую сущность), если dss то 5 сек. можно подождать.
...
Рейтинг: 0 / 0
01.11.2007, 15:10
    #34910583
victor16
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Тормозит простой запрос - помогите!
Евгений Фадеев
Попробуйте индекс построить на (verify, id).

Неплохо также
Код: plaintext
1.
UPDATE STATISTICS HIGH FOR TABLE my_table (id,verify)
...
Рейтинг: 0 / 0
01.11.2007, 17:18
    #34911069
yack
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Тормозит простой запрос - помогите!
UPDATE STATISTICS делаю регулярно.
Система OLTP (не OLAP).
Индекс по verify есть. Но он по сути ничего не дает, т.к. тормоз дает именно инкремент в count (тот же запрос, но с verify=0 выполняется в момент, т.к. таких записей всего около 2000)

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

План запроса прилагаю.
------
SELECT count(id) AS count FROM photos WHERE 1=verify

Estimated Cost: 75022
Estimated # of Rows Returned: 1

1) informix.photos: INDEX PATH

(1) Index Keys: verify (Serial, fragments: ALL)
Lower Index Filter: informix.photos.verify = 1
...
Рейтинг: 0 / 0
01.11.2007, 17:41
    #34911129
ak-47
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Тормозит простой запрос - помогите!
авторИз них verify=1 имеют ~88000 записей

авторEstimated # of Rows Returned: 1

Все нормально со статистикой?
...
Рейтинг: 0 / 0
01.11.2007, 18:05
    #34911224
yack
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Тормозит простой запрос - помогите!
Внимательнее:
SELECT count как раз и возвращает 1 запись с кол-вом.
...
Рейтинг: 0 / 0
01.11.2007, 18:10
    #34911241
victor16
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Тормозит простой запрос - помогите!
Время работы менее 1 секунды на любых серверах. Проверьте
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
-- drop table my_table;
create table my_table (
  id serial not null, 
  verify integer not null,
  check (verify in ( 0 , 1 )),
  primary key (id));
insert into my_table (verify) values ( 0 );
insert into my_table (verify) select verify from my_table;
insert into my_table (verify) select verify from my_table;
insert into my_table (verify) select verify from my_table;
insert into my_table (verify) select verify from my_table;
insert into my_table (verify) select verify from my_table;
insert into my_table (verify) select verify from my_table;
insert into my_table (verify) select verify from my_table;
insert into my_table (verify) select verify from my_table;
insert into my_table (verify) select verify from my_table;
insert into my_table (verify) select verify from my_table;
insert into my_table (verify) select verify from my_table;

insert into my_table (verify) values ( 1 );
insert into my_table (verify) select verify from my_table where verify =  1 ;
insert into my_table (verify) select verify from my_table where verify =  1 ;
insert into my_table (verify) select verify from my_table where verify =  1 ;
insert into my_table (verify) select verify from my_table where verify =  1 ;
insert into my_table (verify) select verify from my_table where verify =  1 ;
insert into my_table (verify) select verify from my_table where verify =  1 ;
insert into my_table (verify) select verify from my_table where verify =  1 ;
insert into my_table (verify) select verify from my_table where verify =  1 ;
insert into my_table (verify) select verify from my_table where verify =  1 ;
insert into my_table (verify) select verify from my_table where verify =  1 ;
insert into my_table (verify) select verify from my_table where verify =  1 ;
insert into my_table (verify) select verify from my_table where verify =  1 ;
insert into my_table (verify) select verify from my_table where verify =  1 ;
insert into my_table (verify) select verify from my_table where verify =  1 ;
insert into my_table (verify) select verify from my_table where verify =  1 ;
insert into my_table (verify) select verify from my_table where verify =  1 ;
insert into my_table (verify) select verify from my_table where verify =  1 ;

select verify,count(*) from my_table group by  1 ;
select unique current from systables;
select count(id) from my_table where  1 =verify;
select unique current from systables;

...
Рейтинг: 0 / 0
01.11.2007, 18:17
    #34911260
Журавлев Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Тормозит простой запрос - помогите!
yack
SELECT count(id) AS count FROM photos WHERE 1=verify
count(*)

Я бы завел таблицу гдебы хранил число, и поддерживал триггерами
...
Рейтинг: 0 / 0
01.11.2007, 18:18
    #34911264
yack
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Тормозит простой запрос - помогите!
select count(id) from my_table where 1=verify; - так я пробовал, но результат тот же.

select verify,count(*) from my_table group by 1; - а вот это очень хорошО, спасибо большое за идею.
Буду теперь думать, как это заюзать в прикладухе.
...
Рейтинг: 0 / 0
01.11.2007, 18:20
    #34911269
yack
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Тормозит простой запрос - помогите!
Журавлев Денис yack
SELECT count(id) AS count FROM photos WHERE 1=verify
count(*)

Я бы завел таблицу гдебы хранил число, и поддерживал триггерами

Тут есть проблемы - этот count(id) в ряде имеет около 10 дополнительных WHERE в запросе, для каждого из которых хранить статистику не представляется разумным :)
...
Рейтинг: 0 / 0
01.11.2007, 18:26
    #34911293
Журавлев Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Тормозит простой запрос - помогите!
yackТут есть проблемы - этот count(id)Вы понимаете чем отличается count(id) от count(*) ?

yack в ряде имеет около 10 дополнительных WHERE в запросе, для каждого из которых хранить статистику не представляется разумным :)Ничего не понял.
...
Рейтинг: 0 / 0
01.11.2007, 18:30
    #34911304
Журавлев Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Тормозит простой запрос - помогите!
Кстати про разбивку на страницы.

Поисковики на самом деле когда показывают 10 20 30 40 ... 110, показывают неточные числа.

например видим 6 страниц, но на самом деле их 2.
...
Рейтинг: 0 / 0
01.11.2007, 18:48
    #34911366
yack
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Тормозит простой запрос - помогите!
Журавлев ДенисКстати про разбивку на страницы.

Поисковики на самом деле когда показывают 10 20 30 40 ... 110, показывают неточные числа.

например видим 6 страниц, но на самом деле их 2.

Хороший пример, никогда не обращал внимания
...
Рейтинг: 0 / 0
02.11.2007, 10:43
    #34912240
onstat-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Тормозит простой запрос - помогите!
yackUPDATE STATISTICS делаю регулярно.
Система OLTP (не OLAP).
Индекс по verify есть. Но он по сути ничего не дает, т.к. тормоз дает именно инкремент в count (тот же запрос, но с verify=0 выполняется в момент, т.к. таких записей всего около 2000)

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

План запроса прилагаю.
------
SELECT count(id) AS count FROM photos WHERE 1=verify

Estimated Cost: 75022
Estimated # of Rows Returned: 1

1) informix.photos: INDEX PATH

(1) Index Keys: verify (Serial, fragments: ALL)
Lower Index Filter: informix.photos.verify = 1

yackUPDATE STATISTICS делаю регулярно.
Система OLTP (не OLAP).
Индекс по verify есть. Но он по сути ничего не дает, т.к. тормоз дает именно инкремент в count (тот же запрос, но с verify=0 выполняется в момент, т.к. таких записей всего около 2000)

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

План запроса прилагаю.
------
SELECT count(id) AS count FROM photos WHERE 1=verify

Estimated Cost: 75022
Estimated # of Rows Returned: 1

1) informix.photos: INDEX PATH

(1) Index Keys: verify (Serial, fragments: ALL)
Lower Index Filter: informix.photos.verify = 1

Есть несколько моментов:

1. Откажитесь от использования индекса через хинт.
В данном случае будет производиться полное сканирование таблицы при этом скорость чтения
страниц таблицы( с данными) с диска будет производиться быстрее.
В случае индексного поиска Informix читает одну страницу за одну операцию ввода вывода.
в случае full scan, он читает за одну дисковую операцию столько страниц сколько ему позволяет ОС.

2. Прислушайтесь к замечанию Дениса
автор
Вы понимаете чем отличается count(id) от count(*) ?

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

3. При проектирование OLTP системы нужно учитывать, что индексный поиск должен
работать с полями и значениями с максимально высокой селективностью.
Если это Ваша разработка подумайте над дизайном.
...
Рейтинг: 0 / 0
02.11.2007, 11:05
    #34912340
Leonid Vorontsov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Тормозит простой запрос - помогите!
Может я чего-то и не понимаю, но по-моему, надо считать не COUNT( id ), COUNT( verify ) - тогда в плане появится волшебное (Key-Only)...
...
Рейтинг: 0 / 0
02.11.2007, 14:22
    #34913238
yack
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Тормозит простой запрос - помогите!
Спасибо всем! Проблема была как раз в плоскости count(id) от count(*)
...
Рейтинг: 0 / 0
Форумы / Informix [игнор отключен] [закрыт для гостей] / Тормозит простой запрос - помогите! / 17 сообщений из 17, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]