Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / SELECT * FROM где > 2000000 записей / 18 сообщений из 18, страница 1 из 1
04.10.2006, 12:51
    #34031280
AlexPlsgi
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SELECT * FROM где > 2000000 записей
Дарова всем гуру
Вопрос такой
Есть таблица где > 2 000 000 записей
Если я делаю запрос типа SELECT * FROM ... - и в параметрах указываю значения которых нет в этой таблице - запрос происходит медленно - ~2 секунды
Можно ли какнить избавится от такой проблемы?
Таблица из трех полей
INTEGER,NUMERIC,NUMERIC
поиск произвожу по NUMERIC
на них создал индексы CREATE INDEX ...
но - безуспешно
...
Рейтинг: 0 / 0
04.10.2006, 12:57
    #34031303
Щукина Анна
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SELECT * FROM где > 2000000 записей
Текст запроса "с параметрами, значений которых нет" приведите, пожалуйста.
...
Рейтинг: 0 / 0
04.10.2006, 13:20
    #34031425
st_serg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SELECT * FROM где > 2000000 записей
просто создать индексы мало, необходимо еще собрать статистику
...
Рейтинг: 0 / 0
04.10.2006, 13:22
    #34031437
Щукина Анна
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SELECT * FROM где > 2000000 записей
Кроме того, поле NUMERIC допускает наличие пустых (NULL) значений?
...
Рейтинг: 0 / 0
04.10.2006, 14:06
    #34031679
AlexPlsgi
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SELECT * FROM где > 2000000 записей
Таблица
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
CREATE TABLE blocks (
	startIpNum NUMERIC( 18 ) NOT NULL,
	endIpNum NUMERIC( 18 ) NOT NULL,
	lockID INTEGER REFERENCES tablename(idx_serial_id) ON DELETE CASCADE ON UPDATE CASCADE
);
CREATE INDEX idx_startIpNum ON blocks(startIpNum);
CREATE INDEX idx_endIpNum ON blocks(endIpNum);
Функция
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
CREATE OR REPLACE FUNCTION get_info(NUMERIC) RETURNS VARCHAR AS '
DECLARE
	_ip_num ALIAS FOR $1;
	_res INTEGER;

BEGIN
	SELECT idx_serial_id INTO _res FROM locks WHERE (startipnum <= _ip_num) AND (endipnum >= _ip_num) LIMIT 1;
	IF NOT FOUND THEN
		RAISE NOTICE ''Cant find such ip - %'',_ip_num;
		RETURN NULL;
	END IF;
	
           RETURN ...
END;
' LANGUAGE plpgsql;

Конечно можно все это выполнить и с помощью запроса
Код: plaintext
1.
2.
SELECT idx_serial_id INTO _res FROM locks WHERE (startipnum <= _ip_num) AND (endipnum >= 
_ip_num) LIMIT  1 ;
...
Рейтинг: 0 / 0
04.10.2006, 14:10
    #34031702
AlexPlsgi
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SELECT * FROM где > 2000000 записей
Щукина АннаТекст запроса "с параметрами, значений которых нет" приведите, пожалуйста.
Кста - в часть запроса после WHERE я ввожу значение, которого нет в таблице
запрос таким образом проходит по всей таблице и это скорей всего вызывает тормоза
...
Рейтинг: 0 / 0
04.10.2006, 14:11
    #34031709
AlexPlsgi
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SELECT * FROM где > 2000000 записей
st_sergпросто создать индексы мало, необходимо еще собрать статистику
Какой командой?
...
Рейтинг: 0 / 0
04.10.2006, 14:22
    #34031781
AlexPlsgi
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SELECT * FROM где > 2000000 записей
Вот результат
explain analyze select geo_by_ip('123123');
NOTICE: Cant find such ip - 123123
QUERY PLAN
--------------------------------------------------------------------------------------------
Result (cost=0.00..0.01 rows=1 width=0) (actual time=26212.346..26212.347 rows=1 loops=1)
Total runtime: 26212.381 ms
(2 rows)
...
Рейтинг: 0 / 0
04.10.2006, 15:17
    #34032056
st_serg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SELECT * FROM где > 2000000 записей
в соответствии с твоим запросом, имхо, лучше было б сделать один индекс
Код: plaintext
1.
CREATE INDEX idx_startIpNum ON blocks(startIpNum, endIpNum);

explain analyze вызова функции, нидает практически никакой информации,
надо делать
Код: plaintext
1.
explain analyze SELECT idx_serial_id FROM locks WHERE (startipnum <= _ip_num) AND (endipnum >= _ip_num) LIMIT  1 ;
...
Рейтинг: 0 / 0
04.10.2006, 19:08
    #34033004
AlexPlsgi
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SELECT * FROM где > 2000000 записей
а есть ли объяснение - чем это лучше?
т.е создание индекса на две колонки вместо создания двух индексов?
...
Рейтинг: 0 / 0
05.10.2006, 10:27
    #34033672
st_serg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SELECT * FROM где > 2000000 записей
explain analyze уже смотрел? там по идее должно быть наглядное объяснение. хотя что лучше это еще не факт, надо смотреть план выполнения запроса
...
Рейтинг: 0 / 0
05.10.2006, 11:17
    #34033882
4321ё
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SELECT * FROM где > 2000000 записей
автор
Код: plaintext
 SELECT idx_serial_id FROM locks WHERE (startipnum <= _ip_num) AND (endipnum >= _ip_num) LIMIT  1 ;

кажется в этом лимите чего-то не хватаеть. А именно ORDER BY
т.к. , очевидно, нужен
Код: plaintext
ORDER BY startIpNum DESC, endIpNum
то и вместо
st_sergв соответствии с твоим запросом, имхо, лучше было б сделать один индекс
Код: plaintext
CREATE INDEX idx_startIpNum ON blocks(startIpNum, endIpNum);

нужен
Код: plaintext
CREATE INDEX idx_startIpNum ON blocks(startIpNum DESC, endIpNum);
а т.к. постгрес по какому то недомыслию не поддерживает DESC в индексах, то видимо так
Код: plaintext
CREATE INDEX idx_startIpNum ON blocks((-startIpNum), endIpNum);
и запрос вида
Код: plaintext
1.
2.
SELECT idx_serial_id FROM locks WHERE ((-startipnum) >= _ip_num) AND (endipnum >= _ip_num)
ORDER BY (-startIpNum), endIpNum
 LIMIT 1 ;
если конечно для типа в поле startIpNum прописана инверсия (-). Т.е. для нумериков разных сортов. Для текстового или варчарного - увы и ах. (спазиба раздработчикам)
...
Рейтинг: 0 / 0
05.10.2006, 13:52
    #34034711
Andrew Sagulin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SELECT * FROM где > 2000000 записей
Если блоки IPNum не пересекаются и не являются вложенными друг в друга, то можно попробовать следующий вариант:

1. Создаём индекс только по startipnum
2. Используем следующий запрос:
Код: plaintext
1.
2.
select lockID from 
  (select * from blocks where startipnum <= _ip_num order by startipnum desc limit  1 ) as i 
    where i.endIpNum >= _ip_num;
...
Рейтинг: 0 / 0
06.10.2006, 16:52
    #34038472
AlexPlsgi
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SELECT * FROM где > 2000000 записей
Тк я не админ базы - а база ругается no space on device - пока не проверил ничего пока админ не разберется что к чему
Но все равно спасиба огромное
на днях думаю все равно все проверю
...
Рейтинг: 0 / 0
09.10.2006, 14:37
    #34041775
AlexPlsgi
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SELECT * FROM где > 2000000 записей
В общем запрос типа
Код: plaintext
SELECT lockid INTO _res FROM blocks WHERE (startipnum <= _ip_num) AND (endipnum >= _ip_num) ORDER BY startipnum DESC LIMIT  1 ;
стал выполнятся на 1 сек быстрей
...
Рейтинг: 0 / 0
09.10.2006, 18:26
    #34042654
AlexPlsgi
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SELECT * FROM где > 2000000 записей
Кста - как можно расшифровать такую запись в ответ на запрос?
Код: plaintext
1.
2.
3.
4.
5.
6.
explain analyze select * from blocks where startipnum<= 144666  and endipnum <=  144666  order by startipnum desc limit  1 ;

Limit  (cost= 0 . 00 .. 6 . 98  rows= 1  width= 94 ) (actual time= 29 . 398 .. 29 . 398  rows= 0  loops= 1 )
   ->  Index Scan Backward using idx_blocks on blocks  (cost= 0 . 00 .. 6 . 98  rows= 1  width= 94 ) (actual time= 29 . 392 .. 29 . 392  rows= 0  loops= 1 )
         Index Cond: ((startipnum <=  144666 ::numeric) AND (endipnum <=  144666 ::numeric))
 Total runtime:  29 . 485  ms
...
Рейтинг: 0 / 0
10.10.2006, 11:25
    #34043688
LeXa NalBat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SELECT * FROM где > 2000000 записей
AlexPlsgiКста - как можно расшифровать такую запись в ответ на запрос? EXPLAIN
Using EXPLAIN
...
Рейтинг: 0 / 0
13.10.2006, 15:12
    #34053969
AlexPlsgi
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SELECT * FROM где > 2000000 записей
спасиб за ссылки
извиняюсь канешна что я поленился их искать - такое наверно со всеми бывает
...
Рейтинг: 0 / 0
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / SELECT * FROM где > 2000000 записей / 18 сообщений из 18, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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