Общий вопрос базы данных - индексированное поле ID Производительность против предельной (верхней) производительности (Salesforce) - PullRequest
0 голосов
/ 13 сентября 2018

Я устраняю неполадки (или, по крайней мере, выявляю) возможные причины плохой производительности запросов в нашей организации Saleforce. Однако я подозреваю, что мой вопрос будет применим к большинству механизмов баз данных.

У нас достаточно большие объемы данных в нашей организации Salesforce. Наши проблемные объекты имеют примерно 15 миллионов записей. Мы создали API поверх нашей организации, который извлекает данные, и мы действительно боремся с производительностью. Пожалуйста, знайте, что мы понимаем, что есть вещи, которые можно сделать в долгосрочной перспективе, но мой вопрос больше касается понимания механизма запросов для баз данных.

Проблема заключается в следующем: Мы можем выполнить запрос:

Select X From Account Where [IndexedField] Like 'value%' LIMIT 1000

по какой-то причине этот запрос превосходит запрос, такой как:

Select X From Account Where [Id] = 'IdValue'

оба поля в предложении where индексируются, но по какой-то причине одному фильтру Id требуется некоторое время, чтобы вернуть результат, где вы можете быстрее получить лучшие X-записи.

Понимая, что SFDC использует гибридный подход EAV к своим данным, но их данные хранятся в БД Oracle, я подозреваю, что это связано с общим способом, которым Oracle выполняет их поиск.

Почему поиск одной записи по идентификатору может занять больше времени, чем поиск [X] записей, соответствующих заданным критериям? Я посмотрел на планы запросов, оба имеют низкую стоимость и, очевидно, ID имеет самую низкую стоимость.

Нужно объяснить нашим ребятам из пользовательского интерфейса влияние поиска по 15M записям в меру своих возможностей.

1 Ответ

0 голосов
/ 13 сентября 2018

Ответом может быть несколько вещей. Статистика таблицы актуальна? На каком оборудовании работает база данных? Настройка производительности базы данных Oracle на машине X7 Exadata будет отличаться от той, которая работает на старом V2. Версия Oracle, которую вы используете, также влияет на это, поскольку в оптимизаторе есть различия. Различные версии Oracle могут обрабатывать идентичные запросы по-разному, даже если они работают на одном и том же оборудовании.

Почему поиск одной записи по идентификатору может занять больше времени, чем найти [X] записи, которые соответствуют заданным критериям? Я посмотрел на планы запросов, оба имеют низкую стоимость, и, очевидно, идентификатор имеет самый низкий стоимость.

Три слова: полное сканирование таблицы. Ваш запрос, собирающий один идентификатор, требует полного сканирования таблицы? План объяснения расскажет вам. Запрос, который требует полного сканирования таблицы, может занять больше времени, чем запрос, который использует сканирование индекса. Однако обратное также может быть истинным в зависимости от вашей среды. Первый запрос, который собирает диапазон значений, очевидно, использует индекс. Почему второй запрос также не использует этот индексированный столбец? Это, вероятно, часть уравнения.

Вот отличный ответ AskTom, который затрагивает эту тему и подробно объясняет, как работает сканирование индекса, хотя вопрос с противоположной точки зрения, почему сканирование индекса может быть медленнее, чем сканирование полной таблицы.

https://asktom.oracle.com/pls/asktom/asktom.search?tag=blocks-read-using-index-vs-full-table-scan

...