![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Помогите с запросом [IB6.x]
_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)
Нет.