|
Почему DELETE TOP не подразумевает ORDER BY
|
|||
---|---|---|---|
#18+
Пытаюсь понять причину запрета. Вроде бы это просто синтаксис при DELETE TOP(10) FROM foo; это будет один план выполнения при DELETE TOP(10) FROM foo ORDER BY bar DESC; может быть другой план выполнения в чем причина этого ограничения? Какие то синтаксические неоднозначности возможны, поэтому запретили? ... |
|||
:
Нравится:
Не нравится:
|
|||
06.05.2020, 22:01 |
|
Почему DELETE TOP не подразумевает ORDER BY
|
|||
---|---|---|---|
#18+
PizzaPizza, так это не только для delete. не запретили, а просто не сделали видимо, какие-то сложности реализации TOP Limitations and RestrictionsWhen you use TOP with INSERT, UPDATE, MERGE, or DELETE, the referenced rows aren't arranged in any order. And, you can't directly specify the ORDER BY clause in these statements. If you need to use TOP to insert, delete, or modify rows in a meaningful chronological order, use TOP with an ORDER BY clause specified in a subselect statement так что через select ... |
|||
:
Нравится:
Не нравится:
|
|||
06.05.2020, 22:17 |
|
Почему DELETE TOP не подразумевает ORDER BY
|
|||
---|---|---|---|
#18+
Shakill, да вот я и думаю - реализация то от синтаксиса в SQL не очень зависит. Поэтому и предположил, что не сделали, тк. возможно написать неоднозначную конструкцию имея этот top order при удалении. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.05.2020, 22:54 |
|
Почему DELETE TOP не подразумевает ORDER BY
|
|||
---|---|---|---|
#18+
PizzaPizza, Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12.
... |
|||
:
Нравится:
Не нравится:
|
|||
07.05.2020, 08:39 |
|
Почему DELETE TOP не подразумевает ORDER BY
|
|||
---|---|---|---|
#18+
PizzaPizza, DELETE TOP (N) это уже не канон, классически удаление должно выполняться по ключам. Моё видение такое. В процессе удаления может произойти вставка строк в область сортировки и вы получите результат, отличный от предполагаемого. А сервер этого допустить не может. Если вы удаляете любые 10 строк, то достоверность операции не нарушается. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.05.2020, 12:45 |
|
Почему DELETE TOP не подразумевает ORDER BY
|
|||
---|---|---|---|
#18+
Владислав Колосов Моё видение такое. В процессе удаления может произойти вставка строк в область сортировки и вы получите результат, отличный от предполагаемого. А сервер этого допустить не может. 2. Что именно сервер не может допустить? И почему не может при update/delete, но может при select или при такой форме update/delete 22128620 ? ... |
|||
:
Нравится:
Не нравится:
|
|||
07.05.2020, 14:13 |
|
Почему DELETE TOP не подразумевает ORDER BY
|
|||
---|---|---|---|
#18+
invm, SELECT выбирает, DELETE удаляет выбранные, никакого противоречия. А у Вас есть ответ - почему удаление или обновление не допускает сортировку? ... |
|||
:
Нравится:
Не нравится:
|
|||
07.05.2020, 17:44 |
|
Почему DELETE TOP не подразумевает ORDER BY
|
|||
---|---|---|---|
#18+
Владислав Колосов Моё видение такое. В процессе удаления может произойти вставка строк в область сортировки и вы получите результат, отличный от предполагаемого. Пока что звучит довольно логично: если delete эксклюзивно блокирует диапазон строк, а не всю таблицу, то параллельная вставка может изменить этот диапазон. С ключами у нас есть ограничение по ключу, которое не дает вставить пока не удалено. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.05.2020, 20:02 |
|
Почему DELETE TOP не подразумевает ORDER BY
|
|||
---|---|---|---|
#18+
Владислав Колосов SELECT выбирает, DELETE удаляет выбранные, никакого противоречия. Владислав Колосов почему удаление или обновление не допускает сортировку? ... |
|||
:
Нравится:
Не нравится:
|
|||
07.05.2020, 20:31 |
|
Почему DELETE TOP не подразумевает ORDER BY
|
|||
---|---|---|---|
#18+
PizzaPizza Пока что звучит довольно логично: если delete эксклюзивно блокирует диапазон строк, а не всю таблицу, то параллельная вставка может изменить этот диапазон. 1. Если "диапазон строк" заблокирован эксклюзивно, то никакая вставка этот диапазон изменить не может. Иначе это нельзя назвать эксклюзивно. 2. В MSSQL вообще не существует блокировки "диапазона строк" в описанном вами виде. 3. Сервер ничего не "предполагает" относительно "области сортировки". Ибо смысла в этом никакого. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.05.2020, 21:23 |
|
Почему DELETE TOP не подразумевает ORDER BY
|
|||
---|---|---|---|
#18+
invm, Вот механику бы хорошо бы понять. Допустим у нас удаление. Если сервер решил, что он будет блокировать всю таблицу - вопросов нет. Если выбрана блокировка строк, то они выбраны по какому принципу? По принципу строгого совпадения с where clause у delete? Тогда при параллельной вставке строки, которая подходит под эти критерии, будет ли она удалена или нет? Логика подсказывает, что это будет исполнено в порядке выполнения транзакций (/инструкций в транзакции) с соответствующим результатом - если вставка произошла раньше удаления, то не будет вставленной строки, если после - то будет. Если так рассуждать, то непонятно зачем это ограничение на order by в delete. сорри за много текста - пытаюсь для себя разжевать ... |
|||
:
Нравится:
Не нравится:
|
|||
07.05.2020, 22:46 |
|
Почему DELETE TOP не подразумевает ORDER BY
|
|||
---|---|---|---|
#18+
PizzaPizza, дело в том, что при фильтре WHERE мы точно задаем условие удаления и если что-то удаляется, то только то, что мы явно выразили. А здесь нет условий. Идеология такой формы запроса лежит в трудах отцов-основателей SQL, как я думаю. Надо копать первоисточники. Насколько я понимаю концепцию SQL, то все операции изменения данных должны выполняться с явно выбранными ключами. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.05.2020, 11:44 |
|
Почему DELETE TOP не подразумевает ORDER BY
|
|||
---|---|---|---|
#18+
PizzaPizza Если выбрана блокировка строк, то они выбраны по какому принципу? По принципу строгого совпадения с where clause у delete? Тогда при параллельной вставке строки, которая подходит под эти критерии, будет ли она удалена или нет? Удаление происходит построчно. Сколько будет удалено строк заранее не известно. Итератор delete плана выполнения получает строки для удаления от нижележащих итераторов согласно критериям фильтрации (where, top и т.п.), либо может сам их фильтровать. Будет ли удалена строка, добавленная в параллельном процессе после старта удаления и подходящая по критериям, зависит от ее физической достижимости для процесса удаления. Например, если удаление сканирует кучу и добавленная строка попала на страницу, которая уже была просканирована, то она не будет удалена. И наоборот. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.05.2020, 12:47 |
|
Почему DELETE TOP не подразумевает ORDER BY
|
|||
---|---|---|---|
#18+
В оригинале TOP без сортировки не используется. Однако, он не является критерием отбора ключей, т.к. при каждом запросе могут быть получены разные наборы. Поэтому я и писал, что сервер не должен допускать неоднозначности, чтобы их исключить выражение ORDER BY запрещено для операции удаления или изменения. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.05.2020, 13:33 |
|
Почему DELETE TOP не подразумевает ORDER BY
|
|||
---|---|---|---|
#18+
Владислав Колосов Поэтому я и писал, что сервер не должен допускать неоднозначности, чтобы их исключить выражение ORDER BY запрещено для операции удаления или изменения. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.05.2020, 13:51 |
|
Почему DELETE TOP не подразумевает ORDER BY
|
|||
---|---|---|---|
#18+
invm, Запускаем первый раз - удаляем 1,2,3. Запускаем тот же запрос второй раз - удаляем 3,4,5. Правильно это или нет? Видимо, отцы-основатели посчитали это неправильным. Или ожидали удалить 1,3,5 , а удалили 1,2,3. В SQL принято много мер, чтобы поддержать достоверность и целостность. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.05.2020, 14:03 |
|
Почему DELETE TOP не подразумевает ORDER BY
|
|||
---|---|---|---|
#18+
Владислав Колосов Запускаем первый раз - удаляем 1,2,3. Запускаем тот же запрос второй раз - удаляем 3,4,5. Правильно это или нет? Владислав Колосов Или ожидали удалить 1,3,5 , а удалили 1,2,3. В момент удаления, top и order by выбрали записи 1,2,3 для удаления, именно их мы и ожидали удалить, значит, всё правильно. Это, в общем, такой же вопрос, как конструкция select top ... order by Тоже можно придумать, что такая конструкция недопустима, ведь "ожидали получить 1,3,5 , а получили 1,2,3" Для select это "ожидали" так же непонятно, как и для delete. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.05.2020, 14:44 |
|
Почему DELETE TOP не подразумевает ORDER BY
|
|||
---|---|---|---|
#18+
Владислав Колосов ри каждом запросе могут быть получены разные наборы. Поэтому я и писал, что сервер не должен допускать неоднозначности, чтобы их исключить выражение ORDER BY запрещено для операции удаления или изменения. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.05.2020, 14:45 |
|
Почему DELETE TOP не подразумевает ORDER BY
|
|||
---|---|---|---|
#18+
alexeyvg, могу сказать, что при запросе нет ожидания того, что мы получим в результате. Я же говорю, надо соображения классиков читать. TOP без ORDER - изобретение MS. Собственно, я пока не увидел в переписке других вариантов - почему ORDER BY не используется при изменении данных. "Так захотелось" или "прошляпили" сомнительный ответ. Здесь была какая-то идеология. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.05.2020, 16:40 |
|
Почему DELETE TOP не подразумевает ORDER BY
|
|||
---|---|---|---|
#18+
Владислав Колосов могу сказать, что при запросе нет ожидания того, что мы получим в результате. Ожидаемый результат - сугубо субъективная вещь. Соответственно, сервер про него ничего не знает и нигде не учитывает. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.05.2020, 17:11 |
|
Почему DELETE TOP не подразумевает ORDER BY
|
|||
---|---|---|---|
#18+
Владислав Колосов могу сказать, что при запросе нет ожидания того, что мы получим в результате. Я же говорю, надо соображения классиков читать. TOP без ORDER - изобретение MS. Владислав Колосов Собственно, я пока не увидел в переписке других вариантов - почему ORDER BY не используется при изменении данных. "Так захотелось" или "прошляпили" сомнительный ответ. Здесь была какая-то идеология. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.05.2020, 18:12 |
|
Почему DELETE TOP не подразумевает ORDER BY
|
|||
---|---|---|---|
#18+
invm Никак они не выбраны. И строки заранее не блокируются. Например, если удаление сканирует кучу и добавленная строка попала на страницу, которая уже была просканирована, то она не будет удалена. И наоборот. Ну то есть исполняется в принципе логично, в порядке исполнения инструкций, а там как сложится. Про не блокирование строк я не очень понял, честно говоря: авторWhen rows are deleted from a heap the Database Engine may use row or page locking for the operation. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.05.2020, 20:27 |
|
Почему DELETE TOP не подразумевает ORDER BY
|
|||
---|---|---|---|
#18+
PizzaPizza Про не блокирование строк я не очень понял, честно говоря ... |
|||
:
Нравится:
Не нравится:
|
|||
08.05.2020, 21:05 |
|
Почему DELETE TOP не подразумевает ORDER BY
|
|||
---|---|---|---|
#18+
invm, Судя по документации, удаление может блокировать, как таблицу, так страницы так и записи. вы пишете invmИ строки заранее не блокируются. что и смутило. Или дело в слове заранее ? ... |
|||
:
Нравится:
Не нравится:
|
|||
08.05.2020, 22:29 |
|
Почему DELETE TOP не подразумевает ORDER BY
|
|||
---|---|---|---|
#18+
ну и резюмируя: синтаксического сахара типа DELETE TOP ORDER BY не завезли не потому, что этой конструкцией можно написать, что то противоречащее логикe, механике сервера или acid. А просто так. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.05.2020, 22:34 |
|
|
start [/forum/topic.php?fid=46&msg=39954877&tid=1686140]: |
0ms |
get settings: |
11ms |
get forum list: |
15ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
30ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
61ms |
get tp. blocked users: |
1ms |
others: | 18ms |
total: | 159ms |
0 / 0 |