Имя: Пароль:
IT
 
Более оптимальный SQl запрос
0 Coldboy
 
29.04.13
16:19
Здравствуйте. Нужно выбрать строку из таблицы, с наибольшей датой.
Делаю так.
select pole1 From table where mypole = 'parametr' order by mydate desc limit 1.
на 12000 строчек отрабатывает, за 0.29 это много. хочется быстрее, т.к надо сделать около 100 раз.

вариант с select max(mydate),pole1 from table where mypole = 'parametr' отрабатывает за 0.3-0.32.

Есть у кого нить другие варианты.
1 Ёпрст
 
29.04.13
16:20
select top 1
^)
2 Ёпрст
 
29.04.13
16:20
т.к надо сделать около 100 раз.
Зачем ?
3 Coldboy
 
29.04.13
16:28
(1) select top 1 это как? если сортировки по дате там изначально нет. ну 100 раз. это как бы с разными параметрами надо отработать.
4 Fram
 
29.04.13
16:31
(3) Вообще то смысл SQL запросов в том, чтобы все вытащить одним запросом. Неужели нет возможности?
5 Fram
 
29.04.13
16:32
(0) индекс по mypole есть?
6 Ёпрст
 
29.04.13
16:38
(3) чего как ?

select ещз 1 pole1 From table where mypole = 'parametr' order by mydate desc
7 Жан Пердежон
 
29.04.13
16:47
(3) ну так запихни свои 100 раз параметр/вт и сделай одним запросом
8 Coldboy
 
29.04.13
16:57
(7) ну в принципе можно, но я просто в отдельности, может есть еще оптимальней метод ?
9 Gepard
 
29.04.13
17:00
(5) +1 и по дате тоже нужен
10 Fragster
 
гуру
29.04.13
17:14
select mypole, max(pole1) From table
11 Fragster
 
гуру
29.04.13
17:15
group by mypole
12 Ёпрст
 
29.04.13
17:16
(10) дык ему по последней дате надо
13 mistеr
 
29.04.13
17:18
(8) Не можно, а нужно.
В некоторых (нормальных) языках и СУБД можно и без ВТ обойтись, сразу массив в качестве параметра пихнуть.
14 Fragster
 
гуру
29.04.13
17:19
(12) а макс(дата) - это что?
15 Fragster
 
гуру
29.04.13
17:19
короче, я сказал...
16 GANR
 
29.04.13
17:20
При условиЯх, что:
- данные в таблицу добавляются редко
- считывание происходит часто
отлично помогают  и н д е к с и р о в а н и е
17 Ёпрст
 
29.04.13
17:20
(14)  это в каком месте у тебя ?
У автора - mydate
18 GANR
 
29.04.13
17:20
+(16) в смысле, считывание с фильтром
19 Fragster
 
гуру
29.04.13
17:21
select mypole, pole1 From table inner join (select mypole, max(mydate) as mydate from Table) as table2 on table.mypole = table2.mytable and table.mydate = table2.mydate
20 Fragster
 
гуру
29.04.13
17:22
(16) в таких случаях отлично помагает денормализация
21 GANR
 
29.04.13
17:25
(20) агрессивное хирургическое вмешательство, то есть wiki:Денормализация ;)
22 Ёпрст
 
29.04.13
17:26
(19) дык не прокатит select mypole, max(mydate) as mydate from Table без group by
23 Fragster
 
гуру
29.04.13
17:28
(22) это майскуль, там много чего прокатывает
24 Ёпрст
 
29.04.13
17:28
(23) не верю чегой-то
25 Fragster
 
гуру
29.04.13
18:25
(24) да, прокатывает, но возвращает одну строку со случайным полем, если не сгруппировать. груп бай нужен.
26 trad
 
29.04.13
18:52
create index idx_pole_date on table (mypole,mydate)
еще не предлагали?
27 Fram
 
29.04.13
18:55
Вообще есть подозрение, что 0.29с уходит на вывод этих 12000 строк, а не на обработку.
28 Fragster
 
гуру
29.04.13
18:58
(27)
EXPLAIN EXTENDED select pole1 From table where mypole = 'parametr' order by mydate desc limit 1

объяснит, что там так долго происходит, но дело в том, что 100 раз не надо это делать, можно же 1 раз
29 Fragster
 
гуру
29.04.13
18:58
(19) + group by во внутренний запрос
30 Fram
 
29.04.13
19:01
(28) я ему сразу об этом написал
Требовать и эффективности, и гибкости от одной и той же программы — все равно, что искать очаровательную и скромную жену... по-видимому, нам следует остановиться на чем-то одном из двух. Фредерик Брукс-младший