|
Почему 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 |
|
Почему DELETE TOP не подразумевает ORDER BY
|
|||
---|---|---|---|
#18+
PizzaPizza, Или потому что его завезли в cte, а два завоза делать было лень. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.05.2020, 23:00 |
|
Почему DELETE TOP не подразумевает ORDER BY
|
|||
---|---|---|---|
#18+
PizzaPizza Или дело в слове заранее ? ... |
|||
:
Нравится:
Не нравится:
|
|||
09.05.2020, 10:21 |
|
Почему DELETE TOP не подразумевает ORDER BY
|
|||
---|---|---|---|
#18+
Появилась еще мысль, что копать надо глубже, к моменту существования вычислительных машин,иначе работающих с памятью. Возможно истоки в аппаратной реализации изменения данных в ячейках памяти старинных мейнфреймов. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.05.2020, 13:09 |
|
Почему DELETE TOP не подразумевает ORDER BY
|
|||
---|---|---|---|
#18+
Владислав Колосов, Ну объясните уже наконец, почему нельзя Код: sql 1.
И можно Код: sql 1.
? ... |
|||
:
Нравится:
Не нравится:
|
|||
12.05.2020, 13:16 |
|
Почему DELETE TOP не подразумевает ORDER BY
|
|||
---|---|---|---|
#18+
invm, Поскольку обновление происходит с отобранным набором ключей, то не имеет значения - в каком порядке они отсортированы при обновлении. У меня есть сомнения, что UPDATE TOP - это не изобретение MS. Если это так, что выводы вполне очевидны: MS просто не пошли дальше в отступлении от канона. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.05.2020, 14:19 |
|
Почему DELETE TOP не подразумевает ORDER BY
|
|||
---|---|---|---|
#18+
Владислав Колосов Поскольку обновление происходит с отобранным набором ключей, то не имеет значения - в каком порядке они отсортированы при обновлении. Вам был задан конретный вопрос - 22131132 Или там что-то непонятное или несравнимое написано? ... |
|||
:
Нравится:
Не нравится:
|
|||
12.05.2020, 14:30 |
|
Почему DELETE TOP не подразумевает ORDER BY
|
|||
---|---|---|---|
#18+
invm Владислав Колосов Поскольку обновление происходит с отобранным набором ключей, то не имеет значения - в каком порядке они отсортированы при обновлении. Вам был задан конретный вопрос - 22131132 Или там что-то непонятное или несравнимое написано? Полагаю, что второй пример - это стандартное обновление одной из связанных таблиц, где в основной таблице выбираются конкретные строки (допустим, строится некий дополнительный "ключ" по которому записи "связываются" с записями из CTE) , при этом CTE уже не рассматривается ядром как представление (представление на основе обновляемой таблицы) а рассматривается как отдельная внешняя таблица,- с наложением соответствующих блокировок и т.п. Таким образом в "движок" вносить ни чего нового не надо было,- просто используется стандартный механизм (пуст и немного"через ж@пу"). А по поводу первого примера, - не сделали просто "потому что" (by design). Точно так же как и не предусмотрено delete top (n) from anyTable; напрямую. Хех, можно, вероятно , задать этот вопрос Дмитрию Пилюгину Кстати, двумя месяцами раньше меня на этом форуме просвещали на эту же тему (про неработающий delete top (n) ) . Т.е. топикстартер форум не читал... ... |
|||
:
Нравится:
Не нравится:
|
|||
13.05.2020, 10:12 |
|
Почему DELETE TOP не подразумевает ORDER BY
|
|||
---|---|---|---|
#18+
SIMPLicity_ олагаю, что второй пример - это стандартное обновление одной из связанных таблиц, где в основной таблице выбираются конкретные строки (допустим, строится некий дополнительный "ключ" по которому записи "связываются" с записями из CTE) , при этом CTE уже не рассматривается ядром как представление (представление на основе обновляемой таблицы) а рассматривается как отдельная внешняя таблица,- с наложением соответствующих блокировок и т.п. Таким образом в "движок" вносить ни чего нового не надо было,- просто используется стандартный механизм (пуст и немного"через ж@пу"). Например, скрипт: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16.
... |
|||
:
Нравится:
Не нравится:
|
|||
13.05.2020, 10:42 |
|
Почему DELETE TOP не подразумевает ORDER BY
|
|||
---|---|---|---|
#18+
alexeyvg, Показательней будет, если сделать ORDER BY ID ... |
|||
:
Нравится:
Не нравится:
|
|||
13.05.2020, 11:25 |
|
Почему DELETE TOP не подразумевает ORDER BY
|
|||
---|---|---|---|
#18+
Владислав Колосов и SIMPLicity , вспоминайте иногда о "бритве Оккама" ... |
|||
:
Нравится:
Не нравится:
|
|||
13.05.2020, 11:27 |
|
Почему DELETE TOP не подразумевает ORDER BY
|
|||
---|---|---|---|
#18+
invm alexeyvg, Показательней будет, если сделать ORDER BY ID А этот привёл, потому что даже при сортировке по имени нет никакого "стандартное обновление одной из связанных таблиц, где в основной таблице выбираются конкретные строки, при этом CTE уже не рассматривается ядром как представление, а рассматривается как отдельная внешняя таблица,- с наложением соответствующих блокировок и т.п." ... |
|||
:
Нравится:
Не нравится:
|
|||
13.05.2020, 11:55 |
|
Почему DELETE TOP не подразумевает ORDER BY
|
|||
---|---|---|---|
#18+
invm, соглашусь, что это "самоделка" от MS, и они могут ответить - почему не реализована сортировка. Стандарт SQL92 ничего такого не предусматривает. 13.9 <update statement: positioned> Function Update a row of a table. Format <update statement: positioned> ::= UPDATE <table name> SET <set clause list> WHERE CURRENT OF <cursor name> <set clause list> ::= <set clause> [ { <comma> <set clause> }... ] <set clause> ::= <object column> <equals operator> <update source> <update source> ::= <value expression> | <null specification> | DEFAULT <object column> ::= <column name> ... |
|||
:
Нравится:
Не нравится:
|
|||
13.05.2020, 12:18 |
|
|
start [/forum/topic.php?all=1&fid=46&tid=1686140]: |
0ms |
get settings: |
10ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
36ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
59ms |
get tp. blocked users: |
1ms |
others: | 270ms |
total: | 413ms |
0 / 0 |