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

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

  • могут ли SQL-запросы прерываться?

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

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

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

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

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

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

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

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

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