Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2009.09.20;
Скачать: [xml.tar.bz2];

Вниз

Можно ли уменьшить время выполнения запроса   Найти похожие ветки 

 
abhtr   (2008-11-21 11:43) [0]

Существует таблица товаров Prdca и существует таблица продаж этого товара (с кодом из справочника Dsptch_Prdca_ID) с указанием количества (Dsptch_Plan) и даты продажи (Dsptch_Date). Надо выбрать товары с самой поздней датой продажи.
Сделал запрос:
SELECT Dsptch_Prdca_ID, Dsptch_PostOffice_ID, Dsptch_Plan,
      Dsptch_MMYY, Dsptch_Date
FROM Dsptch D1, Prdca
WHERE Dsptch_Prdca_ID = Prdca_ID
and D1.Dsptch_Date = (select max(Dsptch_Date)
                       from Dsptch D2
                       where D2.Dsptch_Prdca_ID=D1.Dsptch_Prdca_ID)
AND DSPTCH_MMYY = "1008"
and Prdca_Pttrn = "Вкл."
ORDER BY Dsptch_Prdca_ID, Dsptch_PostOffice_ID

Без строчки с ORDER BY выполняется около 15 сек., а с ORDER BY выполняется почти 15 МИНУТ(!!!)
Можно ли как-нибудь оптимизировать запрос для уменьшения времени выполнения?


 
Сергей М. ©   (2008-11-21 11:54) [1]

Приведи детальный план запроса


 
abhtr   (2008-11-21 12:00) [2]

План
PLAN (D2 NATURAL)
PLAN JOIN (D1 NATURAL,PRDCA INDEX (RDB$PRIMARY3))

Адаптированный план
PLAN (D2 NATURAL) PLAN JOIN (D1 NATURAL,PRDCA INDEX (PK_PRDCA))

------ Performance info ------
Prepare time = 0ms
Execute time = 14s 875ms
Avg fetch time = 619.79 ms
Current memory = 5 664 764
Max memory = 5 803 809
Memory buffers = 1 262
Reads from disk to cache = 0
Writes from cache to disk = 0
Fetches from cache = 18 534 461

Я правильно понял?


 
Сергей М. ©   (2008-11-21 12:03) [3]

Еще приведи статистику использования индексов при выполнении запроса


 
Sergey13 ©   (2008-11-21 12:07) [4]

and D1.Dsptch_Date = (select max(Dsptch_Date)
                      from Dsptch D2
                      where D2.Dsptch_Prdca_ID=D1.Dsptch_Prdca_ID)
AND DSPTCH_MMYY = "1008"

заменить на
and D1.Dsptch_Date = (select max(Dsptch_Date)
                      from Dsptch D2
                      where D2.Dsptch_Prdca_ID=D1.Dsptch_Prdca_ID AND DSPTCH_MMYY = "1008")

будет не правильнее?


 
abhtr   (2008-11-21 12:13) [5]

Таблицы у меня без индексов.
Работаю на IB Expert. Нашел еще вот это:
Query
------------------------------------------------
/*
Текст запроса для формирования новой разнарядки по НОВОМУ алгоритму.

Из справочника изданий нужно выбрать издания отмеченные как "ВКЛ."
Для этих изданий надо выбрать записи из разнарядки за прошлый заданный период DSPTCH_MMYY
с последней датой формирования Dsptch_Date и переписать значение Dsptch_Plan
*/

SELECT Dsptch_Prdca_ID, Dsptch_PostOffice_ID, Dsptch_Plan,
      Dsptch_MMYY, Dsptch_Date
FROM Dsptch D1, Prdca
WHERE Dsptch_Prdca_ID = prdca_id
and D1.Dsptch_Date = (select max(Dsptch_Date)
                       from Dsptch D2
                       where D2.dsptch_prdca_id = D1.dsptch_prdca_id)
AND DSPTCH_MMYY = "1008"
and Prdca_Pttrn = "Вкл."
/* ORDER BY Dsptch_Prdca_ID, Dsptch_PostOffice_ID   14мин 49 сек.*/
/* ORDER BY Dsptch_Prdca_ID, Dsptch_Date, Dsptch_PostOffice_ID  14мин 42 сек.*/

