Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Помогите с запросом [IB6.x]


Страницы:   1 2

_mandrake_ ©   (2004-01-16 17:58:00) 

Извините если не в тему, но может кто поможет подправит запрос
Есть таблица. В ней 3 поля :


Johnmen   (2004-01-21 09:36:00) [1]

>_mandrake_ (21.01.04 09:31) [27]

Причем тут IB ??? Попробуй на другом SQL сервере. Результат будет тот же.
Если нужно выжать максимальную скорость - пиши ХП.


_mandrake_   (2004-01-21 09:31:00) [2]


> Johnmen © (20.01.04 21:33) [24]
> >_mandrake_
>
> Для ускорения приведенного мною запроса сделай индекс на
> поле_со_временем и поле, по которому "соединяем".
> По поводу запроса Семен Сорокин © (16.01.04 19:42) [3]:
> Запрос "тяжелый" из-за группировки и из-за IN.
> К тому же будет работать некорректно, если вдруг максимум
> значения датавремя для к.-л. человека совпадет с немаксимумом
> для другого...


Индексы сделаны, но реэультата это не дало, так как виснут оба запроса - и Семена Сорокина и твой. (под зависанием я понимаю безрезультатное :-) ожидание результата больше 20 мин. )

P.S. Чета мне все меньше нравится InterBase...


Krey   (2004-01-20 22:12:00) [3]

Ой извините. У вас там InterBase.
Не знаю понимает она подзапросы в условии From.
В MSSQL, MSJET и FoxPro 9 выполнился бы.


Krey   (2004-01-20 22:02:00) [4]

Ваши запросы выполнялись долго (на большой таблице) потому, что вы поставили в условие where в подзапрос.
т.е здесь скорость выполнения зависит от оптимизатора запросов вашей СУБД.

Предлагаю след. запрос:

Select a.field1,a.field2,a.field3
from table1 a,(Select max(field3) as max from table1 group by field1) b
where a.field3 = b.max

В этом запросе СУБД сделает два отдельных запроса и объединит их Inner join"ом
В вашем же случае СУБД без оптимизатора делала бы по одному подзапросу MAX()
для каждой записи из table1

Извините если где ошибка (писал на коленях и проверить некогда) но думаю смасл понятен.
Ответить скорее всего не смогу.


Johnmen   (2004-01-20 21:33:00) [5]

>_mandrake_

Для ускорения приведенного мною запроса сделай индекс на поле_со_временем и поле, по которому "соединяем".
По поводу запроса Семен Сорокин © (16.01.04 19:42) [3]:
Запрос "тяжелый" из-за группировки и из-за IN.
К тому же будет работать некорректно, если вдруг максимум значения датавремя для к.-л. человека совпадет с немаксимумом для другого...


_mandrake_   (2004-01-20 19:30:00) [6]

Индекс по полю почти ничего не дал - все те же 20 сек. (Эапрос -
select max(поле_со_временем)from таблица group by поле1 ; )
Как я понимаю в записаном выше запросе делается почти вся работа, почему же виснет -
select * from таблица
where поле_со_временем IN (select max(поле_со_временем)from таблица group by поле1)

Ведь всегото и делов чтоб выбрать всеполя с найденых уже записей.


Семен Сорокин   (2004-01-20 19:13:00) [7]

_mandrake_ (20.01.04 19:06) [21]
Да сделал индекс по полю со временем. Может еще че-нить заиндексить?


смотри сам, слишком много индексов - тоже нехорошо.
для твоего случая можно еще и для поля1(integer).
Ага и сообщи потом сколько запрос выполняется. :)


_mandrake_   (2004-01-20 19:06:00) [8]

Да сделал индекс по полю со временем. Может еще че-нить заиндексить?


Семен Сорокин   (2004-01-20 18:55:00) [9]

_mandrake_ (20.01.04 18:35) [19]
надеюсь про индексы мы помним?


_mandrake_   (2004-01-20 18:35:00) [10]

Ха, рано я обрадовалси... Это работает только с тестовой базой, с моей реальной базой где приблизительно 500тыс записей - висяк, как и в случае запроса Семена Сорокина. Но почему? Результат запроса (для моей БАЛЬШОЙ базы) типа -
select max(intime) from testova group by surname
выводится за секунд 20???


Johnmen   (2004-01-20 18:33:00) [11]

>_mandrake_ (20.01.04 18:29)

Дело в том, что во вложенном запросе для surname ты не указал псевдоним. А значит считается, что это поле относится к запросу, для которого упомянуто, FROM "testova" T2.
Т.е. T2.surname=T2.surname.

Кстати, посмотри ещё на скорость выполнения...


_mandrake_   (2004-01-20 18:29:00) [12]

Извини, никогда бы не подумал что это может иметь значение. (но почему псевдонимы могут влиять на запрос?)


Johnmen   (2004-01-20 18:25:00) [13]

А теперь найди одно отличие ! Сущностное. От запроса, который я приводил.


_mandrake_   (2004-01-20 18:22:00) [14]

SELECT *
FROM "testova"
WHERE intime=(SELECT MAX(T2.intime)
FROM "testova" T2
WHERE surname=T2.surname)


Johnmen   (2004-01-20 18:15:00) [15]

Приведи ПОЛНОСТЬ запрос, который выполнял с тестовой таблицей. И не говори, что он мой :)


_mandrake_   (2004-01-20 18:11:00) [16]


> >_mandrake_ (20.01.04 17:43)
> >...и в результате твоего запроса получил - ...
>
> Наглая ложь !!!
> :)

блин, зачем мне врать? Не знаю я почему так, но это ТАК!!!


Johnmen   (2004-01-20 18:05:00) [17]

>_mandrake_ (20.01.04 17:43)
>...и в результате твоего запроса получил - ...

Наглая ложь !!!
:)


_mandrake_   (2004-01-20 17:43:00) [18]

Специально создал базу -
SET SQL DIALECT 3;

SET NAMES NONE;

CREATE DATABASE "C:\Bases\TEST.GDB"
USER "SYSDBA" PASSWORD "masterkey"
PAGE_SIZE 1024
DEFAULT CHARACTER SET NONE;

CREATE TABLE "testova" (
PROFFESION CHAR(10),
INTIME TIMESTAMP,
SURNAME CHAR(10));


заполнил поля
surname profession intime
Иванов сварщик 19.01.04 08:00
Петров слесарь 19.01.04 08:05
Сидоров грузчик 19.01.04 08:02
Иванов сварщик 20.01.04 08:10
Петров слесарь 20.01.04 08:01
Сидоров грузчик 20.01.04 08:06

и в результате твоего запроса получил -
Иванов сварщик 20.01.04 08:10

в результате запроса Семена Сорокина -
Иванов сварщик 20.01.04 08:10
Петров слесарь 20.01.04 08:01
Сидоров грузчик 20.01.04 08:06

Как можна лучше проверить?


Johnmen   (2004-01-20 17:21:00) [19]

>_mandrake_ (20.01.04 17:18)

Плохо проверял.
"Запрос идеально работает." (c) IB и клоны
:)


Johnmen   (2004-01-20 17:20:00) [20]

>_mandrake_

А где опровержение [4] ???? Или ты просто голословен ?

>_mandrake_ (20.01.04 17:12)

Нет.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо