powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / update и order by
19 сообщений из 19, страница 1 из 1
update и order by
    #39849294
saley
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Доброго всем дня,

Проблема:
работающую БД с mssql 2017 RUS перенёс на mssql 2017 ENG

у меня проблема возникла с работой сервера, а именно

С помощью select создаю временную таблицу где есть столбец Idenity, в которой перед вставкой сортирую в нужном мне порядке.
Далее с помощью Update нужно обновлять строки именно в том порядке в котором я её создал, на прежнем сервере работает нормально, на новом перемешивает, всего строк в таблице 488, сначала выбирает строки с id_ 313-416 потом 1 - 104, всё остальное.
Может настройки есть какие-то?
...
Рейтинг: 0 / 0
update и order by
    #39849298
Гавриленко Сергей Алексеевич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Настройка "сделать из неправильного запроса правильный"? Нет, тут программист нужен.
...
Рейтинг: 0 / 0
update и order by
    #39849311
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
saley,

настройка в голове нужна. Начните с базиса, курите определение реляционного отношения до полного понимания того, что так, как Вы хотите, не должно работать.
...
Рейтинг: 0 / 0
update и order by
    #39849313
saley
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Господа я понимаю что вы все умные,
объясните почему тогда на одном сервере работает, а на другом не хочет?
...
Рейтинг: 0 / 0
update и order by
    #39849314
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
saley,

сервер читает страницы так, как ему удобно.
...
Рейтинг: 0 / 0
update и order by
    #39849317
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
saleyМожет настройки есть какие-то?Настроек нет. Есть костыли.

1. Сделать по "столбец Idenity" кластерный индекс.
2.
Код: sql
1.
2.
3.
4.
5.
update t
 set
  ...
from
 (select top (cast(0x7fffffffffffffff as bigint)) ... from [временная таблица] order by [столбец Idenity]) t



И нет гарантий, что данные костыли будут всегда работать корректно.
...
Рейтинг: 0 / 0
update и order by
    #39849320
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
saleyпочему тогда на одном сервере работает, а на другом не хочет?Хы... между прочим, в любой момент на первом может и перестать работать... как, впрочем, и на втором - начать работать как тебе хочется.

А вообще если бы кто-то показал структуру таблиц, тестовое наполнение и желаемый результат - давно бы проблема решилась, наверное.
...
Рейтинг: 0 / 0
update и order by
    #39849321
Minamoto
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
saleyГоспода я понимаю что вы все умные,
объясните почему тогда на одном сервере работает, а на другом не хочет?
Изучайте, что такое параметры сортировки (collation), как они работают и применяются.
На разных серверах у вас наверняка используются разные collation.

https://docs.microsoft.com/ru-ru/sql/t-sql/statements/collations?view=sql-server-2017
...
Рейтинг: 0 / 0
update и order by
    #39849322
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Minamoto , у него ж вроде как порядок задаёт "столбец Identity", число то бишь, к которому collation вообще никаким боком.
...
Рейтинг: 0 / 0
update и order by
    #39849324
msLex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
saleyГоспода я понимаю что вы все умные,
объясните почему тогда на одном сервере работает, а на другом не хочет?
Потому что вы заложились на недетерминированное поведение, и то, что при определенных условиях, сервер выбирает удовлетворяющий вас порядок обработки данных, не более чем счастливое стечение обстоятельств.

Если вы опишите, что же за "упорядоченные апдейты" вы делаете, вам, скорее всего, подскажут как сделать поведение детерминированным.


ЗЫ
Высока вероятность, что у вас задача "нарастающий итог". В SQL 2017 (да и раньше) это делается через sum() over(order by)
...
Рейтинг: 0 / 0
update и order by
    #39849336
Minamoto
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Akina, вроде у него каша в голове и неспособность сформулировать вопрос.

saleyС помощью select создаю временную таблицу где есть столбец Idenity, в которой перед вставкой сортирую в нужном мне порядке.
Вот как это понять?
И что такое ниже?
saleyс помощью Update нужно обновлять строки именно в том порядке в котором я её создал

Поэтому первое предположение - для уровня базового непонимания просходящего - про collation.
Может я и ошибаюсь, и в вопросе есть какой то скрытый смысл, тогда мой ответ, конечно, не к месту.
...
Рейтинг: 0 / 0
update и order by
    #39849366
saley
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
как решение, это создание кластерного индекса. Вроде помогло. Но а с Collate надо поразбираться, наверняка здесь засада. Хотя проверял настройки на двух серверах, вроде одинаковые.
Всем спасибо за помощь.
...
Рейтинг: 0 / 0
update и order by
    #39849371
Гавриленко Сергей Алексеевич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
saley,