/*Текст запроса для РАЗНАРЯДКИ (и для TfrmWork.dbgWorkTitleClick разнарядки)*/
/*
SELECT Prdca_Index, Prdca_Name, PostOffice_Name, PostOffice_Tract,
      PrHsNN_Quantity, Dsptch_Plan*PrHsNN_Quantity  PlQn,
      PrHsInit_Initial, PrHsPrice_SumPblcHs, PrHsPrice_RetaPrc,
      Dsptch_ID, Dsptch_Prdca_ID, Dsptch_PostOffice_ID,
      Dsptch_Plan, Dsptch_PrHsInit_ID, Dsptch_PrHsPrice_ID,
      Dsptch_NotSent, Dsptch_WritOff_Act,
      Dsptch_MMYY, Dsptch_Date, Dsptch_Note
FROM Dsptch, Prdca, PostOffice,  PrHsPrice, PrHsInit, PrHsNN
WHERE Dsptch_Prdca_ID = Prdca_ID
AND Dsptch_PrHsPrice_ID  = PrHsPrice_ID
AND Dsptch_PrHsInit_ID   = PrHsInit_ID
AND Dsptch_PostOffice_ID = PostOffice_ID
AND Dsptch_PrHsNN_ID = PrHsNN_ID
AND DSPTCH_MMYY = "1008"
ORDER BY Dsptch_Date, Prdca_Name, PostOffice_Name
*/

Plan
------------------------------------------------
PLAN (D2 NATURAL)
PLAN JOIN (D1 NATURAL,PRDCA INDEX (RDB$PRIMARY3))

Adapted Plan
------------------------------------------------
PLAN (D2 NATURAL)

PLAN JOIN (D1 NATURAL,PRDCA INDEX (PK_PRDCA))

Query Time
------------------------------------------------
Prepare       : 0.00 ms
Execute       : 14 875.00 ms
Avg fetch time: 619.79 ms

Memory
------------------------------------------------
Current: 5 704 700
Max    : 5 838 940
Buffers: 1 262

Operations
------------------------------------------------
Read   : 0
Writes : 0
Fetches: 18 534 461

Enchanced Info:
+--------------------------+-----------+-----------+-------------+---------+---------+---------+
|        Table Name        |  Records  |  Indexed  | Non-Indexed | Updates | Deletes | Inserts |
|                          |   Total   |   reads   |    reads    |         |         |         |
+--------------------------+-----------+-----------+-------------+---------+---------+---------+
|                    DSPTCH|         0 |         0 |     9071600 |       0 |       0 |       0 |
|                     PRDCA|         0 |       328 |           0 |       0 |       0 |       0 |
+--------------------------+-----------+-----------+-------------+---------+---------+---------+

Или  где еще можно посмотреть статистику использования индексов?


 
abhtr   (2008-11-21 12:14) [6]

