SQL: прерывание запроса
Я работал над проектом, используя проприетарную БД не SQL, где запросы могли быть прерваны, и в кодовой базе было довольно много мест, где эта функциональность использовалась и имела смысл (например, чтобы остановить длительный запрос, который отменяется пользователем, или когда происходит более поздний запрос и делает предыдущий запрос устаревшим и т. д.) и я понял, что никогда раньше не видел таких "прерванных запросов" и думал, что это может сделать хороший вопрос SO (несколько вопросов, но все они связаны с одним и тем же):
можно ли прервать SQL-запросы?
является ли это частью стандарта SQL?
Если это не часть стандарта SQL, какие SQL DBs позволяют прерывать запросы (любой пример наиболее приветствуется)?
часто ли прерывать запрос БД (SQL или нет), который, как вы знаете, больше не будет заботиться о результате? (в кодовая база, над которой я работал, конечно, помогает облегчить нагрузку на сервер)
2 ответов
имхо "прервано" должно быть заменено на "убито" или "прекращено". Концепция прерывания может быть запутанной, поскольку можно предположить, что она позволит возобновить запрос позже.
стандарт SQL не предоставляет способ прерывания или завершения запущенного запроса, но каждая СУБД, которую я знаю, реализует команду KILL или аналогичную. Например, в MySQL пользователь может использовать Show [FULL] PROCESSLIST для просмотра всех запущенных запросов (и их состояний, идентификаторов запросов и т. д.). Пользователям Затем Kill privilege может завершить запрос.
большинство убийств происходит потому, что запрос рискует работать слишком долго или блокирует другие запросы, например. в таблице отсутствует индекс или диск заполнен. Если вы не заботитесь о результате (например. пользователь отменил навигацию по сайту), часто сам веб-сервер прерывает процесс и, следовательно, запрос сам по себе (нет необходимости в ручном или программном взаимодействии)
все уровни доступа к СУБД, с которыми я когда-либо работал, предоставляют метод отмены для асинхронной отмены запущенных запросов. Проверьте документацию для любого используемого стека технологий доступа к данным. .NET / ADO / JDBC предоставляют метод "отмена". ODBC-SQLCancel. Очевидно, что базовый драйвер доступа к данным поставщиков СУБД также должен реализовать этот метод.
с точки зрения полезности отмены я склонен критиковать любую схему, которая регулярно ее использует. На мой взгляд более эффективная координация и / или разработка будут способствовать смягчению административных потребностей.
существует значительная зависимость от внутренних элементов СУБД, характера транзакции и схемы изоляции. Если СУБД использует оптимистическую модель параллелизма (т. е. фиксация по существу бесплатна), отмена выполняемого запроса может включать потенциально дорогостоящую операцию отката. В худшем случае запрос, выполняемый в течение часа до момента отмены, может занять еще час, чтобы отмена.