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

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


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


ВНИМАНИЕ!

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



Начать новую тему Ответить на тему  [ Сообщений: 55 ]  На страницу Пред.  1, 2, 3, 4  След.
Автор Сообщение
 Заголовок сообщения:
СообщениеДобавлено: Вт, ноя 06 2007, 11:44 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Чт, авг 19 2004, 17:37
Сообщения: 1962
Откуда: Москва
Пол: Мужской
111 написал(а):
Parazit написал:
111 написал(а):
На самом деле, мне в принципе было интересны причины такого странного поведения.

Ничего странного, всё очевидно. Четко оптимизируюется только условия "=" объединенные "AND". Соответственно, исходя из этого, нужно строить индексы, помещая поля, выбираемые по "=", вверх ключа.


Ну я, честно сказать, за 7 лет работы столкнулся с такими чудесами впервые.

Это зависит от оптимизатора СУБД. Например, в Foxpro, могло быть и незаметно больших проблем. А в Sybase, Informix и Oracle - регулярно!

_________________
"For all entries" не в SAP-ах, "for all entries" в головах! :)


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

Зарегистрирован:
Сб, окт 21 2006, 20:34
Сообщения: 280
vga написал(а):
В данном эхплайн плане видно, что подцепился не тот индекс. То есть база, использую неверный индекс не имеет информации о сортировке, чтобы выполнить твой group by и поэтому вынуждена сначала создать промежуточную таблицу, отсортировать ее , а потом только по ней обработать запрос.

Короче, если CLIENT SPECIFIED не поможет, используй %_HINTS c явным указанием индекса.


А кстати в Oracle то можно указать индекс в хинте - а вот в DB6 (DB2 )
я не нашел - там только через OPTLEVEL можно как-то влиять на план выполнения или у кого-то есть другая информация ?


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

Зарегистрирован:
Чт, сен 23 2004, 18:43
Сообщения: 1556
Откуда: Москва
Parazit написал:
111 написал(а):
Так вот, селектом выбираются... несуществующие записи.
Т.е. ставим точку прерывания сразу за SELECT... , ищем запись с таким ключом в SE16 и... не находим :shock: :shock: :shock: .

Select и SE16 - далеко не одно и то же. Ключи, введенные на экране SE16 сначала преобразуются. Могут быть удалены лидирующие нули, или наоборот, добавлены. Или из внешнего представления переведены во внутренее.


Я в курсе :D .
От себя добавлю еще одно отличие - SE16 всегда читает, минуя буфер.
Поэтому в случае сбоев, с буферизованными таблицами бывает такой глюк: в SE16 запись есть, а селект в программе его не находит. Лечится с помощью /$SYNC .

Parazit написал:
Modify отличается от Update тем, что Modify добавит запись, если она не существует, а Update может модифицировать только существующие.


Я в курсе :D .
Фишка в том, что Modify не отрабатывал вообще совсем никак. Ни добавлял запись, ни модифицировал имеющуюся.
Но выдавал при этом SY-SUBRC = 0 .

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


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

Зарегистрирован:
Сб, окт 21 2006, 20:34
Сообщения: 280
111 написал(а):
111 написал(а):

Parazit написал:
Modify отличается от Update тем, что Modify добавит запись, если она не существует, а Update может модифицировать только существующие.


Я в курсе :D .
Фишка в том, что Modify не отрабатывал вообще совсем никак. Ни добавлял запись, ни модифицировал имеющуюся.
Но выдавал при этом SY-SUBRC = 0 .


так если SY-SUBRC = 0 так может COMMIT WORK надо было сделать :D
- да и вообще MODIFY внутри SELECT - ENDSELECT не очень хорошо
- лучше собрать внутр. таблицу да MODIFY FROM TABLE


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

Зарегистрирован:
Чт, апр 13 2006, 12:32
Сообщения: 1503
Откуда: Питер
dump написал(а):
А кстати в Oracle то можно указать индекс в хинте - а вот в DB6 (DB2 )
я не нашел - там только через OPTLEVEL можно как-то влиять на план выполнения или у кого-то есть другая информация ?


Посмотри ноты
162034
150037

Правильная статейка про хинты http://www.sapbasis.ru/articles/opensqlhints/


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

Зарегистрирован:
Чт, сен 23 2004, 18:43
Сообщения: 1556
Откуда: Москва
dump написал(а):
111 написал(а):

Parazit написал:
Modify отличается от Update тем, что Modify добавит запись, если она не существует, а Update может модифицировать только существующие.


Я в курсе :D .
Фишка в том, что Modify не отрабатывал вообще совсем никак. Ни добавлял запись, ни модифицировал имеющуюся.
Но выдавал при этом SY-SUBRC = 0 .


так если SY-SUBRC = 0 так может COMMIT WORK надо было сделать :D
- да и вообще MODIFY внутри SELECT - ENDSELECT не очень хорошо
- лучше собрать внутр. таблицу да MODIFY FROM TABLE


Порядка 60 млн записей => бухнется в дамп из-за нехватки памяти. Поэтому приходится делать именно так.
А COMMIT WORK работает только для LUW, для прямых апдейтов - никакого влияния не оказывает.

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


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

Зарегистрирован:
Ср, ноя 03 2004, 14:51
Сообщения: 1912
Откуда: КраснАдар
Пол: Мужской
111 написал(а):
dump написал(а):
так если SY-SUBRC = 0 так может COMMIT WORK надо было сделать :D
- да и вообще MODIFY внутри SELECT - ENDSELECT не очень хорошо
- лучше собрать внутр. таблицу да MODIFY FROM TABLE


Порядка 60 млн записей => бухнется в дамп из-за нехватки памяти. Поэтому приходится делать именно так.
А COMMIT WORK работает только для LUW, для прямых апдейтов - никакого влияния не оказывает.

Может все таки <я не знать русский языка> как dump предлагал, из таблички БД модифицировать, только побить предварительно на куски по 0,5-1 млн.записей или мельче?


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

Зарегистрирован:
Сб, окт 21 2006, 20:34
Сообщения: 280
111 написал(а):
dump написал(а):
111 написал(а):

Parazit написал:
Modify отличается от Update тем, что Modify добавит запись, если она не существует, а Update может модифицировать только существующие.


Я в курсе :D .
Фишка в том, что Modify не отрабатывал вообще совсем никак. Ни добавлял запись, ни модифицировал имеющуюся.
Но выдавал при этом SY-SUBRC = 0 .


так если SY-SUBRC = 0 так может COMMIT WORK надо было сделать :D
- да и вообще MODIFY внутри SELECT - ENDSELECT не очень хорошо
- лучше собрать внутр. таблицу да MODIFY FROM TABLE


Порядка 60 млн записей => бухнется в дамп из-за нехватки памяти. Поэтому приходится делать именно так.
А COMMIT WORK работает только для LUW, для прямых апдейтов - никакого влияния не оказывает.


если 60 млн. то все равно надо бить на пачки по 30тыс ( по-моему - могу ошибаться ) есть у сапа рекомендации ) - а по поводу
commit не согласен - из документации по COMMIT WORK

COMMIT WORK also

Calls the subroutines specified by PERFORM ... ON COMMIT
......
Executes a database commit on all database connections
......
а у вас LUW начался или по началу транзакции или если до выполнения вашего оператора был commit или rollback


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

Зарегистрирован:
Чт, сен 23 2004, 18:43
Сообщения: 1556
Откуда: Москва
dump написал(а):
а по поводу
commit не согласен - из документации по COMMIT WORK

COMMIT WORK also

Calls the subroutines specified by PERFORM ... ON COMMIT
......
Executes a database commit on all database connections
......
а у вас LUW начался или по началу транзакции или если до выполнения вашего оператора был commit или rollback


А вы возьмите и проведите эксперимент, убедитесь сами.
Будете очень удивлены :D .
Ни COMMIT WORK, ни ROLLBACK WORK никакого влияния на прямые апдейты не производят. Данные сразу спускаются в БД.

Как я провел и был нимало удивлен, несколько лет назад.

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


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

Зарегистрирован:
Чт, апр 13 2006, 12:32
Сообщения: 1503
Откуда: Питер
не спорьте ;-)
Code:
DATA: l_count TYPE I.
TABLES vbdata.
DATA: it_table TYPE TABLE of bkpf WITH HEADER LINE.
SELECT * FROM BKPF INTO TABLE it_table UP TO 1 ROWS .

SELECT SINGLE COUNT(*) FROM vbdata INTO l_count.
WRITE: / 'Before update',  l_count.

MODIFY BKPF FROM TABLE it_table.

SELECT SINGLE COUNT(*) FROM vbdata INTO l_count.
WRITE: / 'After update before commit',  l_count.

COMMIT WORK.

SELECT SINGLE COUNT(*) FROM vbdata INTO l_count.
WRITE: / 'After update after commit',  l_count.


результат
Цитата:
Before update 8
After update before commit 8
After update after commit 8



Но
Code:
Adding or changing lines with the MODIFY command is only completed after a database commit (see LUW) has been performed. Before the database commit has been performed, any database changes can be reversed with a database rollback (see Programming transactions).

Database commit and rollback
Within an LUW, database changes are not made until after a database commit. Prior to this, any database change can be canceled by a database rollback.

In the R/3 System, a database commit is triggered either automatically or by the ABAP/4 command COMMIT WORK or the appropriate Native SQL command for the database system.
Similarly, a database rollback is triggered either automatically or by the ABAP/4 command ROLLBACK WORK or the appropriate Native SQL command for the database system.


Последний раз редактировалось vga Вт, ноя 06 2007, 15:46, всего редактировалось 1 раз.

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

Зарегистрирован:
Сб, окт 21 2006, 20:34
Сообщения: 280
vga написал(а):
не спорьте ;-)
Code:
DATA: l_count TYPE I.
TABLES vbdata.
DATA: it_table TYPE TABLE of bkpf WITH HEADER LINE.
SELECT * FROM BKPF INTO TABLE it_table UP TO 1 ROWS .

SELECT SINGLE COUNT(*) FROM vbdata INTO l_count.
WRITE: / 'Before update',  l_count.

MODIFY BKPF FROM it_table.

SELECT SINGLE COUNT(*) FROM vbdata INTO l_count.
WRITE: / 'After update before commit',  l_count.

COMMIT WORK.

SELECT SINGLE COUNT(*) FROM vbdata INTO l_count.
WRITE: / 'After update after commit',  l_count.


результат
Цитата:
Before update 8
After update before commit 8
After update after commit 8


Они то сразу записываются но не в БД а в журнал обновления данных и select их вытаскивает :D - но по COMMIT - они записываются именно в БД без возможности отмены - то есть если вместо commit поставить rollback - то мы снова увидим предыдущее значение


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

Зарегистрирован:
Чт, апр 13 2006, 12:32
Сообщения: 1503
Откуда: Питер
Ну короче не то написал. :lol: vbdata - Таблица запросов, которые должны быть выполнеты в update task. Состояние Rollback segment наверно только через native sql можно прочитать.


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

Зарегистрирован:
Сб, окт 21 2006, 20:34
Сообщения: 280
vga написал(а):
dump написал(а):
А кстати в Oracle то можно указать индекс в хинте - а вот в DB6 (DB2 )
я не нашел - там только через OPTLEVEL можно как-то влиять на план выполнения или у кого-то есть другая информация ?


Посмотри ноты
162034
150037

Правильная статейка про хинты http://www.sapbasis.ru/articles/opensqlhints/


меня эта статья и натолкнула на вопрос - я в ней и ноте 150037 не нашел четкого указания индекса в хинте для DB6


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

Зарегистрирован:
Чт, апр 13 2006, 12:32
Сообщения: 1503
Откуда: Питер
dump написал(а):
меня эта статья и натолкнула на вопрос - я в ней и ноте 150037 не нашел четкого указания индекса в хинте для DB6


Code:
* begin of note 977867
          %_HINTS ORACLE 'INDEX("&TABLE&" "COSS~9")'
                  DB6 '<IXSCAN TABLE=''COSS'' SAP_INDEX=''9'' />'.
* end of note 977867


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

Зарегистрирован:
Сб, окт 21 2006, 20:34
Сообщения: 280
vga написал(а):
dump написал(а):
меня эта статья и натолкнула на вопрос - я в ней и ноте 150037 не нашел четкого указания индекса в хинте для DB6


Code:
* begin of note 977867
          %_HINTS ORACLE 'INDEX("&TABLE&" "COSS~9")'
                  DB6 '<IXSCAN TABLE=''COSS'' SAP_INDEX=''9'' />'.
* end of note 977867


спасибо - то что надо


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

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


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

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


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

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