Извините лишнее скопировалось :о((


 
abhtr   (2008-11-21 12:19) [7]


> Sergey13 ©   (21.11.08 12:07) [4]

Без ORDER BY время выполнения увеличилось с 15 сек, до почти 18 сек.
С ORDER BY пока не рискнул запускать. Чтобы долго не ждать.


 
abhtr   (2008-11-21 12:27) [8]


> Еще приведи статистику использования индексов при выполнении
> запроса

Прошу прощения. Я сделал "большую" вставку с быстрого запроса, т.е. без ORDER BY.
Вы мне скажите, я правильно хотя бы выбрал информацию  с закладки: Анализ производительности -> 2.Additional  
Если это то, о чем Вы просили, то я запущу "долгий" запрос и пришлю это же снова.


 
Сергей М. ©   (2008-11-21 12:30) [9]


> Таблицы у меня без индексов


Каких же чудес ты тогда ждешь, если их нет ?!
Чудес не жди, их не будет, пока не будет нужных индексов.


 
Сергей М. ©   (2008-11-21 12:31) [10]


> я правильно хотя бы выбрал информацию  с закладки: Анализ
> производительности -> 2.Additional  


Да, правильно.


 
abhtr   (2008-11-21 12:38) [11]


> пока не будет нужных индексов.

Посоветуйте, пожалуйста, какой индекс тогда лучше сделать?
По Dsptch_Prdca_ID, или Dsptch_Prdca_ID + Dsptch_Date?
И как их тогда надо использовать в запросе?


 
Правильный$Вася   (2008-11-21 12:44) [12]

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


 
Сергей М. ©   (2008-11-21 12:46) [13]

Приведи подробную структуру обеих таблиц с описанием назначения каждого из их полей ..


 
sniknik ©   (2008-11-21 13:50) [14]

а вот такого вида запрос в IB6.x(кстати ????) пройдет

SELECT D1.Dsptch_Prdca_ID, D1.Dsptch_PostOffice_ID, D1.Dsptch_Plan, D1.Dsptch_MMYY, D1.Dsptch_Date
FROM Dsptch D1
inner join (select Prdca_ID, max(Dsptch_Date)
             from Dsptch
             group by Prdca_ID
             where DSPTCH_MMYY = "1008" and Prdca_Pttrn = "Вкл.") D2
on D1.Prdca_ID=D2.Prdca_ID and D1.Dsptch_Date=D2.Dsptch_Date
ORDER BY D1.Dsptch_Prdca_ID, D1.Dsptch_PostOffice_ID

конечно неясна структура таблиц, т.что связи наверняка неправильные, и непонятно зачем "присобачивается" Prdca, поэтому ее игнорировал, но по смыслу, сам стиль, объединение с подзапросом пройдет?
(если пройдет, то все лучше/быстрее будет один вызов подзапроса чем на каждую интерацию)


 
abhtr   (2008-11-21 13:56) [15]

Извините за задержку, поздравляли сотрудника с днем рождения :о)
Однако...
Структуру привожу из скрипта таблиц:
CREATE TABLE DSPTCH (
   DSPTCH_ID             INTEGER,
   DSPTCH_PRDCA_ID       SMALLINT,
   DSPTCH_PRHSPRICE_ID   INTEGER,
   DSPTCH_PRHSINIT_ID    INTEGER,
   DSPTCH_PRHSNN_ID      INTEGER,
   DSPTCH_POSTOFFICE_ID  SMALLINT,
   DSPTCH_PLAN           SMALLINT,
   DSPTCH_NOTSENT        SMALLINT,
   DSPTCH_WRITOFF        SMALLINT,
   DSPTCH_WRITOFF_ACT    INTEGER,
   DSPTCH_MMYY           VARCHAR(4),
   DSPTCH_DATE           TIMESTAMP,
   DSPTCH_NOTE           VARCHAR(15)
);

CREATE TABLE PRDCA (
   PRDCA_ID        INTEGER,
   PRDCA_INDEX     VARCHAR(5),
   PRDCA_NAME      VARCHAR(35),
   PUBLICHOUSE_ID  INTEGER,
   PRDCA_PTTRN     VARCHAR(6)
);


 
Сергей М. ©   (2008-11-21 14:02) [16]

А где описание и назначение каждого из полей ?


 
abhtr   (2008-11-21 14:54) [17]

Dsptch_Prdca_ID - поле ссылки на таблицу справочника товара Prdca
Dsptch_PostOffice_ID - поле ссылки на таблицу справочника торговой точки. Она в результате запроса нужна для оценки реализации товара по точкам.
Dsptch_Plan - количество товара (план) для реализации в торговой точке.
Dsptch_MMYY - отчетный период (месяц+год) для реализации товара
Dsptch_Date - дата "внутри" отчетного периода, для которого заполняется количество реализованного товара

Prdca_ID - код товара из справочника товара Prdca
Prdca_Pttrn - поле из справочника товара Prdca, для отметки товара, по которым будет происходить выборка для отчета.


> sniknik ©   (21.11.08 13:50) [14]

Увы, запрос не прошел. Курсор останавливается после join и пишет:
Invalid token.
Dynamic SQL Error.
SQL error code = -104.
Token unknown - line 11, char 13.
select.


 
Anatoly Podgoretsky ©   (2008-11-21 15:04) [18]

> sniknik  (21.11.2008 13:50:14)  [14]

А ИБ6 поддерживает вложеные запросы.


 
Anatoly Podgoretsky ©   (2008-11-21 15:05) [19]

> sniknik  (21.11.2008 13:50:14)  [14]

Кстати ты помнишь в ветке где категорически рекомендуют начинающим ИБ и его клоны, так вот отсутствие вложеных запросов одназначно закрыло мне путь к этой СУБД.


 
abhtr   (2008-11-21 15:10) [20]


> Anatoly Podgoretsky ©   (21.11.08 15:05) [19]

Извините, что вклиниваюсь... Но пример в начале этой ветке не является примером вложенных запросов? Он - то у меня работает, правда, медленно...


 
sniknik ©   (2008-11-21 15:14) [21]

> Увы, запрос не прошел. Курсор останавливается после join и пишет:
тогда забудь.

> ИБ и его клоны
IB ладно, черт с ним, но вот клоны... например про Firebird 2, читал/говорили что уже почти всю функциональность mssql поддерживает, и + что то исконно свое.


 
sniknik ©   (2008-11-21 15:18) [22]

> Но пример в начале этой ветке не является примером вложенных запросов?
это что то типа функции в виде запроса... т.е. это вызывается на каждую итерацию.
обработка идет построчно, а не блоком как с нормальным подзапросом.


 
Anatoly Podgoretsky ©   (2008-11-21 16:40) [23]

> sniknik  (21.11.2008 15:14:21)  [21]

Врут, но бог с ними, а мне что надо было ждать более 10 лет?
Вроде только где то в 7 версии появились встроеные запросы? Я точно не помню.
FireBird хоть он и не применим в данном случае, тоже не сразу обзавелся встроеными запросами.


 
sniknik ©   (2008-11-21 16:49) [24]

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


 
Anatoly Podgoretsky ©   (2008-11-21 18:57) [25]

Я выбираю СУБД не по номеру версии, а под задачу, подойдет ли, и при том по очень многим факторам. Иногда выбирать не приходится, когда покупная программа, от которой нельзя отказаться или альтернативы еще хуже.


 
Loginov Dmitry ©   (2008-11-22 00:24) [26]

> Посоветуйте, пожалуйста, какой индекс тогда лучше сделать?
>


Как минимум на поля DSPTCH_PRDCA_ID, DSPTCH_DATE (это - обязательно!). По правилам разработки баз данных нужны первычные ключи DSPTCH_ID и PRDCA_ID.

Кстати, почему DSPTCH_PRDCA_ID - SMALLINT, а PRDCA_ID - INTEGER?


 
Виталий Панасенко(дом)   (2008-11-22 09:47) [27]


> sniknik ©   (21.11.08 15:14) [21]
>
> > Увы, запрос не прошел. Курсор останавливается после join
> и пишет:
> тогда забудь.
>
> > ИБ и его клоны
> IB ладно, черт с ним, но вот клоны... например про Firebird
> 2, читал/говорили что уже почти всю функциональность mssql
> поддерживает, и + что то исконно свое.

в 2,5 встроили регулярные выражения. правда, она пока альфа(эта версия)


 
Виталий Панасенко(дом)   (2008-11-22 10:02) [28]

а по теме: убери подзапрос. сделай либо ХП, либо перейди на ФБ 2,х, там можно выполнить блок. тогда запрос можно переделать так
execute block
as
declare variable d date;
begin
select max(Dsptch_Date)
                      from Dsptch D2
                      where D2.Dsptch_Prdca_ID=D1.Dsptch_Prdca_ID into :d;

SELECT Dsptch_Prdca_ID, Dsptch_PostOffice_ID, Dsptch_Plan,
     Dsptch_MMYY, Dsptch_Date
FROM Dsptch D1, Prdca
WHERE Dsptch_Prdca_ID = Prdca_ID
and D1.Dsptch_Date = :d
AND DSPTCH_MMYY = "1008"
and Prdca_Pttrn = "Вкл."
ORDER BY Dsptch_Prdca_ID, Dsptch_PostOffice_ID;
suspend;
end;
Примерно так, но тут неправильно 100%..:-)


 
sniknik ©   (2008-11-22 11:11) [29]

