SQL: прерывание запроса - PullRequest
7 голосов
/ 03 мая 2010

Я работал над проектом, использующим проприетарную базу данных, отличную от SQL, где запросы могли прерываться, и в кодовой базе было довольно много мест, где эта функциональность использовалась и имела смысл (например, чтобы остановить длительный запрос, пользователь отменяет его, или когда происходит более поздний запрос, который делает предыдущий запрос устаревшим и т. д.), и я понял, что никогда раньше не видел такого рода «прерванные запросы», и подумал, что это может сделать хороший вопрос SO вопросы, но все они относятся к одному и тому же):

  • можно ли прерывать запросы SQL?

  • это часть стандарта SQL?

  • если это не является частью стандарта SQL, какие базы данных SQL позволяют прерывать запросы (любой пример наиболее приветствуется)?

  • Обычно ли прерывать запрос к БД (SQL или нет), который, как вы знаете, вас больше не волнует? (в кодовой базе, над которой я работал, это, безусловно, помогает снизить нагрузку на сервер)

Ответы [ 2 ]

6 голосов
/ 03 мая 2010

Imho «прервано» должно быть заменено на «убито» или «прервано». Концепция прерывания может сбивать с толку, так как можно предположить, что это позволит возобновить запрос позже.

Стандарт SQL не предоставляет способа прерывать или завершать текущий запрос, но каждая СУБД, которую я знаю, реализует команду KILL или аналогичную. Например, в MySQL пользователь может использовать SHOW [FULL] PROCESSLIST для просмотра всех запущенных запросов (и их состояний, идентификаторов запросов и т. Д.). Пользователи с привилегией KILL могут затем завершить запрос.

Большинство KILL'ов происходят из-за риска того, что запрос выполняется слишком долго или блокирует другие запросы, например. в таблице отсутствует индекс или диск заполнен. Когда вас не волнует результат (например, пользователь отменил навигацию по сайту), часто сам веб-сервер прерывает процесс и, следовательно, сам запрос (никакого ручного или программистского взаимодействия не требуется)

5 голосов
/ 03 мая 2010

Все слои доступа к СУБД, с которыми я когда-либо работал, предоставляют метод отмены для асинхронной отмены запущенных запросов. Проверьте документацию для любого стека технологии доступа к данным, который вы используете. .NET / ADO / JDBC предоставляют метод отмены. ODBC - SQLCancel. Очевидно, что основной драйвер доступа к данным СУБД должен также реализовывать метод.

С точки зрения полезности отмены, я бы склонялся к критике любой схемы, которая регулярно его использовала. По моему мнению, лучшая координация и / или дизайн будут иметь тенденцию смягчать неадминистративные потребности.

Существует значительная зависимость от внутренних компонентов СУБД, характера транзакции и схемы изоляции. Если СУБД использует оптимистическую модель параллелизма (т. Е. Фиксация по существу бесплатна), отмена выполняющегося запроса может потребовать потенциально дорогой операции отката. В худшем случае запрос, выполняемый в течение часа до момента отмены, вполне может занять еще один час для отката.

...