Текущее время: Пн, июл 28 2025, 20:35

Часовой пояс: UTC + 3 часа


Правила форума


ВНИМАНИЕ!

Вопросы по SAP Query и Quick View - сюда



Начать новую тему Ответить на тему  [ Сообщений: 55 ]  На страницу 1, 2, 3, 4  След.
Автор Сообщение
 Заголовок сообщения: Как такое может быть?! Быстродействие.
СообщениеДобавлено: Пн, окт 29 2007, 18:47 
Председатель
Председатель
Аватара пользователя

Зарегистрирован:
Чт, сен 23 2004, 18:43
Сообщения: 1556
Откуда: Москва
То ли лыжи не едут, то ли... на пенсию пора :roll:

Делаю выборку из достаточно большой таблицы – размер порядка 100 млн.записей.
Это инфосистема, с квантом времени день, соответственно ограничиваю по SPTAG (дата).
Разумеется, в условии выборки присутствуют также все остальные ключевые поля.
Также используется агрегатная функция SUM для нескольких полей (понятно, с GROUP BY).

Когда делаю выборку по одному дню, скоростью выполнения радует.
Отрабатывает буквально в течении секунды. При том, что выбирает приличный объем данных (2-5 тысяч записей, каждая из них - агрегированная по нескольким полям).
По всем дням порядок количеств записей одинаков (2-5 тысяч, как написал выше), по всем дням в отдельности время выполнения не больше 1 секунды.
Логично предположить, что за месяц выборка должна бы занимать не больше 30 секунд.

ФИК!
Если попытаться сделать выборку за период хотя бы всего за 2 дня (BETWEEN ‘20070903’ AND ‘20070904’) – все подвисает, и очень надолго (хотя если последовательно запустить по каждому из дней – получится не больше 2 секунд).
Понятно, что раз такая петрушка - можно сделать выборку по месяцу не цельную, а разбить ее на 30 (31) частей по каждому из дней месяца.

Но хочется разобраться. КАК ТАКОЕ МОЖЕТ БЫТЬ?!
:shock: :shock:

_________________
Hе иди по течению, не иди против течения - иди поперек него, если хочешь достичь берега.
Слова Ванталы. Дела Ванталы


Последний раз редактировалось 111 Пн, окт 29 2007, 19:14, всего редактировалось 1 раз.

Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пн, окт 29 2007, 19:09 
Председатель
Председатель
Аватара пользователя

Зарегистрирован:
Чт, сен 23 2004, 18:43
Сообщения: 1556
Откуда: Москва
Еще.
Может быть, кто-нибудь объяснит, почему в ALV Grid'e (CL_GUI_ALV_GRID через метод set_table_for_first_display) суммарная строка может упорно рисоваться после массива суммируемых строк (т.е. внизу), а не перед ними (т.е. вверху).

Несмотря на то, что
LVC_S_LAYO-TOTALS_BEF = 'X' .

Заранее спасибо.

_________________
Hе иди по течению, не иди против течения - иди поперек него, если хочешь достичь берега.
Слова Ванталы. Дела Ванталы


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пн, окт 29 2007, 19:41 
Гуру-эксперт
Гуру-эксперт
Аватара пользователя

Зарегистрирован:
Ср, ноя 03 2004, 14:51
Сообщения: 1912
Откуда: КраснАдар
Пол: Мужской
111 написал(а):
... почему в ALV Grid'e (CL_GUI_ALV_GRID через метод set_table_for_first_display) суммарная строка может упорно рисоваться после массива суммируемых строк (т.е. внизу), а не перед ними (т.е. вверху).
Несмотря на то, что
LVC_S_LAYO-TOTALS_BEF = 'X' .

Я могу предположить что это либо "злобный глюк", либо при вызове set_table_for_first_display в параметре не передается (либо передается, но не та) структурка LVC_S_LAYO. Проверьте точно вызов, иногда когда в программе несколько гридов и/или при копи-пастинге забываешь все подправить до нужного состояния. Моё резюме: скорее всего просто ошибка в коде.