> либо перейди на ФБ 2,х
и проверь там возможность нормальных подзапросов, объединений с ними.

> Примерно так, но тут неправильно 100%..:-)
не знаю как синтаксис, но тут и по логике не то, тут выбираются все записи на одну максимальную дату. и вполне вероятно что это будет всего одна запись, либо все из одной накладной (например), смотря как там, при каких условиях,  у него идет изменение этого поля индивидуально карточками товара либо накладными.
а по задаче, имхо, должны выбираться все товары с максимальной датой изменения каждого.
если не так, и нужно именно то, что ты написал, то легко просто выполнить 2 запроса подряд, первым получить дату, и передать ее во второй параметром, и ничего менять в смысле версии будет не надо.


 
Виталий Панасенко(дом)   (2008-11-22 15:19) [30]


> sniknik ©   (22.11.08 11:11) [29]

я просто привел макет. а вся тормознутось оригинального запроса - из-за подзапроса...это "больное" место у ФБ(IB)... в плане скорости. лучше переписать в конструкцию for select do... .а в 2,х уже спокойно можно выполнить
> sniknik ©   (21.11.08 13:50) [14]



Страницы: 1 вся ветка

Форум: "Базы";
Текущий архив: 2009.09.20;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.54 MB
Время: 0.005 c
2-1247632669
wiser87
2009-07-15 08:37
2009.09.20
Поведение TEdit на модальной форме.


15-1248125402
Юрий
2009-07-21 01:30
2009.09.20
С днем рождения ! 21 июля 2009 вторник


3-1226996831
linox
2008-11-18 11:27
2009.09.20
Реляционная база данных Access + DBGRID


15-1248422799
GanibalLector
2009-07-24 12:06
2009.09.20
Win2003 ограничение запуска приложения


1-1215704618
badevlad
2008-07-10 19:43
2009.09.20
Список Keyword ов из CHM-help файла





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский