Модераторы: skyboy
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Оптимизация выборки последних данных 
:(
    Опции темы
jsa
  Дата 13.8.2008, 05:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 704
Регистрация: 19.1.2006
Где: Новосибирск

Репутация: нет
Всего: 20



Hi all

допустим таблица A содержит поля
id integer (unique primary)
code1 integer
date1 timestamp
val1 float

code1 может содержать значения от 1 до 5

как можно выбрать только записи с максимальной датой для всех code1
делал так
Код

select * from A
where date1 in (select max(date1) from A group by code1)

но уж слишком накладный запрос

PS сервер FireBird 2.0


--------------------
Все мы, на перине с песней, строим небо на земле © Ю. Шевчук
PM MAIL ICQ   Вверх
Magnifico
Дата 15.8.2008, 15:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 418
Регистрация: 23.1.2008
Где: Московская област ь

Репутация: 4
Всего: 17



по моему самый оптимальный  , соединением join - будет ещё накладней.


--------------------
Всё  в  порядке   -   спасибо  зарядке  !
PM MAIL   Вверх
solenko
Дата 15.8.2008, 15:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1473
Регистрация: 15.1.2006
Где: Украина

Репутация: 4
Всего: 67



Magnifico, почему это join накладнее?


jsa, 
Код

SELECT a1.* 
FROM A a1 LEFT JOIN A a2 ON A1.code1=A2.code1 AND A1.date1 < A2.date1
WHERE A2.id IS NULL



--------------------
Ла-ла-ла-ла
Заметьте, нет официального подтверждения, что это не просто четыре слога.
PM MAIL WWW ICQ Skype   Вверх
lukash256
Дата 15.8.2008, 16:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 107
Регистрация: 23.7.2007
Где: Гомель/Беларусь

Репутация: нет
Всего: нет



а ты уверен что тебе нужны все поля ?
если не выберать "лишшних", то время выполнения сократится.
в данном примере это не решает но в промышленных маштабах, где в таблицах за 40 полей и пол милиона рекордав будет ощутимо.
PM MAIL ICQ   Вверх
Magnifico
Дата 15.8.2008, 16:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 418
Регистрация: 23.1.2008
Где: Московская област ь

Репутация: 4
Всего: 17



Цитата

Magnifico, почему это join накладнее?

я думал о запросе такого вида:
Код

SELECT a1.*
FROM A as a1 
JOIN 
( select max(id) as id ,code1
from A
group by code1
) as a2
on a1.id=a2.id

хотя и он глядя на план выгоднее подзапроса

solenko  твой запрос самый оптимальный.  +1


--------------------
Всё  в  порядке   -   спасибо  зарядке  !
PM MAIL   Вверх
Magnifico
Дата 15.8.2008, 19:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 418
Регистрация: 23.1.2008
Где: Московская област ь

Репутация: 4
Всего: 17



не погорячился

запрос 
Код

SELECT a1.* 
FROM A a1 LEFT JOIN A a2 ON A1.code1=A2.code1 AND A1.date1 < A2.date1
WHERE A2.id IS NULL

и
Код

select * from A
where date1 in (select max(date1) from A group by code1)

дают не правильные результаты при наличие одинаковых значений в поле date1(при массовой вставке это возможно)

причем при большом количестве данных блее 100 тысяч -1 запрос  по скорости выполняется почти за 8 минут
запрос с позапросом - за 107 миллисекунд

запрос
Код

SELECT a1.*
FROM #A as a1 
JOIN 
( select max(id) as id ,code1
from #A
group by code1
) as a2
on a1.id=a2.id
 за 62 миллисекунды

тестовый пример SQL Server 2005:

Код

create table #a
(
id integer ,
code1 integer,
date1 datetime default(getdate())
)
--------------------------------
declare @i int
      set @i=1
declare @j int
      set @j=1
while @i<100000
    begin
    if (@j =6 ) 
       begin
        set @j=1
       end
insert #a values(@i,@j,default)
    set @i= @i+1
    set @j =@j+1
end

create unique clustered index idx on #a(id)
----------------------------------




--------------------
Всё  в  порядке   -   спасибо  зарядке  !
PM MAIL   Вверх
jsa
Дата 18.8.2008, 04:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 704
Регистрация: 19.1.2006
Где: Новосибирск

Репутация: нет
Всего: 20



Цитата(lukash256 @  15.8.2008,  21:03 Найти цитируемый пост)
а ты уверен что тебе нужны все поля ?

да
Цитата(lukash256 @  15.8.2008,  21:03 Найти цитируемый пост)
если не выберать "лишшних", то время выполнения сократится.в данном примере это не решает но в промышленных маштабах, где в таблицах за 40 полей и пол милиона рекордав будет ощутимо.

дык я бы не спрашивал, если бы мне все поля не нужны были

Добавлено через 8 минут и 7 секунд
solenko, попробую, спасибо за подсказку, 

Цитата(Magnifico @  15.8.2008,  20:04 Найти цитируемый пост)
по моему самый оптимальный  , соединением join - будет ещё накладней.

абсолютно не оптимальный
когда в таблице хотя бы 1000 строк, потом эта выборка используется в куче обзоров, где еще выбирается куча данных... короче дошел до того что запросы выполняются по 8 секунд(сам ужаснулся, а представьте пользователя, который будет с этим делом работать), поэтому решил оптимизировать



--------------------
Все мы, на перине с песней, строим небо на земле © Ю. Шевчук
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Составление SQL-запросов | Следующая тема »


 




[ Время генерации скрипта: 0.0454 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.