Я использую сервер данных прогресса для oracle. Фактическая БД находится на ORACLE 11g, и только схема выполнения создается с помощью схемы Oracle Oracle и используется для подключения Oracle DB с использованием ora-brokers. Мы хотим, чтобы Oracle обрабатывала выбор индекса в соответствии с планом выполнения, поэтому мы добавили параметр -noindexhint для Data Server и остановили подсказки индекса от запросов, которые попадают в Oracle. Теперь проблема даже в том случае, если нет указателя индекса, сервер данных добавляет порядок предложения к SQL-запросу, используя индексы, соответствующие столбцам клаузулы и их последовательности. (Даже если предложение where не используется в запросе прогресса). Из-за этого порядка, поступающего с сервера данных, Oracle вынужден использовать другой индекс, который занимает много времени. Одним из решений здесь является удаление всех индексов из держателя схемы, как в исходном коде, мы не используем какое-либо явное ключевое слово use-index. Просьба предоставить ваши комментарии для рассмотрения этого дела.Остановить связанные с индексом подсказки и предложения из сервера данных Progress для oracle
ответ
Вы не должны предотвращать попытки глобального предотвращения заказа, и я уверен, что вы не можете сделать это с помощью переключателя.
Причина, по которой добавляется заказ, заключается в том, что Progress пытается поддерживать такое же поведение, как если бы код работал с БД Progress. Значение, если вы используете FIND FIRST (для примера), есть конкретное значение, которым является запись FIRST, а не только случайная запись (например, Oracle, если вы не укажете порядок).
В целом (но не всегда), когда у меня возникают эти проблемы, я обнаружил, что статистика для столбцов недостаточно детальная, чтобы знать, сколько записей возвращается и/или параметры сортировки/ввода-вывода не заданы должным образом. Это приводит к тому, что CBO принимает неверные решения и выбирает путь указателя вместо сортировки возвращаемого обычно маленького подмножества.
Сначала я проверил их, и убедитесь, что у вас есть соответствующее количество гистограмм или переключитесь на SKEW, прежде чем вы начнете возиться со держателем схемы.
Извлечение индексов из держателя схемы будет проблематичным, поскольку это повлияет на то, как Progress видит отношения между таблицами и уникальность таблиц.
У вас есть варианты, связанные несколько кодов, а также:
- Запуск хранимой процедуры вместо FOR/FIND.
- Запустите проход через SQL вместо использования FOR/FIND.
- Добавить индексы на стороне Oracle, которые соответствуют указанным сортировкам
Спасибо за ввод. Заказ будет применяться, если в таблице указано несколько записей для этого конкретного предложения where. Но что, если в таблице есть только одна запись? Могу ли я удалить индекс из держателя схемы, так как в любом случае я использую noindexhint и хочу, чтобы оракул решал выбор индекса. –
Если в таблице есть только одна запись, и статистика правильная, я не могу представить ситуацию, когда Oracle будет использовать индекс независимо от намеков. Если есть несколько записей, и он возвращает только один, то приказ все еще имеет значение для приложения. На мой взгляд, вы боретесь с неправильным вопросом. – TheMadDBA
Извините за неправильную информацию. Только одной записью я имею в виду одну запись для этого конкретного предложения where в запросе. Таким образом, окончательный набор записей из этого запроса будет одной записью. –