ЗЫ А по первому вопросу - можно код выборки посмотреть?


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как такое может быть?! Быстродействие.
СообщениеДобавлено: Пн, окт 29 2007, 20:06 
Президент
Президент

Зарегистрирован:
Пт, апр 28 2006, 22:39
Сообщения: 2514
Откуда: North Taxolina, USA
Пол: Женский
111 написал(а):
Но хочется разобраться.


Надо бы добраться до Execution plan для каждого варианта. Это можно сделать через ST05 или ST04.

И на всякий случай проверьте еще раз свой код и его соответствие индексу в каждой среде (если используете разные). У нас один раз в одной info structure каким-то образом порядок полей оказался разный в DEV и QAS.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пн, окт 29 2007, 20:18 
Старший специалист
Старший специалист

Зарегистрирован:
Сб, окт 21 2006, 20:34
Сообщения: 280
On ORACLE databases, a WHERE condition with BETWEEN is evaluated together with the costs for reading 5 % of all index blocks and table blocks, regardless of the size of the BETWEEN interval. If the BETWEEN interval is sufficiently small, then you can replace WHERE <field> BETWEEN <value 1> AND <value 2> by WHERE <field> IN (<value 1> ,... , <value n>), or alternatively by WHERE <field> IN <range_tab>.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пн, окт 29 2007, 20:56 
Председатель
Председатель
Аватара пользователя

Зарегистрирован:
Чт, апр 13 2006, 12:32
Сообщения: 1503
Откуда: Питер
111 написал(а):
Еще.
Может быть, кто-нибудь объяснит, почему в ALV Grid'e (CL_GUI_ALV_GRID через метод set_table_for_first_display) суммарная строка может упорно рисоваться после массива суммируемых строк (т.е. внизу), а не перед ними (т.е. вверху).

Несмотря на то, что
LVC_S_LAYO-TOTALS_BEF = 'X' .

Заранее спасибо.


Там случайно дефолтовый layout не цепляется?


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пн, окт 29 2007, 21:58 
Гуру-эксперт
Гуру-эксперт
Аватара пользователя

Зарегистрирован:
Ср, ноя 03 2004, 14:51
Сообщения: 1912
Откуда: КраснАдар
Пол: Мужской
vga написал(а):
Там случайно дефолтовый layout не цепляется?

+1. При вызове disvariant используется?


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вт, окт 30 2007, 09:47 
Председатель
Председатель
Аватара пользователя

Зарегистрирован:
Чт, сен 23 2004, 18:43
Сообщения: 1556
Откуда: Москва
Цитата:
Дефолтовый вариант цепляется.

Но то, что в варианте не настраивается - разве может сохраняться при сохранении варианта?


Млин, и правда :evil: .
Отключил дефолтовый (галку "Предварительная настройка"), перезапустил - как надо показывает.
Что-то млин слишком много открытий сразу.

_________________
Hе иди по течению, не иди против течения - иди поперек него, если хочешь достичь берега.
Слова Ванталы. Дела Ванталы


Последний раз редактировалось 111 Вт, окт 30 2007, 15:40, всего редактировалось 2 раз(а).

Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вт, окт 30 2007, 09:57 
Председатель
Председатель
Аватара пользователя

Зарегистрирован:
Чт, сен 23 2004, 18:43
Сообщения: 1556
Откуда: Москва
dump написал(а):
On ORACLE databases, a WHERE condition with BETWEEN is evaluated together with the costs for reading 5 % of all index blocks and table blocks, regardless of the size of the BETWEEN interval. If the BETWEEN interval is sufficiently small, then you can replace WHERE <field> BETWEEN <value 1> AND <value 2> by WHERE <field> IN (<value 1> ,... , <value n>), or alternatively by WHERE <field> IN <range_tab>.


Ага, вот это кажется оно, спасибо.

