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

Часовой пояс: 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 часа


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

Сейчас этот форум просматривают: Google [Bot]


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

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