Ждем вас с нетерпением снова, когда у вас случится неупорядоченный скан кластерного индекса.
...
Рейтинг: 0 / 0
update и order by
    #39849419
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гавриленко Сергей АлексеевичЖдем вас с нетерпением снова, когда у вас случится неупорядоченный скан кластерного индекса.При update такого не случится. По крайней мере, на текущий момент.
...
Рейтинг: 0 / 0
update и order by
    #39849477
uaggster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
invm
Код: sql
1.
(select top (cast(0x7fffffffffffffff as bigint)) ... from [временная таблица] order by [столбец Idenity]) t



И нет гарантий, что данные костыли будут всегда работать корректно.
invm , а почему так?
А не
Код: sql
1.
Select top (select 100) percent * from ...


?
...
Рейтинг: 0 / 0
update и order by
    #39849493
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
uaggster invm , а почему так?
А не
Код: sql
1.
Select top (select 100) percent * from ...

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
drop table if exists #t;
go

create table #t (id int identity, s varchar(8000));
insert into #t
values ('a'), ('b'), ('c');

set statistics profile on;

select top (cast(0x7fffffffffffffff as bigint)) * from #t order by id;
select top ((select 100)) percent * from #t order by id;

set statistics profile off;
go


Код: plaintext
1.
2.
select top (cast(0x7fffffffffffffff as bigint)) * from #t order by id
  |--Sort(TOP -1, ORDER BY:([tempdb].[dbo].[#t].[id] ASC))
       |--Table Scan(OBJECT:([tempdb].[dbo].[#t]))

Код: plaintext
1.
2.
3.
4.
5.
6.
select top ((select 100)) percent * from #t order by id
  |--Nested Loops(Inner Join, OUTER REFERENCES:([Expr1004]))
       |--Compute Scalar(DEFINE:([Expr1004]=CONVERT_IMPLICIT(float(53),[Expr1003],0)))
       |    |--Constant Scan(VALUES: (((100))))
       |--Top(TOP EXPRESSION:([Expr1004]) PERCENT)
            |--Sort(ORDER BY:([tempdb].[dbo].[#t].[id] ASC))
                 |--Table Scan(OBJECT:([tempdb].[dbo].[#t]))
...
Рейтинг: 0 / 0
update и order by
    #39849500
uaggster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
(продолжаю упорствовать)
На первый взгляд - планы кажутся одинаковыми. Ну, добавилось одно вычисление скаляра.
На сколько нибудь больших выборках - разница будет ничтожной.
Разве не так?
...
Рейтинг: 0 / 0
update и order by
    #39849535
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
uaggster(продолжаю упорствовать)Да пожалуйста. Кто ж вам запретит? :)
uaggsterНу, добавилось одно вычисление скаляра.А Nested Loops и Constant Scan?
uaggsterНа сколько нибудь больших выборках - разница будет ничтожной.
Разве не так?Размер "ничтожности" может зависеть от разных факторов.
Определяем цену Nested Loops + Constant Scan
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
use tempdb;
go

drop table if exists dbo.t;
go

create table dbo.t (id int identity, s varchar(8000));
insert into dbo.t
select top (5000000)
 'a'
from
 master.dbo.spt_values a cross join
 master.dbo.spt_values b;
go

declare
 @q1 nvarchar(max) = N'update t set s = ''aaa'' from (select top (cast(0x7fffffffffffffff as bigint)) * from dbo.t order by id) t where s > ''z'' option (maxdop 1);',
 @q2 nvarchar(max) = N'update t set s = ''aaa'' from (select top ((select 100)) percent * from dbo.t order by id) t where s > ''z'' option (maxdop 1);'

declare @c int = 10;

while @c > 0
 begin
  exec sys.sp_executesql @q1;
  exec sys.sp_executesql @q2;

  set @c -= 1;
 end;
go

select
 st.text, qp.query_plan, (qs.total_worker_time * 1.) / qs.execution_count / 1000 as avg_worker_time_ms
from
 sys.dm_exec_query_stats qs cross apply
 sys.dm_exec_query_plan(qs.plan_handle) qp cross apply
 sys.dm_exec_sql_text(qs.sql_handle) st
where
 st.text like N'%update t set s = ''aaa''%'
option
 (recompile);
go

drop table dbo.t;
go

...
Рейтинг: 0 / 0
update и order by
    #39849650
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гарантировать порядок обновления записей можно только итератором, например, курсором. В любом случае быстрых гарантированных способов нет. Надо подумать все же о соответствии своих решений реляционной механике. Изучать базовые принципы обработки данных.
...
Рейтинг: 0 / 0
19 сообщений из 19, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / update и order by
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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