На самом деле, для ограничения по датам используется ranges . Когда Options = BT, оно преобразуется в BETWEEN в SQL .
Млин, это что ж получается? :roll:
Для выборок из всех больших таблиц, анализировать Ranges и, если там BT - раскатывать в отдельные значения?!
Млин. :roll:

Самое странное - почему же раньше ни с чем подобным не сталкивался? Та же MSEG больше на порядок.

_________________
Hе иди по течению, не иди против течения - иди поперек него, если хочешь достичь берега.
Слова Ванталы. Дела Ванталы


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вт, окт 30 2007, 10:13 
Специалист
Специалист
Аватара пользователя

Зарегистрирован:
Вт, авг 17 2004, 16:09
Сообщения: 202
дык а betwen в ранж засунуть не судьба ?

I BT Low High


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вт, окт 30 2007, 10:13 
Гуру-модератор
Гуру-модератор
Аватара пользователя

Зарегистрирован:
Пн, окт 11 2004, 20:32
Сообщения: 2470
Пол: Мужской
111 написал(а):
Ага, вот это кажется оно, спасибо.

На самом деле, для ограничения по датам используется ranges . Когда Options = BT, оно преобразуется в BETWEEN в SQL .
Млин, это что ж получается? :roll:
Для выборок из всех больших таблиц, анализировать Ranges и, если там BT - раскатывать в отдельные значения?!
Млин. :roll:

Самое странное - почему же раньше ни с чем подобным не сталкивался? Та же MSEG больше на порядок.

А планы запросов то смотрели? Какие индексы подхватываются, заодно глянуть как давно статистика по ним собиралась... может там собака порылась

_________________
- Может ли настоящий мастер кунг-фу получить по морде?
- Настоящий мастер может все!


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вт, окт 30 2007, 10:15 
Председатель
Председатель
Аватара пользователя

Зарегистрирован:
Чт, сен 23 2004, 18:43
Сообщения: 1556
Откуда: Москва
Snegurenok написал(а):
дык а betwen в ранж засунуть не судьба ?

I BT Low High


Цитата:
На самом деле, для ограничения по датам используется ranges . Когда Options = BT, оно преобразуется в BETWEEN в SQL .

_________________
Hе иди по течению, не иди против течения - иди поперек него, если хочешь достичь берега.
Слова Ванталы. Дела Ванталы


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вт, окт 30 2007, 10:19 
Председатель
Председатель
Аватара пользователя

Зарегистрирован:
Чт, апр 13 2006, 12:32
Сообщения: 1503
Откуда: Питер
Без селекта и плана выполнения запроса для обоих случаев - пальцем в небо тыкать :cry:


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вт, окт 30 2007, 11:24 
Менеджер
Менеджер
Аватара пользователя

Зарегистрирован:
Пн, май 14 2007, 13:05
Сообщения: 561
Откуда: Москва
Цитата:
Логично предположить, что за месяц выборка

Если нужна выборка именно за месяц, можно ограничить выбор
Code:
where SPTAG like 'YYYYMM%'


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вт, окт 30 2007, 11:56 
Председатель
Председатель
Аватара пользователя

Зарегистрирован:
Чт, сен 23 2004, 18:43
Сообщения: 1556
Откуда: Москва
Планы выполнения смотрел, но если честно, ничего не понял.

Code:
   
  SELECT  sptag
          matnr
          pkunag AS kunag
          valdt
     SUM( fkimg ) AS menge
     SUM( netwr )
     SUM( kzwi6 ) AS sebest
    FROM s987
                  INTO TABLE ltd_s987
   WHERE ssour = space
     AND vrsio = '000'
     AND spmon = '000000'
     AND sptag IN s_date
     AND spwoc = '000000'
     AND spbup = '000000'
     AND werks IN s_werks
     AND bukrs EQ '1000'
     AND vkorg = '1000'
     AND vtweg IN ('10', '20')
     AND fkart = 'FP'
     AND pkunag IN ltr_kunag
  GROUP BY sptag
           matnr
           pkunag
           valdt
             .


Ключ S987:

Code:
 
MANDT
SSOUR
VRSIO
SPMON
SPTAG
SPWOC
SPBUP
WERKS
BUKRS
VKORG
VTWEG
VBELN
FKART
PKUNAG
MATNR
POSNR


План запроса при выборке за один день:
Code:
SELECT
  "SPTAG" , "MATNR" , "PKUNAG" "KUNAG" , "VALDT" , SUM
  SUM( "NETWR" ) , SUM( "KZWI6" ) "SEBEST"
FROM
  "S987"
WHERE
  "MANDT" = :A0 AND "SSOUR" = :A1 AND "VRSIO" = :A2 AN
  "SPWOC" = :A4 AND "SPBUP" = :A5 AND "SPTAG" = :A6 AN
  "WERKS" = :A8 AND "VKORG" = :A9 AND "VTWEG" IN ( :A1
  :A12 AND "PKUNAG" IN ( :A13 , :A14 )
GROUP BY
  "SPTAG" , "MATNR" , "PKUNAG" , "VALDT"

SELECT STATEMENT ( Estimated Costs = 48 , Estimated #Rows = 1 )

       4 SORT GROUP BY
         ( Estim. Costs = 48 , Estim. #Rows = 1 )

           3 INLIST ITERATOR

               2 TABLE ACCESS BY INDEX ROWID S987
                 ( Estim. Costs = 2 , Estim. #Rows = 1 )

                   1 INDEX RANGE SCAN S987~0
                     ( Estim. Costs = 13 , Estim. #Rows = 1 )
                     Search Columns: 12

Это быстрая выборка, по одному дню, 03.09.2007 (выполняется за полсекунды).

Ниже выборка за период 03.09.2007 - 04.09.2007 .
Крутится уже часа 2 .

Code:
SELECT
  "SPTAG" , "MATNR" , "PKUNAG" "KUNAG" , "VALDT" , SUM( "FKIMG" ) "MENGE" , SUM( "NETWR" ) ,
  SUM( "KZWI6" ) "SEBEST"
FROM
  "S987"
WHERE
  "MANDT" = :A0 AND "SSOUR" = :A1 AND "VRSIO" = :A2 AND "SPMON" = :A3 AND "SPWOC" = :A4 AND "SPBUP"
  = :A5 AND "SPTAG" BETWEEN :A6 AND :A7 AND "BUKRS" = :A8 AND "WERKS" = :A9 AND "VKORG" = :A10 AND
  "VTWEG" IN ( :A11 , :A12 ) AND "FKART" = :A13 AND "PKUNAG" IN ( :A14 , :A15 )
GROUP BY
  "SPTAG" , "MATNR" , "PKUNAG" , "VALDT"#


Execution Plan

Explain from v$sql_plan: Address: 000000118A870EB0 Hash_value:  1499377273 Child_number:  0




SELECT STATEMENT ( Estimated Costs = 130 , Estimated #Rows = 0 )

        4 SORT GROUP BY
          ( Estim. Costs = 130 , Estim. #Rows = 2 )

            3 FILTER

                2 TABLE ACCESS BY INDEX ROWID S987
                  ( Estim. Costs = 83 , Estim. #Rows = 2 )

                    1 INDEX RANGE SCAN S987~VAB
                      ( Estim. Costs = 26 , Estim. #Rows = 57.695.716 )


Ничего не понимаю.
До поля SPTAG в условии идет сплошной ключ.
Только у полей FKART, PKUNAG разрыв ключа в 1 поле (VBELN ну участвует в выборке и условии).

_________________
Hе иди по течению, не иди против течения - иди поперек него, если хочешь достичь берега.
Слова Ванталы. Дела Ванталы


Последний раз редактировалось 111 Вт, окт 30 2007, 12:55, всего редактировалось 2 раз(а).

Принять этот ответ
Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 55 ]  На страницу 1, 2, 3, 4  След.

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB