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

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

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

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

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

сервер читает страницы так, как ему удобно.
...
Рейтинг: 0 / 0
14.08.2019, 15:51
    #39849317
invm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
update и order by
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
14.08.2019, 15:53
    #39849320
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
update и order by
saleyпочему тогда на одном сервере работает, а на другом не хочет?Хы... между прочим, в любой момент на первом может и перестать работать... как, впрочем, и на втором - начать работать как тебе хочется.

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

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

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


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

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

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

Ждем вас с нетерпением снова, когда у вас случится неупорядоченный скан кластерного индекса.
...
Рейтинг: 0 / 0
14.08.2019, 18:16
    #39849419
invm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
update и order by
Гавриленко Сергей АлексеевичЖдем вас с нетерпением снова, когда у вас случится неупорядоченный скан кластерного индекса.При update такого не случится. По крайней мере, на текущий момент.
...
Рейтинг: 0 / 0
14.08.2019, 20:35
    #39849477
uaggster
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
update и order by
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
14.08.2019, 20:59
    #39849493
invm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
update и order by
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
14.08.2019, 21:35
    #39849500
uaggster
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
update и order by
(продолжаю упорствовать)
На первый взгляд - планы кажутся одинаковыми. Ну, добавилось одно вычисление скаляра.
На сколько нибудь больших выборках - разница будет ничтожной.
Разве не так?
...
Рейтинг: 0 / 0
14.08.2019, 23:10
    #39849535
invm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
update и order by
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
15.08.2019, 11:19
    #39849650
Владислав Колосов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
update и order by
Гарантировать порядок обновления записей можно только итератором, например, курсором. В любом случае быстрых гарантированных способов нет. Надо подумать все же о соответствии своих решений реляционной механике. Изучать базовые принципы обработки данных.
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / update и order by / 19 сообщений из 19, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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