Текущее время: Сб, июл 26 2025, 09:58

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


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


ВНИМАНИЕ!

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



Начать новую тему Ответить на тему  [ Сообщений: 56 ]  На страницу 1, 2, 3, 4  След.
Автор Сообщение
 Заголовок сообщения: SELECT с индексом читает всю таблицу
СообщениеДобавлено: Ср, авг 29 2007, 18:59 
Президент
Президент

Зарегистрирован:
Пт, апр 28 2006, 22:39
Сообщения: 2514
Откуда: North Taxolina, USA
Пол: Женский
Basis прислал email, что якобы по одной таблице все время делается full table scan, мол, проверьте, что вы там с SELECTами наворотили. Смотрю SELECT, а там вроде все нормально:

Code:
          SELECT SINGLE SUM( wmeng ) INTO ord_qty_cse
            FROM zsd_discounts
            WHERE spmon   =  i_asrtcds-spmon
            AND   sptag   =  i_asrtcds-sptag
            AND   vkorg   =  i_asrtcds-vkorg
            AND   kunnr   =  i_asrtcds-kunnr
            AND   konda   =  i_asrtcds-konda
            AND   zzatwrt =  i_asrtcds-zzatwrt
            AND   pstyv   IN i_itmcat-r_zzpstyv.


Индекс таблицы:

Code:
MANDT
SPMON
SPTAG
VKORG
KUNNR
KONDA
ZZATWRT
PSTYV


Поля в i_asrtcds все с таким же типом как в Z таблице. Единственное, что заметила - из SPMON / SPTAG только одно поле может быть заполнено, но по идее initial value должна тоже работать. Почему читается вся таблица, а не пара записей по указанному ключу - не понятно. Сталкивался ли кто-нибудь с такими проблемами? БД - SQL Server 2007.


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

Зарегистрирован:
Ср, мар 02 2005, 20:19
Сообщения: 133
Откуда: Moscow
А у вашей таблицы случайно полная буферизация не включена?


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

Зарегистрирован:
Чт, окт 06 2005, 16:44
Сообщения: 3080
Откуда: Москва
Попробуйте изменить индекс так:
Code:
MANDT
VKORG
KUNNR
KONDA
ZZATWRT
SPMON
SPTAG
PSTYV

чтобы селективность полей возрастала к концу индекса.

В транзакции ST05 проведите эксперимент и посмотрите план запроса.

_________________
С уважением,
Удав.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: SELECT с индексом читает всю таблицу
СообщениеДобавлено: Чт, авг 30 2007, 07:47 
Менеджер
Менеджер
Аватара пользователя

Зарегистрирован:
Ср, июн 13 2007, 16:36
Сообщения: 585
Откуда: Belarus
Пол: Мужской
Jelena написала:
Code:
          SELECT SINGLE SUM( wmeng ) INTO ord_qty_cse
            FROM zsd_discounts
            WHERE spmon   =  i_asrtcds-spmon
            AND   sptag   =  i_asrtcds-sptag
            AND   vkorg   =  i_asrtcds-vkorg
            AND   kunnr   =  i_asrtcds-kunnr
            AND   konda   =  i_asrtcds-konda
            AND   zzatwrt =  i_asrtcds-zzatwrt
            AND   pstyv   IN i_itmcat-r_zzpstyv.


Индекс таблицы:

Code:
MANDT
SPMON
SPTAG
VKORG
KUNNR
KONDA
ZZATWRT
PSTYV


В индексе есть ещё поле mandt. В запросе его нет, поэтому поиск идёт не по индексу. Попробуйте так:
Code:
          SELECT SINGLE SUM( wmeng ) INTO ord_qty_cse
            FROM zsd_discounts client specified
            WHERE mandt = sy-mandt
            AND spmon   =  i_asrtcds-spmon
            AND   sptag   =  i_asrtcds-sptag
            AND   vkorg   =  i_asrtcds-vkorg
            AND   kunnr   =  i_asrtcds-kunnr
            AND   konda   =  i_asrtcds-konda
            AND   zzatwrt =  i_asrtcds-zzatwrt
            AND   pstyv   IN i_itmcat-r_zzpstyv.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: SELECT с индексом читает всю таблицу
СообщениеДобавлено: Чт, авг 30 2007, 08:19 
Специалист
Специалист

Зарегистрирован:
Пт, апр 13 2007, 17:15
Сообщения: 225
Dzed Maroz написал:
В индексе есть ещё поле mandt. В запросе его нет, поэтому поиск идёт не по индексу.

Кхм, SAP когда запрос БД отдаёт, сам mandt подставляет.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: SELECT с индексом читает всю таблицу
СообщениеДобавлено: Чт, авг 30 2007, 08:42 
Менеджер
Менеджер
Аватара пользователя

Зарегистрирован:
Ср, июн 13 2007, 16:36
Сообщения: 585
Откуда: Belarus
Пол: Мужской
EvgenySA написал(а):
Dzed Maroz написал:
В индексе есть ещё поле mandt. В запросе его нет, поэтому поиск идёт не по индексу.

Кхм, SAP когда запрос БД отдаёт, сам mandt подставляет.

Ну-у-у-у, не знаю, подставляет он или нет, однако оптимизатор запросов показывает уменьшенный общий критерий оценки, если в запросе перечислить все поля, составляющие индекс. Да и на практике неоднократно проверено.


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

Зарегистрирован:
Вс, окт 17 2004, 14:20
Сообщения: 326
Откуда: Москва
1. Попробуйте этот же селект непосредственно в MS Query Analyzer'e запустить и посмотрите какой план запроса строится там.
2. Случаем не добавляли в таблицу одно из полей, по которому делается выборка, после того, как там уже были записи? Если да, то не забыли сделать адаптацию таблицы в утилите базы данных? В этом случае новое поле у существующих записей может остаться неинициализированным...
3. Сколько записей в таблице БД? Если таблица маленькая, то оптимизатор СУБД может выбрать full scan, даже если вы делаете селект по индексу.
4. Как давно обновлялась статистика БД?

Вообще, хорошие у вас базисники, если такие вещи отслеживают...


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: SELECT с индексом читает всю таблицу
СообщениеДобавлено: Чт, авг 30 2007, 10:53 
Старший специалист
Старший специалист
Аватара пользователя

Зарегистрирован:
Пт, июл 01 2005, 13:23
Сообщения: 303
Откуда: Питер
Пол: Мужской
Dzed Maroz написал:
EvgenySA написал(а):
Dzed Maroz написал:
В индексе есть ещё поле mandt. В запросе его нет, поэтому поиск идёт не по индексу.

Кхм, SAP когда запрос БД отдаёт, сам mandt подставляет.

Ну-у-у-у, не знаю, подставляет он или нет, однако оптимизатор запросов показывает уменьшенный общий критерий оценки, если в запросе перечислить все поля, составляющие индекс. Да и на практике неоднократно проверено.


Почлушайте этот совет. Так и есть. Сам проверял неоднократно, пока не подставишь mandt в селект руками - индекс не отрабатывает.


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

Зарегистрирован:
Вс, окт 17 2004, 14:20
Сообщения: 326
Откуда: Москва
Т.е. хотите сказать, что пока вы не подставляли mandt, запрос к СУБД для мандантнозависимой таблицы уходил без этого поля? Подставляй мандант в запросе OPEN SQL, не подставляй - native SQL-запрос к СУБД, который формируется интерфейсом к базам данных от этого не изменится.


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

Зарегистрирован:
Пт, июл 01 2005, 13:23
Сообщения: 303
Откуда: Питер
Пол: Мужской
ABC написал(а):
Т.е. хотите сказать, что пока вы не подставляли mandt, запрос к СУБД для мандантнозависимой таблицы уходил без этого поля? Подставляй мандант в запросе OPEN SQL, не подставляй - native SQL-запрос к СУБД, который формируется интерфейсом к базам данных от этого не изменится.


А вы не думайте, вы сделайте :) Я ещё раз повторюсь, если бы сам не делал не говорил бы. Я не знаю чем вызваны эти слодности но факт есть факт. Пока в селекте не прописал mandt индекс не отрабатывал.


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

Зарегистрирован:
Вс, окт 17 2004, 14:20
Сообщения: 326
Откуда: Москва
А я делал :) И у меня индексы без client specified отрабатывали ;) Я, конечно, верю. Но это мистика какая-то. Жалко, что Вы до конца не разобрались в чем дело...


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

Зарегистрирован:
Ср, июн 13 2007, 16:36
Сообщения: 585
Откуда: Belarus
Пол: Мужской
ABC написал(а):
А я делал :) И у меня индексы без client specified отрабатывали ;) Я, конечно, верю. Но это мистика какая-то. Жалко, что Вы до конца не разобрались в чем дело...

Да вроде никакой мистики :)
Индексы-то разные бывают.
client specified - это только для случая, когда в индексе есть mandt. Если его нету - не нужно. Попробуй сам в коде сделать что-нить типа
Code:
select ... where mandt eq sy-mandt

и
Code:
select ... client specified where mandt eq sy-mandt

В первом случае у тебя компилятор будет грязно ругаццо :wink:


Последний раз редактировалось Dzed Maroz Чт, авг 30 2007, 11:30, всего редактировалось 1 раз.

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

Зарегистрирован:
Пт, июл 01 2005, 13:23
Сообщения: 303
Откуда: Питер
Пол: Мужской
ABC написал(а):
А я делал :) И у меня индексы без client specified отрабатывали ;) Я, конечно, верю. Но это мистика какая-то. Жалко, что Вы до конца не разобрались в чем дело...

Знаю одно. Мы сидели вместе с базисником... Он смотрел как строятся запросы в базу и в том и другом случае.. После всего увиденного прозвучало примерно следующее: "Ну фиг знает!". Главное что работает :)


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

Зарегистрирован:
Вс, окт 17 2004, 14:20
Сообщения: 326
Откуда: Москва
Dzed Maroz написал:
ABC написал(а):
А я делал :) И у меня индексы без client specified отрабатывали ;) Я, конечно, верю. Но это мистика какая-то. Жалко, что Вы до конца не разобрались в чем дело...

Да вроде никакой мистики :)
Индексы-то разные бывают.
client specified - это только для случая, когда в индексе есть mandt. Если его нету - не нужно. Попробуй сам в коде сделать что-нить типа
Code:
select ... where mandt eq sy-mandt

и
Code:
select ... client specified where mandt eq sy-mandt

В первом случае у тебя компилятор будет грязно ругаццо :wink:

Для особо умных :) - я имел ввиду, что в индексе у меня мандант был, а в селекте его не было и все работало, а не то, что я мандант указывал без client specified ;)


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

Зарегистрирован:
Пт, апр 13 2007, 17:15
Сообщения: 225
Preatos написал:
ABC написал(а):
А я делал :) И у меня индексы без client specified отрабатывали ;) Я, конечно, верю. Но это мистика какая-то. Жалко, что Вы до конца не разобрались в чем дело...

Знаю одно. Мы сидели вместе с базисником... Он смотрел как строятся запросы в базу и в том и другом случае.. После всего увиденного прозвучало примерно следующее: "Ну фиг знает!". Главное что работает :)

О сколько нам открытий чудных ...
А что за СУБД? На ORACLE такого не замечал :?


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

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


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

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


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

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