SQL: Прерывание запроса

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

  • SQL-запросы могут быть прерваны?

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

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

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

7
задан Konerak 12 July 2010 в 13:59
поделиться

2 ответа

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

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

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

.
6
ответ дан 6 December 2019 в 23:02
поделиться

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

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

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

5
ответ дан 6 December 2019 в 23:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: