Хотя в последние годы тенденция к реляционным базам данных все больше смещается в сторону оптимизации запросов на основе затрат, СУБД не существует. Мне известно, что она по своей сути поддерживает определение максимальной стоимости (во времени или в / в) для запроса .
Идея "просто дать ему время и использовать записи, собранные до сих пор" является ошибочным решением. Недостаток заключается в том, что сложный запрос может тратить первые 5 секунд на выполнение хэша на поддереве плана запроса, чтобы сгенерировать данные, которые будут использоваться более поздней частью плана. Так что через 5 секунд у вас все еще может не быть записей.
Чтобы получить максимально возможное количество записей за 5 секунд, вам понадобится запрос с известным расчетным планом выполнения, который затем можно будет использовать для оценки оптимального количества записей, запрашиваемых для создания запрос выполняется как можно ближе к 5 секундам. Другими словами, зная, что оптимизатор запросов оценивает, что он может обрабатывать 875 записей в секунду, вы можете запросить 4 375 записей. Запрос может выполняться немного дольше, чем 5 секунд, но со временем ваше среднее выполнение должно упасть почти на 5 секунд.
Итак ... как это сделать?
В вашей конкретной ситуации это невозможно. Улов - «известный примерный план выполнения». Чтобы это работало надежно, вам понадобится хранимая процедура с известным планом выполнения, а не специальный запрос. Поскольку вы не можете создавать хранимые процедуры в своей среде, это не является началом. Тем не менее, для тех, кто хочет исследовать это решение, вот академическая статья группы, которая внедрила эту концепцию в Oracle. Я не читал полный текст статьи, но, основываясь на резюме, это звучит как их работа может быть переведен в любую СУБД с оптимизацией на основе затрат (например, MS SQL, MySQL и т. д.)
ОК, так что вы можете сделать в вашей ситуации?
Если вы не можете сделать это «правильным» способом, решите это с помощью взлома.
Мое предложение: ведите собственную статистику "оценочной стоимости".
Сделайте некоторое тестирование заранее и оцените, сколько строк вы обычно можете вернуть за 4 секунды. Допустим, это число 18 000.
Таким образом, вы ограничиваете свой запрос до 18 000 строк. Но вы также отслеживаете время выполнения при каждом запуске и сохраняете скользящее среднее, скажем, за последние 50 выполнений. Если это среднее значение меньше 4,5 с, добавьте 1% к размеру запроса и сбросьте скользящее среднее. Итак, теперь ваше приложение каждый раз запрашивает 18 180 строк. После 50 итераций, если скользящее среднее меньше 4,5 с, снова добавьте 1%.
И если ваша скользящая средняя превышает 4,75 с, вычтите 1%.
Со временем этот метод должен сходиться к оптимизированному N-рядному решению для вашего конкретного запроса / среды / и т. Д. И должен корректироваться (медленно, но неуклонно) при изменении условий (например, высокий параллелизм или низкий параллелизм)
Только один - поцарапайте это, два - больше вещей ...
Как администратор базы данных, я должен сказать ... что любой запрос должен быть чрезвычайно редким, чтобы занимать более 5 секунд. В частности, если этот запрос часто выполняется и используется внешним приложением, то он не должен выполняться в течение 5 секунд. Если у вас действительно есть запрос пользователя, который не может быть выполнен за 5 секунд, это признак того, что дизайн базы данных нуждается в улучшении.
Закон Джонатана В.М. «Отчет о зеленой полосе» Раньше я работал в компании, которая все еще использовала приложение для мэйнфреймов, которое ежедневно выплевывало множество отчетов с точечной матрицей, напечатанных точечной матрицей. Большинство из них были проигнорированы, а из немногих, которые использовались, большинство никогда не читалось за пределами первой страницы. В отчете могут быть отсортированы тысячи строк по убыванию возраста учетной записи ... и все, что нужно пользователю, - это просмотреть 10 самых старших. Мой закон таков: Количество вариантов использования, которые на самом деле требуют просмотра огромного количества строк, бесконечно мало. Подумайте - действительно подумайте - о сценарии использования для вашего запроса, а также о наличии большого или большого количества записей действительно то, что нужно этому пользователю.