powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Почему DELETE TOP не подразумевает ORDER BY
25 сообщений из 37, страница 1 из 2
Почему DELETE TOP не подразумевает ORDER BY
    #39954830
PizzaPizza
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пытаюсь понять причину запрета. Вроде бы это просто синтаксис

при DELETE TOP(10) FROM foo; это будет один план выполнения
при DELETE TOP(10) FROM foo ORDER BY bar DESC; может быть другой план выполнения

в чем причина этого ограничения?
Какие то синтаксические неоднозначности возможны, поэтому запретили?
...
Рейтинг: 0 / 0
Почему DELETE TOP не подразумевает ORDER BY
    #39954832
Фотография Shakill
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
...
Рейтинг: 0 / 0
Почему DELETE TOP не подразумевает ORDER BY
    #39954836
PizzaPizza
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shakill,

да вот я и думаю - реализация то от синтаксиса в SQL не очень зависит. Поэтому и предположил, что не сделали, тк. возможно написать неоднозначную конструкцию имея этот top order при удалении.
...
Рейтинг: 0 / 0
Почему DELETE TOP не подразумевает ORDER BY
    #39954877
Фотография a_voronin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PizzaPizza,

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
IF OBJECT_ID('tempdb..#T') IS NOT NULL 
DROP TABLE #T 

CREATE TABLE #T(ID INT NOT NULL IDENTITY(1,1) PRIMARY KEY CLUSTERED )
GO
INSERT INTO #T DEFAULT VALUES; 
GO 10

DELETE FROM T
FROM (SELECT TOP (5) * FROM #T ORDER BY ID) T

SELECT * FROM #T ORDER BY ID
...
Рейтинг: 0 / 0
Почему DELETE TOP не подразумевает ORDER BY
    #39954952
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PizzaPizza,

DELETE TOP (N) это уже не канон, классически удаление должно выполняться по ключам.

Моё видение такое. В процессе удаления может произойти вставка строк в область сортировки и вы получите результат, отличный от предполагаемого. А сервер этого допустить не может.

Если вы удаляете любые 10 строк, то достоверность операции не нарушается.
...
Рейтинг: 0 / 0
Почему DELETE TOP не подразумевает ORDER BY
    #39954979
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владислав Колосов
Моё видение такое. В процессе удаления может произойти вставка строк в область сортировки и вы получите результат, отличный от предполагаемого. А сервер этого допустить не может.
1. Сортировки как таковой может и не быть.
2. Что именно сервер не может допустить? И почему не может при update/delete, но может при select или при такой форме update/delete 22128620 ?
...
Рейтинг: 0 / 0
Почему DELETE TOP не подразумевает ORDER BY
    #39955037
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
invm,

SELECT выбирает, DELETE удаляет выбранные, никакого противоречия. А у Вас есть ответ - почему удаление или обновление не допускает сортировку?
...
Рейтинг: 0 / 0
Почему DELETE TOP не подразумевает ORDER BY
    #39955083
PizzaPizza
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владислав Колосов

Моё видение такое. В процессе удаления может произойти вставка строк в область сортировки и вы получите результат, отличный от предполагаемого.


Пока что звучит довольно логично: если delete эксклюзивно блокирует диапазон строк, а не всю таблицу, то параллельная вставка может изменить этот диапазон.
С ключами у нас есть ограничение по ключу, которое не дает вставить пока не удалено.
...
Рейтинг: 0 / 0
Почему DELETE TOP не подразумевает ORDER BY
    #39955091
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владислав Колосов
SELECT выбирает, DELETE удаляет выбранные, никакого противоречия.
А в чем разница между выбираемым и удаляемым в контексте "предполагаемости" результата? Тем более, что удалять/изменять в определенном порядке таки можно?
Владислав Колосов
почему удаление или обновление не допускает сортировку?
Как по мне, то это из той же серии, что и невозможность при вызове процедуры использовать выражения в качестве параметров. Т.е., как принято говорить, "by design".
...
Рейтинг: 0 / 0
Почему DELETE TOP не подразумевает ORDER BY
    #39955107
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PizzaPizza
Пока что звучит довольно логично: если delete эксклюзивно блокирует диапазон строк, а не всю таблицу, то параллельная вставка может изменить этот диапазон.

1. Если "диапазон строк" заблокирован эксклюзивно, то никакая вставка этот диапазон изменить не может. Иначе это нельзя назвать эксклюзивно.
2. В MSSQL вообще не существует блокировки "диапазона строк" в описанном вами виде.
3. Сервер ничего не "предполагает" относительно "области сортировки". Ибо смысла в этом никакого.
...
Рейтинг: 0 / 0
Почему DELETE TOP не подразумевает ORDER BY
    #39955132
PizzaPizza
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
invm,

Вот механику бы хорошо бы понять.
Допустим у нас удаление.
Если сервер решил, что он будет блокировать всю таблицу - вопросов нет.
Если выбрана блокировка строк, то они выбраны по какому принципу? По принципу строгого совпадения с where clause у delete? Тогда при параллельной вставке строки, которая подходит под эти критерии, будет ли она удалена или нет? Логика подсказывает, что это будет исполнено в порядке выполнения транзакций (/инструкций в транзакции) с соответствующим результатом - если вставка произошла раньше удаления, то не будет вставленной строки, если после - то будет.

Если так рассуждать, то непонятно зачем это ограничение на order by в delete.

сорри за много текста - пытаюсь для себя разжевать
...
Рейтинг: 0 / 0
Почему DELETE TOP не подразумевает ORDER BY
    #39955217
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PizzaPizza,

дело в том, что при фильтре WHERE мы точно задаем условие удаления и если что-то удаляется, то только то, что мы явно выразили. А здесь нет условий. Идеология такой формы запроса лежит в трудах отцов-основателей SQL, как я думаю. Надо копать первоисточники. Насколько я понимаю концепцию SQL, то все операции изменения данных должны выполняться с явно выбранными ключами.
...
Рейтинг: 0 / 0
Почему DELETE TOP не подразумевает ORDER BY
    #39955246
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PizzaPizza
Если выбрана блокировка строк, то они выбраны по какому принципу? По принципу строгого совпадения с where clause у delete? Тогда при параллельной вставке строки, которая подходит под эти критерии, будет ли она удалена или нет?
Никак они не выбраны. И строки заранее не блокируются.

Удаление происходит построчно. Сколько будет удалено строк заранее не известно.
Итератор delete плана выполнения получает строки для удаления от нижележащих итераторов согласно критериям фильтрации (where, top и т.п.), либо может сам их фильтровать.

Будет ли удалена строка, добавленная в параллельном процессе после старта удаления и подходящая по критериям, зависит от ее физической достижимости для процесса удаления.
Например, если удаление сканирует кучу и добавленная строка попала на страницу, которая уже была просканирована, то она не будет удалена. И наоборот.
...
Рейтинг: 0 / 0
Почему DELETE TOP не подразумевает ORDER BY
    #39955282
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В оригинале TOP без сортировки не используется. Однако, он не является критерием отбора ключей, т.к. при каждом запросе могут быть получены разные наборы. Поэтому я и писал, что сервер не должен допускать неоднозначности, чтобы их исключить выражение ORDER BY запрещено для операции удаления или изменения.
...
Рейтинг: 0 / 0
Почему DELETE TOP не подразумевает ORDER BY
    #39955289
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владислав Колосов
Поэтому я и писал, что сервер не должен допускать неоднозначности, чтобы их исключить выражение ORDER BY запрещено для операции удаления или изменения.
Какие неоднозначности могут быть с ORDER BY?
...
Рейтинг: 0 / 0
Почему DELETE TOP не подразумевает ORDER BY
    #39955298
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
invm,

Запускаем первый раз - удаляем 1,2,3. Запускаем тот же запрос второй раз - удаляем 3,4,5. Правильно это или нет? Видимо, отцы-основатели посчитали это неправильным. Или ожидали удалить 1,3,5 , а удалили 1,2,3. В SQL принято много мер, чтобы поддержать достоверность и целостность.
...
Рейтинг: 0 / 0
Почему DELETE TOP не подразумевает ORDER BY
    #39955322
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владислав Колосов
Запускаем первый раз - удаляем 1,2,3. Запускаем тот же запрос второй раз - удаляем 3,4,5. Правильно это или нет?
А что в таком описании неправильного? Удаляем записи в соответствии с указанием top и order by. Да, это правильно.

Владислав Колосов
Или ожидали удалить 1,3,5 , а удалили 1,2,3.
Вот это ожидание откуда? Где зафиксированы эти 1,3,5, которые мы "ожидали" удалить?
В момент удаления, top и order by выбрали записи 1,2,3 для удаления, именно их мы и ожидали удалить, значит, всё правильно.

Это, в общем, такой же вопрос, как конструкция select top ... order by
Тоже можно придумать, что такая конструкция недопустима, ведь "ожидали получить 1,3,5 , а получили 1,2,3"
Для select это "ожидали" так же непонятно, как и для delete.
...
Рейтинг: 0 / 0
Почему DELETE TOP не подразумевает ORDER BY
    #39955324
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владислав Колосов
ри каждом запросе могут быть получены разные наборы. Поэтому я и писал, что сервер не должен допускать неоднозначности, чтобы их исключить выражение ORDER BY запрещено для операции удаления или изменения.
Для SELECT то же самое, почему же для него не запрещено?
...
Рейтинг: 0 / 0
Почему DELETE TOP не подразумевает ORDER BY
    #39955388
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexeyvg,

могу сказать, что при запросе нет ожидания того, что мы получим в результате. Я же говорю, надо соображения классиков читать. TOP без ORDER - изобретение MS.

Собственно, я пока не увидел в переписке других вариантов - почему ORDER BY не используется при изменении данных. "Так захотелось" или "прошляпили" сомнительный ответ. Здесь была какая-то идеология.
...
Рейтинг: 0 / 0
Почему DELETE TOP не подразумевает ORDER BY
    #39955409
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владислав Колосов
могу сказать, что при запросе нет ожидания того, что мы получим в результате.
Да? А когда результат запроса потом используется для тогоже update/delete?
Ожидаемый результат - сугубо субъективная вещь. Соответственно, сервер про него ничего не знает и нигде не учитывает.
...
Рейтинг: 0 / 0
Почему DELETE TOP не подразумевает ORDER BY
    #39955421
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владислав Колосов
могу сказать, что при запросе нет ожидания того, что мы получим в результате. Я же говорю, надо соображения классиков читать. TOP без ORDER - изобретение MS.
Так для SELECT тоже нет ожидания того, что мы получим в результате.
Владислав Колосов
Собственно, я пока не увидел в переписке других вариантов - почему ORDER BY не используется при изменении данных. "Так захотелось" или "прошляпили" сомнительный ответ. Здесь была какая-то идеология.
Трудно сказать, но не всегда решения основаны на некой стратегии, идее.
...
Рейтинг: 0 / 0
Почему DELETE TOP не подразумевает ORDER BY
    #39955469
PizzaPizza
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
invm
Никак они не выбраны. И строки заранее не блокируются.

Например, если удаление сканирует кучу и добавленная строка попала на страницу, которая уже была просканирована, то она не будет удалена. И наоборот.


Ну то есть исполняется в принципе логично, в порядке исполнения инструкций, а там как сложится.

Про не блокирование строк я не очень понял, честно говоря:
авторWhen rows are deleted from a heap the Database Engine may use row or page locking for the operation.
...
Рейтинг: 0 / 0
Почему DELETE TOP не подразумевает ORDER BY
    #39955474
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PizzaPizza
Про не блокирование строк я не очень понял, честно говоря
Что именно?
...
Рейтинг: 0 / 0
Почему DELETE TOP не подразумевает ORDER BY
    #39955484
PizzaPizza
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
invm,

Судя по документации, удаление может блокировать, как таблицу, так страницы так и записи.

вы пишете
invmИ строки заранее не блокируются.
что и смутило. Или дело в слове заранее ?
...
Рейтинг: 0 / 0
Почему DELETE TOP не подразумевает ORDER BY
    #39955485
PizzaPizza
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну и резюмируя:

синтаксического сахара типа DELETE TOP ORDER BY не завезли не потому, что этой конструкцией можно написать, что то противоречащее логикe, механике сервера или acid. А просто так.
...
Рейтинг: 0 / 0
25 сообщений из 37, страница 1 из 2
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Почему DELETE TOP не подразумевает ORDER BY
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]