powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Вопрос по синтаксису Update
112 сообщений из 112, показаны все 5 страниц
Вопрос по синтаксису Update
    #39909728
Zulus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Доброе утро, коллеги!
Помогите пожалуйста развеять сомнения.

Есть такой прекрасный код

Код: 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.
use tempdb
go

if object_id('Repayments', 'U') is not null
 drop table Repayments;

create table dbo.Repayments
(
  AppCode       nvarchar(60) not null
, RepaymentDate	smalldatetime not null
, DocNumber     int not null
)
create clustered index cx_Repayments on dbo.Repayments(AppCode, RepaymentDate)
go

declare
  @Part		varchar(120)
, @DocNumber	int
	
set @Part = ''
set @DocNumber = 1

update t set
  @DocNumber = DocNumber = 
	case 
		when @Part <> AppCode then 1
		else @DocNumber + 1
	end
, @Part = AppCode
from dbo.Repayments t



1. Правильно ли я понимаю, что товарищ хочет получить последовательную нумерацию DocNum в пределах AppCode? Может ещё что-то?
2. Можно ли такую конструкцию считать безопасной для условий
- update без where
- один единственный кластерный индекс как указано в схеме
Или есть у такого синтаксиса "подводные камни"?

Код не мой, думаю "бодаться" с партнёрами из-за него или пусть остаётся..
...
Рейтинг: 0 / 0
Вопрос по синтаксису Update
    #39909737
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Zulus
Правильно ли я понимаю, что товарищ хочет получить последовательную нумерацию DocNum в пределах AppCode? Может ещё что-то?
Да.
Zulus
Можно ли такую конструкцию считать безопасной для условий
- update без where
- один единственный кластерный индекс как указано в схеме
Можно. На текущий момент.
Но никто не гарантирует, что будет можно после очередного SP, CU или в новой версии.

Мое имхо - лучше переписать.
...
Рейтинг: 0 / 0
Вопрос по синтаксису Update
    #39909746
Zulus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
invm
Мое имхо - лучше переписать.

Вот и моё мнение точно такое-же, но тяжеловато с аргументацией для этого конкретного примера :)
invm, спасибо!
...
Рейтинг: 0 / 0
Вопрос по синтаксису Update
    #39909750
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Zulus
тяжеловато с аргументацией для этого конкретного примера
Данный update предполагает сканирование кластерного индекса.

Сканирование может быть упорядоченное - в порядке ключей индеса, а может быть неупорядоченное - в порядке распределения страниц. Во втором случае, вместо последовательной нумерации может получиться каша.

Насколько я знаю, сейчас неупорядоченное сканирование к update неприменимо. Но будет ли так и далее - никто не знает.
...
Рейтинг: 0 / 0
Вопрос по синтаксису Update
    #39909754
entrypoint
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Zulus,

Создание таблицы

Код: sql
1.
2.
3.
4.
5.
6.
7.
CREATE TABLE dbo.Repayments
             (AppCode       NVARCHAR(60) NOT NULL
            , RepaymentDate SMALLDATETIME NOT NULL
            , DocNumber     INT NOT NULL
             );
CREATE CLUSTERED INDEX cx_Repayments ON dbo.Repayments(AppCode, RepaymentDate);
GO



Наполнение данными
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
INSERT INTO dbo.Repayments(AppCode      
            , RepaymentDate 
            , DocNumber    )
SELECT '',  GETDATE(), 0 UNION ALL 
SELECT '',  GETDATE(), 0 UNION ALL 
SELECT '',  GETDATE(), 0 UNION ALL 
SELECT '',  GETDATE(), 0 UNION ALL 
SELECT '',  GETDATE(), 0 UNION ALL 
SELECT '',  GETDATE(), 0 UNION ALL 
SELECT 'a', GETDATE(), 0 UNION ALL 
SELECT 'b', GETDATE(), 0 UNION ALL 
SELECT 'c', GETDATE(), 0 UNION ALL 
SELECT 'd', GETDATE(), 0 UNION ALL 
SELECT 'e', GETDATE(), 0 UNION ALL 
SELECT 'f', GETDATE(), 0 



Обновление

Код: 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.
DECLARE @Part      VARCHAR(60) = '';

WITH a
     AS (
     SELECT 
            CASE
                WHEN AppCode = @Part THEN 1
                ELSE 0
            END+ROW_NUMBER() OVER(PARTITION BY CASE
                                                   WHEN AppCode = @Part THEN @Part
                                                   ELSE CONVERT(VARCHAR(36), NEWID())
                                               END ORDER BY
                                                           (
                                                            SELECT 
                                                                   1
                                                            )) AS rn
          , DocNumber
     FROM 
          dbo.Repayments)
     UPDATE a
       SET 
           DocNumber = rn;

SELECT 
       *
FROM 
     dbo.Repayments;
...
Рейтинг: 0 / 0
Вопрос по синтаксису Update
    #39909771
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
entrypoint
Обновление

Код: 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.
DECLARE @Part      VARCHAR(60) = '';

WITH a
     AS (
     SELECT 
            CASE
                WHEN AppCode = @Part THEN 1
                ELSE 0
            END+ROW_NUMBER() OVER(PARTITION BY CASE
                                                   WHEN AppCode = @Part THEN @Part
                                                   ELSE CONVERT(VARCHAR(36), NEWID())
                                               END ORDER BY
                                                           (
                                                            SELECT 
                                                                   1
                                                            )) AS rn
          , DocNumber
     FROM 
          dbo.Repayments)
     UPDATE a
       SET 
           DocNumber = rn;

SELECT 
       *
FROM 
     dbo.Repayments;

Это такое тонкое издевательство над сервером?
Все гораздо банальнее.
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
with a as
(
 select
  DocNumber, row_number() over (partition by AppCode order by AppCode, RepaymentDate) as n
 from
  dbo.Repayments
)
update a
 set
  DocNumber = n;
...
Рейтинг: 0 / 0
Вопрос по синтаксису Update
    #39909775
entrypoint
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
invm,

авторВсе гораздо банальнее.

Все ещё гораздо более банальнее.

вот код автора

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
declare
  @Part		varchar(120)
, @DocNumber	int
	
set @Part = ''
set @DocNumber = 1

update t set
  @DocNumber = DocNumber = 
	case 
		when @Part <> AppCode then 1
		else @DocNumber + 1
	end
, @Part = AppCode
from dbo.Repayments t

SELECT * FROM dbo.Repayments



вот результат выполнения кода автора (и моего)

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
AppCode                                                      RepaymentDate           DocNumber
------------------------------------------------------------ ----------------------- -----------
                                                             2019-12-30 11:58:00     2
                                                             2019-12-30 11:58:00     3
                                                             2019-12-30 11:58:00     4
                                                             2019-12-30 11:58:00     5
                                                             2019-12-30 11:58:00     6
                                                             2019-12-30 11:58:00     7
a                                                            2019-12-30 11:58:00     1
b                                                            2019-12-30 11:58:00     1
c                                                            2019-12-30 11:58:00     1
d                                                            2019-12-30 11:58:00     1
e                                                            2019-12-30 11:58:00     1
f                                                            2019-12-30 11:58:00     1



вот результат выполнения Вашего кода

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
AppCode                                                      RepaymentDate           DocNumber
------------------------------------------------------------ ----------------------- -----------
                                                             2019-12-30 11:58:00     1
                                                             2019-12-30 11:58:00     2
                                                             2019-12-30 11:58:00     3
                                                             2019-12-30 11:58:00     4
                                                             2019-12-30 11:58:00     5
                                                             2019-12-30 11:58:00     6
a                                                            2019-12-30 11:58:00     1
b                                                            2019-12-30 11:58:00     1
c                                                            2019-12-30 11:58:00     1
d                                                            2019-12-30 11:58:00     1
e                                                            2019-12-30 11:58:00     1
f                                                            2019-12-30 11:58:00     1
...
Рейтинг: 0 / 0
Вопрос по синтаксису Update
    #39909786
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
entrypoint
вот результат выполнения кода автора
Нет. Это результат выполнения кода автора на вашем примере и с вашими начальными значениями переменных.

А чтобы правильно готовить примеры, нужно понять как работает код автора. Тогда монстры, подобные вашему, не потребуются.
...
Рейтинг: 0 / 0
Вопрос по синтаксису Update
    #39909795
entrypoint
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
invm,

согласен
...
Рейтинг: 0 / 0
Вопрос по синтаксису Update
    #39909804
entrypoint
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
invm,

Правильно будет так

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
DECLARE @Part VARCHAR(60) = '';
WITH a
     AS (
     SELECT 
            CASE
                WHEN AppCode = @Part THEN 1
                ELSE 0
            END
            + ROW_NUMBER() OVER(PARTITION BY AppCode ORDER BY AppCode
                                                            , RepaymentDate) AS rn
          , DocNumber
     FROM 
          dbo.Repayments)
     UPDATE a
       SET 
           DocNumber = rn;



Но,

не могли бы Вы наполнить таблицу данными так, чтобы код автора и Ваш код при выполнении давали одинаковый результат ?
используя все возможные значения для поля AppCode ))) в том числе и '', никаких же ограничений на это поле, кроме NOT NULL - нет ?
...
Рейтинг: 0 / 0
Вопрос по синтаксису Update
    #39909812
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
entrypoint
не могли бы Вы наполнить таблицу данными так, чтобы код автора и Ваш код при выполнении давали одинаковый результат ?
Вы почему-то решили, что @Part нужно инициализировать первым значением из таблицы. Отсюда все проблемы.
Чтобы исходный код и мой давали одинаковый результат @Part нужно инициализировать значением, которого нет в таблице .
...
Рейтинг: 0 / 0
Вопрос по синтаксису Update
    #39909815
entrypoint
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
invm,

нет, это не я решил, вот код автора

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
create table dbo.Repayments
(
  AppCode       nvarchar(60) not null
, RepaymentDate	smalldatetime not null
, DocNumber     int not null
)
create clustered index cx_Repayments on dbo.Repayments(AppCode, RepaymentDate)
go

declare
  @Part		varchar(120)
, @DocNumber	int
	
set @Part = ''
set @DocNumber = 1




обратите внимание
авторset @Part = ''
и
авторAppCode nvarchar(60) not null позволяет хранить любые строковые значения отличные от NULL, или я не прав ?

авторЧтобы исходный код и мой давали одинаковый результат @Part нужно инициализировать значением, которого нет в таблице.
Это же не согласуется с определением таблицы и кодом автора ?
...
Рейтинг: 0 / 0
Вопрос по синтаксису Update
    #39909841
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
entrypoint
нет, это не я решил
Да нет, именно Вы.
Почему-то решили, что если set @Part = '', то и первая строка в таблице должна быть с AppCode = ''

Я же говорю - Вы не разобрались, как работает данный update.
...
Рейтинг: 0 / 0
Вопрос по синтаксису Update
    #39909860
entrypoint
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
invm,

Ну как не конструктивно, ну если есть у автора возможный изъян в логике (а может и предусмотренное поведение), почему не говорить о CHECK на поле AppCode, который не позволит вставить '', но сейчас-то в этих условиях я делаю все что позволяет приведённая структура

авторПочему-то решили, что если set @Part = '', то и первая строка в таблице должна быть с AppCode = ''

не я это решил, опять же структура данных, если я сделаю
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
INSERT INTO dbo.Repayments(AppCode      
            , RepaymentDate 
            , DocNumber    )
SELECT 'a', GETDATE(), 0 UNION ALL 
SELECT 'b', GETDATE(), 0 UNION ALL 
SELECT 'c', GETDATE(), 0 UNION ALL 
SELECT 'd', GETDATE(), 0 UNION ALL 
SELECT 'e', GETDATE(), 0 UNION ALL 
SELECT 'f', GETDATE(), 0 UNION ALL 
SELECT '',  GETDATE(), 0 UNION ALL 
SELECT '',  GETDATE(), 0 UNION ALL 
SELECT '',  GETDATE(), 0 UNION ALL 
SELECT '',  GETDATE(), 0 UNION ALL 
SELECT '',  GETDATE(), 0 UNION ALL 
SELECT '',  GETDATE(), 0 


то все равно строки со значением AppCode = '' будут первыми потому что
Код: sql
1.
create clustered index cx_Repayments on dbo.Repayments(AppCode, RepaymentDate)

(опять же структура)

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

Повторюсь, не конструктивно, хотите доказать свою точку зрения как минимум покажите такой же результат, что и до рефакторинга, с использованием среза данных, параметры которых описаны в структуре таблицы, а не ссылайтесь на условия, которых нет в постановке задачи.
...
Рейтинг: 0 / 0
Вопрос по синтаксису Update
    #39909867
iap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
entrypoint
все равно строки со значением AppCode = '' будут первым
C каких это пор кластерный индекс гарантирует порядок записей?
Только ORDER BY в запросе!
...
Рейтинг: 0 / 0
Вопрос по синтаксису Update
    #39909872
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
entrypoint
не я это решил, опять же структура данных, если я сделаю
Решили именно Вы.
У автора типичная задача - пронумеровать строки в разрезе определенного критерия и в определенном порядке.
А не ту, котору придумали Вы - "Записать в DocNumber последовательно возрастающее значение, начиная с 2 для всех AppCode = '', а для остальных AppCode - 1"
...
Рейтинг: 0 / 0
Вопрос по синтаксису Update
    #39909874
entrypoint
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
iap,

Код: 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.
CREATE TABLE dbo.Repayments
             (AppCode       NVARCHAR(60) NOT NULL
            , RepaymentDate SMALLDATETIME NOT NULL
            , DocNumber     INT NOT NULL
             );
CREATE CLUSTERED INDEX cx_Repayments ON dbo.Repayments(AppCode, RepaymentDate);
GO

INSERT INTO dbo.Repayments(AppCode      
            , RepaymentDate 
            , DocNumber    )
SELECT 'a', GETDATE(), 0 UNION ALL 
SELECT '',  GETDATE(), 0 UNION ALL 
SELECT 'b', GETDATE(), 0 UNION ALL 
SELECT '',  GETDATE(), 0 UNION ALL 
SELECT 'c', GETDATE(), 0 UNION ALL 
SELECT '',  GETDATE(), 0 UNION ALL 
SELECT 'd', GETDATE(), 0 UNION ALL 
SELECT '',  GETDATE(), 0 UNION ALL 
SELECT 'e', GETDATE(), 0 UNION ALL 
SELECT '',  GETDATE(), 0 UNION ALL 
SELECT 'f', GETDATE(), 0 UNION ALL 
SELECT '',  GETDATE(), 0 

SELECT 
       AppCode
     , RepaymentDate
     , DocNumber
FROM 
     dbo.Repayments;



Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
AppCode                                                      RepaymentDate           DocNumber
------------------------------------------------------------ ----------------------- -----------
                                                             2019-12-30 14:39:00     0
                                                             2019-12-30 14:39:00     0
                                                             2019-12-30 14:39:00     0
                                                             2019-12-30 14:39:00     0
                                                             2019-12-30 14:39:00     0
                                                             2019-12-30 14:39:00     0
a                                                            2019-12-30 14:39:00     0
b                                                            2019-12-30 14:39:00     0
c                                                            2019-12-30 14:39:00     0
d                                                            2019-12-30 14:39:00     0
e                                                            2019-12-30 14:39:00     0
f                                                            2019-12-30 14:39:00     0



Нет ?
...
Рейтинг: 0 / 0
Вопрос по синтаксису Update
    #39909879
entrypoint
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Результат, критерий истины только результат, код в студию

Может Вы диагноз неправильно поставили ?

invm
Zulus
Правильно ли я понимаю, что товарищ хочет получить последовательную нумерацию DocNum в пределах AppCode? Может ещё что-то?
Да.
Zulus
Можно ли такую конструкцию считать безопасной для условий
- update без where
- один единственный кластерный индекс как указано в схеме
Можно. На текущий момент.
Но никто не гарантирует, что будет можно после очередного SP, CU или в новой версии.

Мое имхо - лучше переписать.
...
Рейтинг: 0 / 0
Вопрос по синтаксису Update
    #39909914
Zulus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iap, моё почтение!
Согласен с тем, что порядок записей гарантируется order by, но в данном случае других вариантов не вижу:
- кластерный индекс (один единственный)
- параллелизма нет (для текущей версии)

Коллеги, спасибо всем участникам :)
Код не мой - я как раз хочу его переделать, но 100% владелец будет вредничать и задавать много "почему"
...
Рейтинг: 0 / 0
Вопрос по синтаксису Update
    #39909917
entrypoint
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всех с наступающим НГ !!!
Спасибо за обсуждение !!!
...
Рейтинг: 0 / 0
Вопрос по синтаксису Update
    #39909918
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
entrypoint
Может Вы диагноз неправильно поставили ?
Возможно. Но мой диагноз гораздо боле правдоподобен, чем Ваш.
entrypoint
Нет ?
В общем случае, нет.
Почему, объяснено тут - 22051347
...
Рейтинг: 0 / 0
Вопрос по синтаксису Update
    #39909937
entrypoint
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
invm,

Там добавление данных INSERT, а не UPDATE про который вы пишите.

Субъективные выводы, ссылки на самого же себя, а главное, полное игнорирование доводов, нет ни одного довода, который я бы не подкрепил кодом

invm
entrypoint
Может Вы диагноз неправильно поставили ?
Возможно. Но мой диагноз гораздо боле правдоподобен, чем Ваш.
entrypoint
Нет ?
В общем случае, нет.
Почему, объяснено тут - 22051347


как можно написать такое когда приведен довод в виде кода, который можно запустить, покрутить, попробовать.

Может, если у вас нет желания создать массив данных, с которыми бы отработал Ваш код, у Вас есть желание опровергнуть
Код: sql
1.
create clustered index cx_Repayments on dbo.Repayments(AppCode, RepaymentDate)

не на словах, а кодом ?
...
Рейтинг: 0 / 0
Вопрос по синтаксису Update
    #39909940
entrypoint
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Zulus,

Да, порядок строк только ORDER BY, но в данном случае я говорю о том, что первой в таблице будет любая строка со значением AppCode=''.
...
Рейтинг: 0 / 0
Вопрос по синтаксису Update
    #39909945
nullin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
кстати дубли с AppCode != '' никто не отменял, так что почему нумеровать
в нелогичном случае нужно именно с двух тоже не понятно
...
Рейтинг: 0 / 0
Вопрос по синтаксису Update
    #39909961
entrypoint
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
nullin,

Да, непонятно
Но код автора работает именно так и
автор не просил его исправить, автор хотел узнать его назначение, поэтому это поведение кода я воспринимаю как данность и проводя рефакторинг сохранил это поведение.

Все доводы моего оппонента в лице invm, основаны на предположениях не подкрепленных ничем - "entrypoint не понимает", "entrypoint не разобрался", "entrypoint ошибается", я же в свою очередь следую только той информации, которая была представлена автором и свои доводы подкрепляю ссылками на структуру базы данных (представленную автором), примерами кода, результатами сравнения.

invm, утверждает что я не могу использовать значение '' для AppCode, но я вижу что структура таблицы мне это не запрещает, это одно из валидных значений этой колонки, я утверждаю что согласно опять же структуре таблицы первыми строками в таблице всегда будут строки со значением AppCode='' независимо от порядка вставки, и.т.д. и.т.п., в ответ я получаю бездоказательные возражения

Это некорректно, непрофессионально, с учетом того, что код представленный invm выдает результат отличный от результата автора.

Код, только код критерий истины
...
Рейтинг: 0 / 0
Вопрос по синтаксису Update
    #39909974
nullin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
entrypoint
я утверждаю что согласно опять же структуре таблицы первыми строками в таблице всегда будут строки со значением AppCode=''

22051566
...
Рейтинг: 0 / 0
Вопрос по синтаксису Update
    #39909977
entrypoint
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
nullin,

Цитата

entrypoint
Zulus,

Да, порядок строк только ORDER BY, но в данном случае я говорю о том, что первой в таблице будет любая строка со значением AppCode=''.


entrypoint
iap,

Код: 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.
CREATE TABLE dbo.Repayments
             (AppCode       NVARCHAR(60) NOT NULL
            , RepaymentDate SMALLDATETIME NOT NULL
            , DocNumber     INT NOT NULL
             );
CREATE CLUSTERED INDEX cx_Repayments ON dbo.Repayments(AppCode, RepaymentDate);
GO

INSERT INTO dbo.Repayments(AppCode      
            , RepaymentDate 
            , DocNumber    )
SELECT 'a', GETDATE(), 0 UNION ALL 
SELECT '',  GETDATE(), 0 UNION ALL 
SELECT 'b', GETDATE(), 0 UNION ALL 
SELECT '',  GETDATE(), 0 UNION ALL 
SELECT 'c', GETDATE(), 0 UNION ALL 
SELECT '',  GETDATE(), 0 UNION ALL 
SELECT 'd', GETDATE(), 0 UNION ALL 
SELECT '',  GETDATE(), 0 UNION ALL 
SELECT 'e', GETDATE(), 0 UNION ALL 
SELECT '',  GETDATE(), 0 UNION ALL 
SELECT 'f', GETDATE(), 0 UNION ALL 
SELECT '',  GETDATE(), 0 

SELECT 
       AppCode
     , RepaymentDate
     , DocNumber
FROM 
     dbo.Repayments;



Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
AppCode                                                      RepaymentDate           DocNumber
------------------------------------------------------------ ----------------------- -----------
                                                             2019-12-30 14:39:00     0
                                                             2019-12-30 14:39:00     0
                                                             2019-12-30 14:39:00     0
                                                             2019-12-30 14:39:00     0
                                                             2019-12-30 14:39:00     0
                                                             2019-12-30 14:39:00     0
a                                                            2019-12-30 14:39:00     0
b                                                            2019-12-30 14:39:00     0
c                                                            2019-12-30 14:39:00     0
d                                                            2019-12-30 14:39:00     0
e                                                            2019-12-30 14:39:00     0
f                                                            2019-12-30 14:39:00     0



Нет ?


Это мой код подтверждающий мое утверждение

Здесь место, для Вашего кода, опровергающего его

Код: sql
1.
2.




P.S. Код, только код, без слов и спекуляций
...
Рейтинг: 0 / 0
Вопрос по синтаксису Update
    #39909979
entrypoint
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
iap,

Может и у Вас есть код ?
...
Рейтинг: 0 / 0
Вопрос по синтаксису Update
    #39909983
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
entrypoint
Там добавление данных INSERT, а не UPDATE про который вы пишите.
Где там? И про что я пишу?
entrypoint
Субъективные выводы, ссылки на самого же себя, а главное, полное игнорирование доводов, нет ни одного довода, который я бы не подкрепил кодом
Если Вы доводы не считаете доводами - это Ваши трудности.
Если не хватает знаний для понимания написанного и нет желания даже допустить, что Вы далеко не самый умный на свете - Ваши трудности.

Ваш код доводом не является, ибо не делает того, что требуется, даже с учетом Ваших домыслов о AppCode = ''
Еще раз - потрудитесь понять, что делает этот update. Затем сравните результат исходного update с Вашим творением вот на таком
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
INSERT INTO dbo.Repayments(AppCode      
            , RepaymentDate 
            , DocNumber    )
SELECT '',  GETDATE(), 0 UNION ALL 
SELECT '',  GETDATE(), 0 UNION ALL 
SELECT '',  GETDATE(), 0 UNION ALL 
SELECT '',  GETDATE(), 0 UNION ALL 
SELECT '',  GETDATE(), 0 UNION ALL 
SELECT '',  GETDATE(), 0 UNION ALL 
SELECT 'a', GETDATE(), 0 UNION ALL 
SELECT 'b', GETDATE(), 0 UNION ALL 
SELECT 'b', GETDATE(), 0 UNION ALL 
SELECT 'c', GETDATE(), 0 UNION ALL 
SELECT 'd', GETDATE(), 0 UNION ALL 
SELECT 'e', GETDATE(), 0 UNION ALL 
SELECT 'f', GETDATE(), 0;


А потом, так уж и быть, вот с этим
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
with a as
(
 select
  DocNumber,
  row_number() over (partition by AppCode order by AppCode, RepaymentDate) + 
   case when AppCode = @Part then 1 else 0 end as n
 from
  dbo.Repayments
)
update a
 set
  DocNumber = n;
...
Рейтинг: 0 / 0
Вопрос по синтаксису Update
    #39909991
nullin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
entrypoint, лови
...
Рейтинг: 0 / 0
Вопрос по синтаксису Update
    #39909994
entrypoint
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
invm,

в этой редакции Ваш код возвращает точно то, что и код автора и мой код

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
with a as
(
 select
  DocNumber,
  row_number() over (partition by AppCode order by AppCode, RepaymentDate) + 
   case when AppCode = @Part then 1 else 0 end as n
 from
  dbo.Repayments
)
update a
 set
  DocNumber = n;



Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
AppCode                                                      RepaymentDate           DocNumber
------------------------------------------------------------ ----------------------- -----------
                                                             2019-12-30 17:24:00     2
                                                             2019-12-30 17:24:00     3
                                                             2019-12-30 17:24:00     4
                                                             2019-12-30 17:24:00     5
                                                             2019-12-30 17:24:00     6
                                                             2019-12-30 17:24:00     7
a                                                            2019-12-30 17:24:00     1
b                                                            2019-12-30 17:24:00     1
b                                                            2019-12-30 17:24:00     2
c                                                            2019-12-30 17:24:00     1
d                                                            2019-12-30 17:24:00     1
e                                                            2019-12-30 17:24:00     1
f                                                            2019-12-30 17:24:00     1



Зачем вот это все, вот эти оскорбления, если Вы в конце концов сделали то же что и я ?
авторЕсли не хватает знаний для понимания написанного и нет желания даже допустить, что Вы далеко не самый умный на свете - Ваши трудности.

Ваш код доводом не является, ибо не делает того, что требуется, даже с учетом Ваших домыслов о AppCode = ''
Еще раз - потрудитесь понять, что делает этот update. Затем сравните результат исходного update с Вашим творением вот на таком[src]


Как насчет кода про кластерный индекс ?
Помните, нужно опровергнуть
...
Рейтинг: 0 / 0
Вопрос по синтаксису Update
    #39909995
iap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
entrypoint
Нет ?
Сейчас да. А потом - не знаю...
...
Рейтинг: 0 / 0
Вопрос по синтаксису Update
    #39909996
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
entrypoint
Код, только код, без слов и спекуляций
Упертый :)
Код: 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.
use tempdb;
go

create table dbo.t (id int identity primary key, filler char(1000));
insert into dbo.t
select top (1000)
 'a'
from
 master.dbo.spt_values a cross join
 master.dbo.spt_values b;

delete from dbo.t where id < 100;
insert into dbo.t values ('b'), ('c'), ('d'), ('e'), ('f');
go

set statistics xml on;

select top (10) id from dbo.t;
select top (10) id from dbo.t with (tablock);

set statistics xml off;
go

drop table dbo.t;
go


Или - https://dbfiddle.uk/?rdbms=sqlserver_2017&fiddle=81b441920d46b4424d9ff7bfc92d7f70
...
Рейтинг: 0 / 0
Вопрос по синтаксису Update
    #39909997
entrypoint
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
nullin,

)))))))) Остроумно, отношусь как к хорошей шутке.
Есть способ проще )))))

Код: sql
1.
SELECT * FROM dbo.Repayments ORDER BY NEWID()
...
Рейтинг: 0 / 0
Вопрос по синтаксису Update
    #39910002
nullin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
entrypoint, у меня там нет order by во первых, а во вторых, вы наверняка, сами смекаете, что для join оптимизатор может выбрать loop/merge/hash/adaptive join и без явного указания.

Что же качается вашего order by newid(), то select без явного указания сортировки эквивалентен select ... order by (select null) - может сейчас наступит просветление?
Иначе у меня складывается впечатление уже, что вы троллите.
...
Рейтинг: 0 / 0
Вопрос по синтаксису Update
    #39910004
entrypoint
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
invm,

Мое утверждение верно, потому что вы подменили кластерный индекс нашей таблицы по (AppCode, RepaymentDate) на кластерный индекс по Id

Информация к размышлению

Код: 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.
CREATE TABLE dbo.Repayments
             (Id            INT NOT NULL IDENTITY(1, 1) PRIMARY KEY NONCLUSTERED
            , AppCode       NVARCHAR(60) NOT NULL
            , RepaymentDate SMALLDATETIME NOT NULL
            , DocNumber     INT NOT NULL
             );
CREATE CLUSTERED INDEX cx_Repayments ON dbo.Repayments(AppCode, RepaymentDate);
GO

INSERT INTO dbo.Repayments(AppCode      
            , RepaymentDate 
            , DocNumber    )
SELECT 'a', GETDATE(), 0 UNION ALL 
SELECT '',  GETDATE(), 0 UNION ALL 
SELECT 'b', GETDATE(), 0 UNION ALL 
SELECT '',  GETDATE(), 0 UNION ALL 
SELECT 'c', GETDATE(), 0 UNION ALL 
SELECT '',  GETDATE(), 0 UNION ALL 
SELECT 'd', GETDATE(), 0 UNION ALL 
SELECT '',  GETDATE(), 0 UNION ALL 
SELECT 'e', GETDATE(), 0 UNION ALL 
SELECT '',  GETDATE(), 0 UNION ALL 
SELECT 'f', GETDATE(), 0 UNION ALL 
SELECT '',  GETDATE(), 0 

SELECT 
       Id
     , AppCode
     , RepaymentDate
     , DocNumber
FROM 
     dbo.Repayments;
...
Рейтинг: 0 / 0
Вопрос по синтаксису Update
    #39910014
entrypoint
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
nullin,

ну что такое

Нужен прямой SELECT который возвращает строки в физическом порядке
а у Вас соединения, указания к соединению HASH, это уже сортировки

Вы выводите строки не согласно физическому порядку, а согласно значению рассчитанного хэш порядок которого отличается от физического

вот фрагмент плана выполнения Вашего запроса соединение по хэш

Код: xml
1.
2.
3.
4.
5.
       <HashKeysBuild>
                  <ColumnReference Database="[rhino]" Schema="[dbo]" Table="[Repayments]" Alias="[r]" Column="DocNumber" />
                  <ColumnReference Database="[rhino]" Schema="[dbo]" Table="[Repayments]" Alias="[r]" Column="RepaymentDate" />
                  <ColumnReference Database="[rhino]" Schema="[dbo]" Table="[Repayments]" Alias="[r]" Column="AppCode" />
       </HashKeysBuild>



а физический порядок AppCode + RepaymentDate


Вот же о чем речь

entrypoint
invm,

Ну как не конструктивно, ну если есть у автора возможный изъян в логике (а может и предусмотренное поведение), почему не говорить о CHECK на поле AppCode, который не позволит вставить '', но сейчас-то в этих условиях я делаю все что позволяет приведённая структура

авторПочему-то решили, что если set @Part = '', то и первая строка в таблице должна быть с AppCode = ''


не я это решил, опять же структура данных, если я сделаю
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
INSERT INTO dbo.Repayments(AppCode      
            , RepaymentDate 
            , DocNumber    )
SELECT 'a', GETDATE(), 0 UNION ALL 
SELECT 'b', GETDATE(), 0 UNION ALL 
SELECT 'c', GETDATE(), 0 UNION ALL 
SELECT 'd', GETDATE(), 0 UNION ALL 
SELECT 'e', GETDATE(), 0 UNION ALL 
SELECT 'f', GETDATE(), 0 UNION ALL 
SELECT '',  GETDATE(), 0 UNION ALL 
SELECT '',  GETDATE(), 0 UNION ALL 
SELECT '',  GETDATE(), 0 UNION ALL 
SELECT '',  GETDATE(), 0 UNION ALL 
SELECT '',  GETDATE(), 0 UNION ALL 
SELECT '',  GETDATE(), 0 


то все равно строки со значением AppCode = '' будут первыми потому что
Код: sql
1.
create clustered index cx_Repayments on dbo.Repayments(AppCode, RepaymentDate)

(опять же структура)

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

Повторюсь, не конструктивно, хотите доказать свою точку зрения как минимум покажите такой же результат, что и до рефакторинга, с использованием среза данных, параметры которых описаны в структуре таблицы, а не ссылайтесь на условия, которых нет в постановке задачи.

???
...
Рейтинг: 0 / 0
Вопрос по синтаксису Update
    #39910019
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
entrypoint
Мое утверждение верно, потому что вы подменили кластерный индекс нашей таблицы по (AppCode, RepaymentDate) на кластерный индекс по Id
Не надоело чушь писать?
Хоть бы матчасть подучили что ли, прежде чем дискутировать...

https://dbfiddle.uk/?rdbms=sqlserver_2017&fiddle=160f5e9acfeba984e1c3534a55b597a3
...
Рейтинг: 0 / 0
Вопрос по синтаксису Update
    #39910027
entrypoint
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
invm,

Снова оскорбления ))))

Только код, только код

TOP - это не физический порядок, как раз TOP и требует ORDER BY, т.е. - согласно Майкрософт конструкция TOP без ORDER BY не корректна
https://docs.microsoft.com/ru-ru/sql/t-sql/queries/top-transact-sql?view=sql-server-ver15

Код: sql
1.
В инструкции SELECT всегда указывайте ORDER BY вместе с предложением TOP. Дело в том, что это единственный предсказуемый способ отбора строк предложением TOP.


т.е. использование TOP без ORDER BY выдает непредсказуемый результат (в нашем случае не в физическом порядке)

P.S. Это вы имели ввиду когда говорили про матчасть ?
...
Рейтинг: 0 / 0
Вопрос по синтаксису Update
    #39910031
nullin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
entrypoint, хотите все 1115 записей посмотреть?
...
Рейтинг: 0 / 0
Вопрос по синтаксису Update
    #39910034
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
entrypoint
Снова оскорбления ))))
Да нет, всего лишь констатация факта.
Код был дан. Вам ничего не мешает убрать оттуда TOP и посмотреть на результат. Или страшно?

entrypoint
TOP - это не физический порядок, как раз TOP и требует ORDER BY, т.е. - согласно Майкрософт конструкция TOP без ORDER BY не корректна
Ну вот, вы еще не понимаете как работает TOP. Куда уж тут про кластерный индекс...
https://docs.microsoft.com/en-us/sql/t-sql/queries/top-transact-sql?view=sql-server-ver15 Limits the rows returned in a query result set to a specified number of rows or percentage of rows in SQL Server 2019 (15.x). When you use TOP with the ORDER BY clause, the result set is limited to the first N number of ordered rows. Otherwise, TOP returns the first N number of rows in an undefined order.В процитированном чего-нибудь есть про физический порядок? Где вообще документировано утверждение, что строки возвращаются в физическом порядке?

В общем, код Вам был дан. Если не в состоянии понять как он работает - гуглите. В гугле полно знаний, если гуглить правильно. Ключевые слова для поиска - sql server allocation order scan
...
Рейтинг: 0 / 0
Вопрос по синтаксису Update
    #39910147
entrypoint
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
invm,

Удивительно, получил тот же самый результат, строки в таблице хранятся согласно кластерному индексу и AppCode = '' по прежнему в первых рядах (((

Код: 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.
45.
46.
47.
48.
49.
CREATE TABLE dbo.Repayments
             (Id            INT NOT NULL IDENTITY(1, 1) PRIMARY KEY NONCLUSTERED
            , AppCode       NVARCHAR(60) NOT NULL
            , RepaymentDate SMALLDATETIME NOT NULL
            , DocNumber     INT NOT NULL
            , filler char(1000) null
            );
CREATE CLUSTERED INDEX cx_Repayments ON dbo.Repayments(AppCode, RepaymentDate);
GO

INSERT INTO dbo.Repayments(AppCode      
            , RepaymentDate 
            , DocNumber    )
SELECT 'a', GETDATE(), 0 UNION ALL 
SELECT '',  GETDATE(), 0 UNION ALL 
SELECT 'b', GETDATE(), 0 UNION ALL 
SELECT '',  GETDATE(), 0 UNION ALL 
SELECT 'c', GETDATE(), 0 UNION ALL 
SELECT '',  GETDATE(), 0 UNION ALL 
SELECT 'd', GETDATE(), 0 UNION ALL 
SELECT '',  GETDATE(), 0 UNION ALL 
SELECT 'e', GETDATE(), 0 UNION ALL 
SELECT '',  GETDATE(), 0 UNION ALL 
SELECT 'f', GETDATE(), 0 UNION ALL 
SELECT '',  GETDATE(), 0 

INSERT INTO dbo.Repayments(AppCode      
            , RepaymentDate 
            , DocNumber    )
select top (1000)
 b.AppCode, b.RepaymentDate, b.DocNumber
from
 master.dbo.spt_values a cross join
 dbo.Repayments b;

delete top (100) from dbo.Repayments;

INSERT INTO dbo.Repayments(AppCode      
            , RepaymentDate 
            , DocNumber    )
values ('e', GETDATE(), 1), ('f', GETDATE(), 1), ('g', GETDATE(), 1);

SELECT 
              Id            
            , AppCode       
            , RepaymentDate 
            , DocNumber
FROM dbo.Repayments 
 



Т.е. нет, никакого способа при существующей структуре кластерного индекса получить другое поведение )))) кластерный складывает строки так и только так (физически !!!)

утверждение

авторто все равно строки со значением AppCode = '' будут первыми потому что
create clustered index cx_Repayments on dbo.Repayments(AppCode, RepaymentDate)


не опровергнуто, ибо (матчасть)


авторКластеризованные индексы сортируют и хранят строки данных в таблицах или представлениях на основе их ключевых значений. Этими значениями являются столбцы, включенные в определение индекса. Существует только один кластеризованный индекс для каждой таблицы, так как строки данных могут храниться в единственном порядке.

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


https://docs.microsoft.com/ru-ru/sql/relational-databases/indexes/clustered-and-nonclustered-indexes-described?view=sql-server-ver15
...
Рейтинг: 0 / 0
Вопрос по синтаксису Update
    #39910149
entrypoint
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
nullin,

Зачем ?

В SELECT вы используете соединения подсказки, которые гарантировано возвращают строки в порядке отличном о порядка хранения записей в таблицы

Нужно положить данные в таблицу так чтобы

Код: sql
1.
2.
3.
4.
5.
SELECT 
              AppCode       
            , RepaymentDate 
            , DocNumber
FROM dbo.Repayments 



вывел в первых строках что-то другое, а не AppCode = ''

Ну а это, как указано выше, судя по всему - невозможно
...
Рейтинг: 0 / 0
Вопрос по синтаксису Update
    #39910151
entrypoint
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Думаю на этом можно остановиться, согласны ?


Всех с наступающим Новым Годом !!!
Счастья, здоровья, профессиональных успехов !!!
...
Рейтинг: 0 / 0
Вопрос по синтаксису Update
    #39910160
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
entrypoint
кластерный складывает строки так и только так
Когда осознаете разницу между "складывает" и "читает", - возвращайтесь.
Авось поумнеете и сможет понять и что вам писали, и примеры, которые давали.

Хотя, складывается впечатление, что Вы намеренно игнорируете все, что может подвергнуть сомнению сложившуюся у Вас картину мира. Вон даже в последнем примере выкинули select с tablock...

Ну либо решили, потехи ради, всех потроллить перед НГ.
...
Рейтинг: 0 / 0
Вопрос по синтаксису Update
    #39910172
entrypoint
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
invm,

Вот она картина мира

Код: sql
1.
2.
3.
4.
5.
6.
SELECT 
              Id            
            , AppCode       
            , RepaymentDate 
            , DocNumber
FROM dbo.Repayments (TABLOCK)



Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
101                                                                      2019-12-31 13:15:00     0
102                                                                      2019-12-31 13:15:00     0
103                                                                      2019-12-31 13:15:00     0
..............................................................................................................
1010                                                                     2019-12-31 13:15:00     0
1011                                                                     2019-12-31 13:15:00     0
1012                                                                     2019-12-31 13:15:00     0
1013        e                                                            2019-12-31 13:15:00     1
1014        f                                                            2019-12-31 13:15:00     1
1015        g                                                            2019-12-31 13:15:00     1



AppCode='' - первые )))))
...
Рейтинг: 0 / 0
Вопрос по синтаксису Update
    #39910173
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
entrypoint,

Ну вот и опустились до откровенного вранья :) Да и запрос с синтаксической ошибкой :) Или до сих пор на 2000-м сидим?

К сведению - TABLOCK не гарантируют Allocation Order Scan, а только делает его возможным. Об этом так же написано в статьях, которые было рекомендовано поискать и прочитать.
Но, видимо, не в коня корм :)

Успехов в лечении граблетерапией.
...
Рейтинг: 0 / 0
Вопрос по синтаксису Update
    #39910179
entrypoint
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
invm,

Как безосновательно, как самоуверенно (могли бы прежде проверить, а потом писать)
никаких синтаксических ошибок )))))))

Готовы поспорить ?

у Вас

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
SELECT 
       Id
     , AppCode
     , RepaymentDate
     , DocNumber
     , @@VERSION 
FROM 
     dbo.Repayments( TABLOCK );



на 2017-м не отрабатывает ? ))))))))))))

даже если даже прокачать матчасть ?

авторСледующие табличные указания можно задавать как с ключевым словом WITH, так и без него: NOLOCK, READUNCOMMITTED, UPDLOCK, REPEATABLEREAD, SERIALIZABLE, READCOMMITTED, TABLOCK, TABLOCKX, PAGLOCK, ROWLOCK, NOWAIT, READPAST, XLOCK, SNAPSHOT и NOEXPAND. Если такие табличные указания указываются без ключевого слова WITH, подсказки следует задавать отдельно
https://docs.microsoft.com/ru-ru/sql/t-sql/queries/hints-transact-sql-table?view=sql-server-ver15
...
Рейтинг: 0 / 0
Вопрос по синтаксису Update
    #39910189
Руслан Дамирович
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Буйный он какой-то... и подбородков то ли 4, то ли 12.
...
Рейтинг: 0 / 0
Вопрос по синтаксису Update
    #39910191
Руслан Дамирович
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
entrypoint

Готовы поспорить ?

Готов поспорить, что здесь только один клоун.
Но к сожалению (ли?), он этого не осознает.
...
Рейтинг: 0 / 0
Вопрос по синтаксису Update
    #39910192
entrypoint
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
invm,

Подведем неутешительный (промежуточный итог)
с чем вы были не согласны

1. Строки в таблице хранятся в порядке определенным кластерным индексом
Код: sql
1.
2.
* Кластеризованные индексы сортируют и хранят строки данных в таблицах или представлениях на основе их ключевых значений. Этими значениями являются столбцы, включенные в определение индекса. Существует только один кластеризованный индекс для каждой таблицы, так как строки данных могут храниться в единственном порядке.  
* Строки данных в таблице хранятся в порядке сортировки только в том случае, если таблица содержит кластеризованный индекс. Если у таблицы есть кластеризованный индекс, то таблица называется кластеризованной. Если у таблицы нет кластеризованного индекса, то строки данных хранятся в неупорядоченной структуре, которая называется кучей.


https://docs.microsoft.com/ru-ru/sql/relational-databases/indexes/clustered-and-nonclustered-indexes-described?view=sql-server-ver15

2. Использование TOP без ORDER BY выдает непредсказуемый результат
Код: sql
1.
В инструкции SELECT всегда указывайте ORDER BY вместе с предложением TOP. Дело в том, что это единственный предсказуемый способ отбора строк предложением TOP.


https://docs.microsoft.com/ru-ru/sql/t-sql/queries/top-transact-sql?view=sql-server-ver15

3. Считаете что конструкция
Код: sql
1.
2.
3.
4.
5.
6.
SELECT 
              Id            
            , AppCode       
            , RepaymentDate 
            , DocNumber
FROM dbo.Repayments (TABLOCK)


содержит синтаксическую ошибку для MSSQL 2017
Код: sql
1.
Следующие табличные указания можно задавать как с ключевым словом WITH, так и без него: NOLOCK, READUNCOMMITTED, UPDLOCK, REPEATABLEREAD, SERIALIZABLE, READCOMMITTED, TABLOCK, TABLOCKX, PAGLOCK, ROWLOCK, NOWAIT, READPAST, XLOCK, SNAPSHOT и NOEXPAND


https://docs.microsoft.com/ru-ru/sql/t-sql/queries/hints-transact-sql-table?view=sql-server-ver15

Это хорошо, что у меня с Майкрософт одинаковое видение мира
...
Рейтинг: 0 / 0
Вопрос по синтаксису Update
    #39910193
entrypoint
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Руслан Дамирович,

welcome

у Вас то же не отрабатывает, то же синтаксическая ошибка ? )))

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
SELECT 
       Id
     , AppCode
     , RepaymentDate
     , DocNumber
     , @@VERSION 
FROM 
     dbo.Repayments( TABLOCK ); 
...
Рейтинг: 0 / 0
Вопрос по синтаксису Update
    #39910194
entrypoint
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
все цирк уезжает )))))
...
Рейтинг: 0 / 0
Вопрос по синтаксису Update
    #39910199
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
entrypoint
invm,

Подведем неутешительный (промежуточный итог)
с чем вы были не согласны...
Какая буйная фантазия и мастерские уходы от неудобных вопросов :) Вы скрасили мое скучное пребывание на работе 31-го декабря :)
Согласен только с 3-м пунктом, мой косяк. По остальным, пожалуйста, цитаты.

И не уходите от темы, - вы склочно добивались кода, показывающего, что сканирование кластерного индекса происходит не всегда в порядке этого индекса. Таковой был дан на публичном проверенном ресурсе.
Теперь ваша очередь дать на том же ресурсе код, подтверждающий вашу точку зрения - кластерный индекс всегда читается упорядоченно. Т.е. найти ошибку в моем примере и ее продемонстрировать.
На всякий случай еще раз - читается, а не хранится
Дерзайте.

Руслан Дамирович
Буйный он какой-то...
Разве ж это буйный? Просто тролль или упертый неуч :)
...
Рейтинг: 0 / 0
Вопрос по синтаксису Update
    #39910201
entrypoint
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
invm
entrypoint
invm,

Подведем неутешительный (промежуточный итог)
с чем вы были не согласны...
Какая буйная фантазия и мастерские уходы от неудобных вопросов :) Вы скрасили мое скучное пребывание на работе 31-го декабря :)
Согласен только с 3-м пунктом, мой косяк. По остальным, пожалуйста, цитаты.

И не уходите от темы, - вы склочно добивались кода, показывающего, что сканирование кластерного индекса происходит не всегда в порядке этого индекса. Таковой был дан на публичном проверенном ресурсе.
Теперь ваша очередь дать на том же ресурсе код, подтверждающий вашу точку зрения - кластерный индекс всегда читается упорядоченно. Т.е. найти ошибку в моем примере и ее продемонстрировать.
На всякий случай еще раз - читается, а не хранится


авторСтроки данных в таблице хранятся в порядке сортировки только в том случае, если таблица содержит кластеризованный индекс
https://docs.microsoft.com/ru-ru/sql/relational-databases/indexes/clustered-and-nonclustered-indexes-described?view=sql-server-ver15


Дерзайте.

Руслан Дамирович
Буйный он какой-то...
Разве ж это буйный? Просто тролль или упертый неуч :)


осталось два
про хранение строк и TOP без ORDER BY ))))
там цитаты из MSDN будете их опровергать ?


P.S. про читать - это Ваша цитата
авторКогда осознаете разницу между "складывает" и "читает", - возвращайтесь.

моя вот
авторто все равно строки со значением AppCode = '' будут первыми потому что
create clustered index cx_Repayments on dbo.Repayments(AppCode, RepaymentDate)
(опять же структура)
...
Рейтинг: 0 / 0
Вопрос по синтаксису Update
    #39910206
entrypoint
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
invm,

invmПо остальным, пожалуйста, цитаты

про TOP 22051889

invmentrypointTOP - это не физический порядок, как раз TOP и требует ORDER BY, т.е. - согласно Майкрософт конструкция TOP без ORDER BY не корректна
Ну вот, вы еще не понимаете как работает TOP. Куда уж тут про кластерный индекс...




про кластерный индекс

22051476
invmВы почему-то решили, что @Part нужно инициализировать первым значением из таблицы. Отсюда все проблемы

22051558
entrypointвсе равно строки со значением AppCode = '' будут первыми потому что
create clustered index cx_Repayments on dbo.Repayments(AppCode, RepaymentDate)
...
Рейтинг: 0 / 0
Вопрос по синтаксису Update
    #39910220
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
entrypoint
про TOP 22051889
И где там про предсказуемость результатов TOP без ORDER BY?
entrypoint
про кластерный индекс

22051476
И где там про хранение в порядке индекса?

Вы слишком много додумываете. И почему-то считаете додуманное абсолютной истиной.

Ну и опять вполне ожидаемо игнорируете неудобное:
invm
И не уходите от темы, - вы склочно добивались кода, показывающего, что сканирование кластерного индекса происходит не всегда в порядке этого индекса. Таковой был дан на публичном проверенном ресурсе.
Теперь ваша очередь дать на том же ресурсе код, подтверждающий вашу точку зрения - кластерный индекс всегда читается упорядоченно. Т.е. найти ошибку в моем примере и ее продемонстрировать.


И на закучку про "хранение в порядке индекса"
Код: 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.
45.
use tempdb;
set ansi_nulls, quoted_identifier, xact_abort on;
go

create table dbo.t (id int primary key, filler char(2000) null);

insert into dbo.t
 (id, filler)
 select top (20)
  (row_number() over (order by 1/0) - 1) * 2,
  'a'
 from
  master.dbo.spt_values a;
go

select
 a.id, a.filler, c.file_id, c.page_id, c.slot_id
from
 dbo.t a cross apply
 (select cast('<x>' + replace(replace(replace(sys.fn_PhysLocFormatter(a.%%physloc%%), ':', '</x><x>'), '(', ''), ')', '') + '</x>' as xml)) b(x) cross apply
 (select b.x.value('x[1]', 'int'), b.x.value('x[2]', 'int'), b.x.value('x[3]', 'int')) c(file_id, page_id, slot_id)
order by
 c.file_id, c.page_id, c.slot_id;

insert into dbo.t
 (id, filler)
 select top (10)
  (row_number() over (order by 1/0) - 1) * 2 + 1,
  'b'
 from
  master.dbo.spt_values a;
go

select
 a.id, a.filler, c.file_id, c.page_id, c.slot_id
from
 dbo.t a cross apply
 (select cast('<x>' + replace(replace(replace(sys.fn_PhysLocFormatter(a.%%physloc%%), ':', '</x><x>'), '(', ''), ')', '') + '</x>' as xml)) b(x) cross apply
 (select b.x.value('x[1]', 'int'), b.x.value('x[2]', 'int'), b.x.value('x[3]', 'int')) c(file_id, page_id, slot_id)
order by
 c.file_id, c.page_id, c.slot_id;
go

drop table dbo.t;
go

...
Рейтинг: 0 / 0
Вопрос по синтаксису Update
    #39910238
nullin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
invm, остаётся надеяться, на то, что той околесицей с которой вы боритесь, не были оболванены менее подкованные программисты и пользователи ранее.
...
Рейтинг: 0 / 0
Вопрос по синтаксису Update
    #39910249
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nullin, не испытываю оптимизма по данному вопросу :)
...
Рейтинг: 0 / 0
Вопрос по синтаксису Update
    #39910262
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
entrypoint согласно Майкрософт конструкция TOP без ORDER BY не корректна

Не Microsoft, а ANSI SQL 92 стандарт.

У MS SELECT TOP n является апокрифом.

FETCH FIRST N ROWS ONLY появилось в стандарте ANSI SQL 2008. Ближе к типовому выражения является ORDER BY ... OFFSET ... FETCH... .
...
Рейтинг: 0 / 0
Вопрос по синтаксису Update
    #39910418
ShIgor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владислав Колосов,

однако сильно..
wikiАпокриф — произведение религиозной литературы, посвящённое по преимуществу событиям и лицам Священной и церковной истории, не включённое в канон Церковью.
...
Рейтинг: 0 / 0
Вопрос по синтаксису Update
    #39911902
entrypoint
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
invm,

Перечитайте внимательно, там ответы на все Ваши вопросы

Пример, непонятно про что.
Ясно, что используя ORDER BY записи можно вернуть в любом порядке, разговор о том в каком порядке хранятся строки в таблице

Если Вы будет использовать конструкцию без ORDER BY Вы всё равно получите список хранящийся в таблице отсортированным по кластерному индексу, в вашем случае это кластерный индекс по полю id, который создается при создании ограничений PRIMARY KEY (сокращенное от PRIMARY KEY CLUSTERED)

авторИндексы создаются автоматически при определении ограничений PRIMARY KEY или UNIQUE на основе столбцов таблицы. Например, при создании таблицы с ограничением UNIQUE Компонент Database Engine автоматически создает некластеризованный индекс. При настройке PRIMARY KEY Компонент Database Engine автоматически создает кластеризованный индекс, если он еще не существует.

https://docs.microsoft.com/ru-ru/sql/relational-databases/indexes/clustered-and-nonclustered-indexes-described?view=sql-server-ver15



мало того, этот порядок хранения можно изменить удалив ограничение PRIMARY KEY и создав другой кластерный индекс, даже если затем удалить этот индекс порядок хранения сохраниться

Код: 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.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
set ansi_nulls, quoted_identifier, xact_abort on;
go

create table dbo.t (id int CONSTRAINT PK_t primary key, filler char(2000) null);

insert into dbo.t
 (id, filler)
 select top (20)
  (row_number() over (order by 1/0) - 1) * 2,
  'a'
 from
  master.dbo.spt_values a;
go

-- Принудительная сортировка по ORDER BY 
select
'Принудительная сортировка по ORDER BY', 
 a.id, a.filler, c.file_id, c.page_id, c.slot_id
from
 dbo.t a cross apply
 (select cast('<x>' + replace(replace(replace(sys.fn_PhysLocFormatter(a.%%physloc%%), ':', '</x><x>'), '(', ''), ')', '') + '</x>' as xml)) b(x) cross apply
 (select b.x.value('x[1]', 'int'), b.x.value('x[2]', 'int'), b.x.value('x[3]', 'int')) c(file_id, page_id, slot_id)
order by
 c.file_id, c.page_id, c.slot_id;
go

-- Список в в порядке хранения строк (поле id согласно PRIMARY KEY)
SELECT 
       'Список в в порядке хранения строк (поле id согласно PRIMARY KEY)'
     , *
FROM 
     dbo.t;
 GO 

-- Удаляем ограничение, при этом удаляется кластерный индекс
ALTER TABLE dbo.t DROP CONSTRAINT PK_t;
GO

/* 
Создаем новый кластерный индекс, который заставит хранить строки в таблице 
отсортировав их по полю id в обратном порядке
*/
CREATE UNIQUE CLUSTERED INDEX [UQ_id] ON [dbo].[t]
              ([id] DESC
              );
GO 

-- Список в порядке хранения строк (поле id согласно [UQ_id])
SELECT 
       'Список в порядке хранения строк (поле id согласно [UQ_id])'
     , *
FROM 
     dbo.t;

-- Теперь удалим индекс
DROP INDEX [UQ_id] ON [dbo].[t];
GO 

/*
И увидим что порядок хранения строк не изменился, 
строки были отсортированы при создании кластерного индекса
*/
SELECT 
       'Список в порядке хранения строк (поле id согласно [UQ_id])'
     , *
FROM 
     dbo.t;

drop table dbo.t;

go
...
Рейтинг: 0 / 0
Вопрос по синтаксису Update
    #39911904
entrypoint
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Владислав Колосов,

Может всё-таки согласно документации Майкрософт ?

авторВ инструкции SELECT всегда указывайте ORDER BY вместе с предложением TOP. Дело в том, что это единственный предсказуемый способ отбора строк предложением TOP.
https://docs.microsoft.com/ru-ru/sql/t-sql/queries/top-transact-sql?view=sql-server-ver15
...
Рейтинг: 0 / 0
Вопрос по синтаксису Update
    #39911907
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
entrypoint,

речь идет об использовании TOP, а не ORDER BY. И никто не говорит о предсказуемости.
...
Рейтинг: 0 / 0
Вопрос по синтаксису Update
    #39911911
entrypoint
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Владислав Колосов,


В Вашем же сообщении так, или как-то иначе ?


авторавторentrypoint
согласно Майкрософт конструкция TOP без ORDER BY не корректна


Не Microsoft, а ANSI SQL 92 стандарт.

22052442
...
Рейтинг: 0 / 0
Вопрос по синтаксису Update
    #39911927
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Продолжаем веселье :)

entrypoint
Перечитайте внимательно, там ответы на все Ваши вопросы
Да нечего там перечитывать - вы не отвечаете на вопросы. И кода, доказывающего, ваши утверждения до сих пор нет.

Если вы считаете, "select * from table" и есть требуемое доказательство, то глубоко заблуждаетесь - это никак не показывает как именно хранятся строки и что они были прочитаны в порядке хранения.

Пример, демонстрирующий порядок хранения на уровне индекса вы опять благополучно проигнорировали. Что неудивительно :)

Вот вам очередной пример для игнорирования - порядок хранения на уровне страницы
Код: 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.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
use tempdb;
set ansi_nulls, quoted_identifier, xact_abort on;
go

create table dbo.t (id int primary key, filler char(10) null);

insert into dbo.t
 (id, filler)
 values (1, 'a'), (3, 'b'), (4, 'c');

insert into dbo.t
 (id, filler)
 values (2, 'd');

if object_id('tempdb..#t', 'U') is not null
 drop table #t;

select
 a.id, a.filler, c.file_id, c.page_id, c.slot_id
into
 #t
from
 dbo.t a cross apply
 (select cast('<x>' + replace(replace(replace(sys.fn_PhysLocFormatter(a.%%physloc%%), ':', '</x><x>'), '(', ''), ')', '') + '</x>' as xml)) b(x) cross apply
 (select b.x.value('x[1]', 'int'), b.x.value('x[2]', 'int'), b.x.value('x[3]', 'int')) c(file_id, page_id, slot_id);

declare @file_id int, @page_id int;
declare @pd table (ParentObject varchar(100), Object varchar(100), Field varchar(100), VALUE varchar(100));

select top (1) @file_id = file_id, @page_id = page_id from #t;

insert into @pd
 (ParentObject, Object, Field, VALUE)
 exec sys.sp_executesql N'dbcc page(0, @file_id, @page_id, 2) with tableresults;', N'@file_id int, @page_id int', @file_id, @page_id;

-- Строки таблицы в порядке хранения на странице
select
 t.id, t.filler, c.row_data_offset, d.slot_id, pd.*
from
 @pd pd cross apply
 (select nullif(charindex('-', pd.VALUE), 0)) a(p) cross apply
 (select nullif(charindex('(', pd.VALUE, a.p), 0)) b(p) cross apply
 (select cast(substring(pd.VALUE, a.p + 1, b.p - a.p - 1) as int)) c(row_data_offset) cross apply
 (select cast(left(pd.Value, nullif(charindex(' ', pd.VALUE), 0)) as int)) d(slot_id) join
 #t t on t.file_id = @file_id and t.page_id = @page_id and t.slot_id = d.slot_id
where
 pd.Object like 'OFFSET TABLE%' and
 c.row_data_offset is not null
order by
 c.row_data_offset;
go

drop table dbo.t;
go



А теперь, внимание, вопрос - если строки физически хранятся в порядке индекса, то что присходит при добавление строк в середину индекса? И немного усложним - при конкурентном добавлении в середину индекса?
...
Рейтинг: 0 / 0
Вопрос по синтаксису Update
    #39911943
entrypoint
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
invm,

Код: sql
1.
А теперь, внимание, вопрос - если строки физически хранятся в порядке индекса, то что присходит при добавление строк в середину индекса? И немного усложним - при конкурентном добавлении в середину индекса?



Все будет храниться в порядке определенном кластерным индексом, мы уже об этом говорили
22051573

и не важно, конкурентно, неконкурентно
проверьте - если не верите
уберите в своих селектах ORDER BY и получите список упорядоченный по кластерному индексу
...
Рейтинг: 0 / 0
Вопрос по синтаксису Update
    #39911950
entrypoint
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
invm,

авторЕсли вы считаете, "select * from table" и есть требуемое доказательство, то глубоко заблуждаетесь - это никак не показывает как именно хранятся строки и что они были прочитаны в порядке хранения.


почему же тогда код приведенный мной в 22055414 работает именно так, как я это описываю ( "случайность - не думаю" )
авторИ кода, доказывающего, ваши утверждения до сих пор нет.

Сделайте "select * from table" как-нибудь так, чтобы список был отсортирован не по кластерному индексу, а как-то иначе и все вопросы будут закрыты (используя меня как посредника Вы стали спорить с Майкрософт)
...
Рейтинг: 0 / 0
Вопрос по синтаксису Update
    #39911956
iap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
entrypoint
используя меня как посредника Вы стали спорить с Майкрософт
Так приведите же цитату Microsoft, наконец!
Или докажите, что записи в результате запроса без ORDER BY гарантированно ВСЕГДА вернутся в порядке кластерного индекса.
Доказать-то можно только ссылкой на документацию производителя, никак иначе. Правда?
Вы же не имеете доступа к исходным текстам SQL сервера?
...
Рейтинг: 0 / 0
Вопрос по синтаксису Update
    #39911960
entrypoint
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
iap,

Ой, да цитировано перецитировано (вот фрагментик 22052270 )
Перечитайте эту тему, здесь прямые ссылки на документацию

или же сделайте так чтобы этот код работал по другому
22055414
приведите пример и всё, зачем флудить-то
...
Рейтинг: 0 / 0
Вопрос по синтаксису Update
    #39911971
Гавриленко Сергей Алексеевич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Этот код товарищу "гарантированно в порядке кластерного индекса" уже показывали?

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
declare @t table (
    id      int             primary key clustered
    , name  varchar (50)

    , unique (
        name
    )
)

insert @t
select 1, 'Z'
union all select 2, 'Y'
union all select 3, 'X'

select * from @t
...
Рейтинг: 0 / 0
Вопрос по синтаксису Update
    #39911975
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
entrypoint
почему же тогда код приведенный мной в 22055414 работает именно так, как я это описываю ( "случайность - не думаю" )
Не вижу смысла объяснять по -дцатому разу. Когда научитесь отличать физический порядок от логического, тогда и побеседуем.
entrypoint
Сделайте "select * from table" как-нибудь так, чтобы список был отсортирован не по кластерному индексу, а как-то иначе и все вопросы будут закрыты
Вам это уже было показано, в том числе и на публичном ресурсе - 22051797
Но вы придрлись к top. Рекомендацию убрать top и запустить еще раз вы, как обычно, проигнорировали.

Где ответы на "неудобные" вопросы? В частности на
invm
А теперь, внимание, вопрос - если строки физически хранятся в порядке индекса, то что присходит при добавление строк в середину индекса? И немного усложним - при конкурентном добавлении в середину индекса?
Словоблудие из 22055471 за ответ не принимается. Оно лишь в очередной раз показывает отсутствие у вас знаний по обсуждаемой теме.
Уточню для непонятливых - что произойдет на уровне физического хранения, когда данные добавляются в середину индекса?
...
Рейтинг: 0 / 0
Вопрос по синтаксису Update
    #39911994
entrypoint
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
invm,

авторУточню для непонятливых - что произойдет на уровне физического хранения, когда данные добавляются в середину индекса?

Произойдет ровно то, о чем я уже писал ))))
Внимательно читайте ))) Не через строку )))

Строки в таблице будут храниться в порядке определенном кластерным индексом )))
...
Рейтинг: 0 / 0
Вопрос по синтаксису Update
    #39911996
entrypoint
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Гавриленко Сергей Алексеевич,


)))) вот это уже что-то ))))
Согласен ))))

invm, видите и вопросов нет ))))), а то уже третью страницу флудить ))))
...
Рейтинг: 0 / 0
Вопрос по синтаксису Update
    #39911999
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
entrypoint
Произойдет ровно то, о чем я уже писал ))))
Внимательно читайте ))) Не через строку )))
Ткните носом - где вы писали что произойдет на физическом уровне при вставке строки в середину индекса? Не общими словами, а что происходит со строками и страницами индекса.
...
Рейтинг: 0 / 0
Вопрос по синтаксису Update
    #39912005
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
entrypoint
invm, видите и вопросов нет ))))), а то уже третью страницу флудить ))))
Да ну? Этот пример ведь никак не подтверждает и не опровергает вашу теорию о физическом хранении строк индекса в порядке его ключа.
...
Рейтинг: 0 / 0
Вопрос по синтаксису Update
    #39912006
entrypoint
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
invm,

тема закрыта )))
приз уходит Гавриленко Сергей Алексеевич
...
Рейтинг: 0 / 0
Вопрос по синтаксису Update
    #39912012
entrypoint
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
invm,

в 22055497
были такие слова "или же сделайте так чтобы этот код работал по другому"
и в 22055478
было "Сделайте "select * from table" как-нибудь так, чтобы список был отсортирован не по кластерному индексу, а как-то иначе и все вопросы будут закрыты"

А сделал это - Гавриленко Сергей Алексеевич, вот ему и орден (пришел, увидел, победил)

а Вы правы, насчет авторДа ну? Этот пример ведь никак не подтверждает и не опровергает вашу теорию о физическом хранении строк индекса в порядке его ключа., потому что это не моя теория, это данность производителя MSSQL - Майкрсофт, которая отражена в документации по этому продукту
авторКластеризованные индексы сортируют и хранят строки данных в таблицах или представлениях на основе их ключевых значений


или не верите ?
https://docs.microsoft.com/ru-ru/sql/relational-databases/indexes/clustered-and-nonclustered-indexes-described?view=sql-server-ver15
))))
...
Рейтинг: 0 / 0
Вопрос по синтаксису Update
    #39912017
entrypoint
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
invm,
...
Рейтинг: 0 / 0
Вопрос по синтаксису Update
    #39912024
entrypoint
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Гавриленко Сергей Алексеевич,

Гавриленко Сергей Алексеевич
Этот код товарищу "гарантированно в порядке кластерного индекса" уже показывали?

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
declare @t table (
    id      int             primary key clustered
    , name  varchar (50)

    , unique (
        name
    )
)

insert @t
select 1, 'Z'
union all select 2, 'Y'
union all select 3, 'X'

select * from @t




entrypoint
Гавриленко Сергей Алексеевич,


)))) вот это уже что-то ))))
Согласен ))))

invm, видите и вопросов нет ))))), а то уже третью страницу флудить ))))


P.S
кстати, про гарантировано - это не моё,
вот высказывания, но это все не я )))
22051566 22052164 22055491
...
Рейтинг: 0 / 0
Вопрос по синтаксису Update
    #39912034
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
entrypoint
это данность производителя MSSQL - Майкрсофт, которая отражена в документации по этому продукту
авторКластеризованные индексы сортируют и хранят строки данных в таблицах или представлениях на основе их ключевых значений
С каких пор в русском языке "на основе" = " в порядке"? Или на языке оригинала "based on" = "ordered by"?

Не надоело не отвечать на вопросы и выставляться идиотом?
...
Рейтинг: 0 / 0
Вопрос по синтаксису Update
    #39912051
entrypoint
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
invm,

Оскорбления, оскорбления )))

invm
entrypoint
это данность производителя MSSQL - Майкрсофт, которая отражена в документации по этому продукту
пропущено...
С каких пор в русском языке "на основе" = " в порядке"? Или на языке оригинала "based on" = "ordered by"?

Не надоело не отвечать на вопросы и выставляться идиотом?


ну читайте дальше, не торопитесь, следующее предложение, всё же однозначно, по-другому и понять невозможно ))))
авторThere can be only one clustered index per table, because the data rows themselves can be stored in only one order .
https://docs.microsoft.com/en-us/sql/relational-databases/indexes/clustered-and-nonclustered-indexes-described?view=sql-server-ver15


Черным же по белому написано
авторВ таблице может быть только один кластеризованный индекс, поскольку сами строки данных могут храниться только в одном заказе . Хотите другую таблицу с индексом оформляйте новый заказ

Или нет ? )))))
...
Рейтинг: 0 / 0
Вопрос по синтаксису Update
    #39912114
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
entrypoint
Оскорбления, оскорбления )))
Просто констатация факта.
entrypoint
ну читайте дальше, не торопитесь, следующее предложение, всё же однозначно, по-другому и понять невозможно ))))
Документация тоже ошибается или не приводится в соответствие с реальностью.
Да и порядок хранения, на самом деле, к единственности кластерного индекса не имеет никакого отношения. Единственность кластерного индпекса (ранее 2005-го сервера) обуславливалась: а) его ключ используется как row locator, б) хранить на листовом уровне вместе с ключом еще и данные можно было только в одном индексе.
Пункт б неактуален, начиная с 2005-го сервера.

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

А на вопрос
invm
что произойдет на уровне физического хранения, когда данные добавляются в середину индекса?
Так и не ответили, обо классический цугцванг...

Вам всего-то нужно привести пример, в котором: а) строки индекса действительно хранятся в порядке ключа индекса и б) вставка строк в середину индекса этот порядок сохраняет.
Элементарная задача, учитывая, что уже было показано как найти физическое положение строки.
Но вы демонстрируете только слепую веру в хранение в порядке ключа индекса и игнорируете любые примеры, показывающие обратное.
...
Рейтинг: 0 / 0
Вопрос по синтаксису Update
    #39912141
entrypoint
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
invm,

авторА на вопрос
invm
что произойдет на уровне физического хранения, когда данные добавляются в середину индекса?
Так и не ответили, обо классический цугцванг...

так вот же ? или снова что-то не дочитали, снова что-то пропустили, снова с чем-то поторопились ?
22055471

А вот и про вставку не по порядку
22051746

Читайте внимательно )))

А оскорбления и "Документация тоже ошибается или не приводится в соответствие с реальностью." это от отсутствия аргументов

Тогда, с таким подходом ("Документация тоже ошибается или не приводится в соответствие с реальностью."), в природе не существует аргументов, которые могли бы Вас убедить, все можно подменить словами )))))

P.S.
авторПункт б неактуален, начиная с 2005-го сервера.. Что об этом жалеть, ведь это могло быть и не правда авторДокументация тоже ошибается или не приводится в соответствие с реальностью. Главное не устарел
https://docs.microsoft.com/en-us/sql/relational-databases/indexes/clustered-and-nonclustered-indexes-described?view=sql-server-ver15 )))
...
Рейтинг: 0 / 0
Вопрос по синтаксису Update
    #39912150
Гавриленко Сергей Алексеевич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
entrypointА вот и про вставку не по порядкуЧтобы увидеть последствия расщепления страниц для индекса, в индексе должно быть как минимум две страницы, и расщеплять надо не последнюю.
...
Рейтинг: 0 / 0
Вопрос по синтаксису Update
    #39912160
entrypoint
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Гавриленко Сергей Алексеевич,

Вопросов нет )))))) Вы сделали за пять минут то, что мой оппонент не смог сделать за полторы недели

P.S.
в индексе должно быть как минимум две страницы, и расщеплять надо не последнюю
Это что-то меняет в 22055601 ?
...
Рейтинг: 0 / 0
Вопрос по синтаксису Update
    #39912165
Гавриленко Сергей Алексеевич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
entrypoint,

Да, меняет. Логически отсоритрованные данные могут находиться в страницах, расположенных в файле в беспорядке. После этого порядок данных, которые будет возвращать select без order by зависит от того, какой физический оператор доступа выберет оптимизатор, степени параллелизма и других факторов. И ровно в тот момент, когда оптимизатору захоется просканировать таблицу не по цепочке страниц, а по iam, или, скажем, впендюрить в запрос параллелизм, у вам начнутся спецэффекты.

В общем, всегда, когда в плане у Scan-оператора стоит свойство ordered = false (и нет последующего оператора Sort), вы рано или поздно получите рандомно отсортированный набор. Особенно при мало-мальски значимых объемах.

Для иллюстрации немного меняем ваш пример:

Код: 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.
if object_id ( 'tempdb..#Repayments' ) is not null
    drop table #Repayments
go
CREATE TABLE #Repayments
             (AppCode       NVARCHAR(60) NOT NULL
            , RepaymentDate SMALLDATETIME NOT NULL
            , DocNumber     char (4000) NOT NULL
             );
CREATE CLUSTERED INDEX cx_Repayments ON #Repayments(AppCode, RepaymentDate);
GO

INSERT INTO #Repayments(AppCode      
            , RepaymentDate 
            , DocNumber    )
SELECT 'a', GETDATE(), 0 UNION ALL 
SELECT 'f', GETDATE(), 0 UNION ALL
SELECT 'b', GETDATE(), 0 UNION ALL 
SELECT 'e', GETDATE(), 0

SELECT 
       AppCode
     , RepaymentDate
     , DocNumber
     , c.*
FROM #Repayments a
cross apply
     (select cast('<x>' + replace(replace(replace(sys.fn_PhysLocFormatter(a.%%physloc%%), ':', '</x><x>'), '(', ''), ')', '') + '</x>' as xml)) b(x) cross apply
     (select b.x.value('x[1]', 'int'), b.x.value('x[2]', 'int'), b.x.value('x[3]', 'int')) c(file_id, page_id, slot_id)

go



и видим, что меньший по значению ключ располагается в большей по номеру странице:
...
Рейтинг: 0 / 0
Вопрос по синтаксису Update
    #39912169
entrypoint
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Гавриленко Сергей Алексеевич,
Это не совсем мой пример, но

Код: 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.
if object_id ( 'tempdb..#Repayments' ) is not null
    drop table #Repayments
go
CREATE TABLE #Repayments
             (AppCode       NVARCHAR(60) NOT NULL
            , RepaymentDate SMALLDATETIME NOT NULL
            , DocNumber     char (4000) NOT NULL
             );
CREATE CLUSTERED INDEX cx_Repayments ON #Repayments(AppCode, RepaymentDate);
GO

INSERT INTO #Repayments(AppCode      
            , RepaymentDate 
            , DocNumber    )
SELECT 'a', GETDATE(), 0 UNION ALL 
SELECT 'f', GETDATE(), 0 UNION ALL
SELECT 'b', GETDATE(), 0 UNION ALL 
SELECT 'e', GETDATE(), 0

SELECT 
       AppCode
     , RepaymentDate
     , DocNumber
FROM #Repayments a


Код: sql
1.
2.
3.
4.
5.
AppCode                                                      RepaymentDate           DocNumber
a                                                            2020-01-09 18:04:00     0                                                                                                                                                                                                                                                               
b                                                            2020-01-09 18:04:00     0                                                                                                                                                                                                                                                               
e                                                            2020-01-09 18:04:00     0                                                                                                                                                                                                                                                               
f                                                            2020-01-09 18:04:00     0                 



))) Почему так ?
...
Рейтинг: 0 / 0
Вопрос по синтаксису Update
    #39912170
Гавриленко Сергей Алексеевич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
entrypointПочему так Я уже пояснил, почему. Потому что в данном случае сервер перебирает страницы по их логическому порядку, а не физическому. И нет нормальных способов заставить его сделать по-другому на такой маленькой таблице для такого простого запроса. Но поверьте, сервер умеет выбирать данные не только по логическому порядку страниц, но и по физическому.

Специально для вас уже все украдено и описано: https://sqlperformance.com/2015/01/t-sql-queries/allocation-order-scans
...
Рейтинг: 0 / 0
Вопрос по синтаксису Update
    #39912186
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
entrypoint, маразм крепчает :) Издевки бесполезны, они только больше подчеркивают ваш идиотизм :)
Ваши бла-бла-бла и переливания из пустого в порожнее уже никому не интересны.

Давай таки перейдем к конкретике:
invm
Вам всего-то нужно привести пример, в котором: а) строки индекса действительно хранятся в порядке ключа индекса и б) вставка строк в середину индекса этот порядок сохраняет.
Элементарная задача, учитывая, что уже было показано как найти физическое положение строки.
Но вы демонстрируете только слепую веру в хранение в порядке ключа индекса и игнорируете любые примеры, показывающие обратное.

Что-то мне подсказывает, что ответа так и не будет...
А ответы вида 22055471 , это все равно что "граф считает счета на своем счету" (с)
Если не знаете - так и напишите. Но видимо гонор не позволяет :)

Так уж и быть, дам намек - есть массив из 10 элементов. Нужно добавить 11-й элемент на позицию №2. Какой вид должен принять массив и что для этого нужно сделать?

entrypoint
Вы сделали за пять минут то, что мой оппонент не смог сделать за полторы недели
22051797
Если пример вам непонятен, то это не означает, что он неверен. Это означает, что у вас недостаточно знаний для его понимания.
...
Рейтинг: 0 / 0
Вопрос по синтаксису Update
    #39912310
entrypoint
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Гавриленко Сергей Алексеевич,

Ясно, замечательная статья ))))
А если в таблице нет индексов, если никаких B-TREE
почему происходит так ?

Код: 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.
IF OBJECT_ID('tempdb..#t') IS NOT NULL
    DROP TABLE #t;

CREATE TABLE #t(id INT NOT NULL);

-- Залил тестовые данные
INSERT INTO #t(
       id
         )
SELECT DISTINCT 
       number
FROM 
     master.dbo.spt_values;

-- Добавил кластерный индекс 
CREATE CLUSTERED INDEX ci ON #t(id DESC);

-- Получил список
SELECT 
       id
FROM 
     #t;

-- Удалил индекс
DROP INDEX ci ON #t;

-- Что происходит здесь, почему нет индекса, а id в обратном порядке ?  
SELECT 
       id
FROM 
     #t;
...
Рейтинг: 0 / 0
Вопрос по синтаксису Update
    #39912323
entrypoint
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
invm,

Ну что такое, скатились до уровня Черкизовского рынка
Здесь же форум профессионалов, на котором делятся знаниями, помогают советом и всё такое, в том числе указывают на чужие ошибки, конструктивно, без оскорблений, как и подобает Программисту с большой буквы ))))
...
Рейтинг: 0 / 0
Вопрос по синтаксису Update
    #39912324
Sergey Sizov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
entrypoint
-- Что происходит здесь, почему нет индекса, а id в обратном порядке ?
SELECT
id
FROM
#t;
Точно-точно? Даже если присмотреться?
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
2
1
0
-1
-32768
1469283328
1073741824
536870912
...
Рейтинг: 0 / 0
Вопрос по синтаксису Update
    #39912329
entrypoint
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Sergey Sizov,

Вы получили такой результат ?

А какой MSSQL, какие настройки ?
...
Рейтинг: 0 / 0
Вопрос по синтаксису Update
    #39912334
Sergey Sizov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
entrypoint
Sergey Sizov,

Вы получили такой результат ?
Странный вопрос... Думаете, я это просто сам нарисовал?
А какой MSSQL, какие настройки ?2017 express на виртуалке, все по дефолту.
...
Рейтинг: 0 / 0
Вопрос по синтаксису Update
    #39912337
entrypoint
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Sergey Sizov,

Интересно ))))))
...
Рейтинг: 0 / 0
Вопрос по синтаксису Update
    #39912339
Фотография Yasha123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
entrypoint
invm,

Ну что такое, скатились до уровня Черкизовского рынка
Здесь же форум профессионалов, на котором делятся знаниями, помогают советом и всё такое, в том числе указывают на чужие ошибки, конструктивно, без оскорблений, как и подобает Программисту с большой буквы ))))

очередной Балабол с большой буквы, прости господи.
неуч к тому же, а уж пафоса до усрачки.
то invm: уж лучше Воронина пинать, он вменяемый
...
Рейтинг: 0 / 0
Вопрос по синтаксису Update
    #39912341
entrypoint
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Yasha123,

Вы, вообще, с чем не согласны ))))

Здесь же форум профессионалов, на котором делятся знаниями, помогают советом и всё такое, в том числе указывают на чужие ошибки, конструктивно, без оскорблений, как и подобает Программисту с большой буквы ))))
...
Рейтинг: 0 / 0
Вопрос по синтаксису Update
    #39912348
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
entrypoint,

Ну что, опять издевками демонстрируете собственный идиотизм? Все что угодно, лишь бы не отвечать на неудобный вопрос? :)

Впрос свелся к элементарному (из серии "третий класс, вторая четверть")
invm
есть массив из 10 элементов. Нужно добавить 11-й элемент на позицию №2. Какой вид должен принять массив и что для этого нужно сделать?
Классический массив - самый простой пример упорядоченного хранения. Ответ на этот вопрос очевиден всем и вы его знаете. Ибо если не знаете - то банально профнепригодны.
Озвучив этот ответ и продолжив утверждать про упорядоченное хранение строк кластерного индекса, вы ставите под сомнение адекватность и профпригодность разработчиков SQL Server.
Гораздо более вероятно, что неадекватны таки вы вместе с составителями документации.

Согласно ваши же призывам
entrypoint
Код, только код критерий истины
entrypoint
Результат, критерий истины только результат, код в студию

Код показывающий, что разработчики SQL Server все же вполне адекватны, был дан - 22052357 и 22055452 . Но был благополучно пригнорирован :)

Так где же код, подтверждающий ваши утверждения и адекватность? Или теперь критерий истины только документация? Она как Священное писание - все, что в нем написано не должно никогда подвергаться сомнению?
Боюсь, что данного кода мы так никогда и не увидим :)

Подытоживая дискуссию - вы либо действительно неадекватны, либо просто придуриваетесь...
...
Рейтинг: 0 / 0
Вопрос по синтаксису Update
    #39912352
entrypoint
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
invm,

неадекватны таки вы вместе с составителями документации.
Кто-то стал отныне богом
И простил себе грехи;


Подытоживая дискуссию
Да давайте уже закончим с Вами.
Всё же ясно ?
вы либо действительно неадекватны, либо просто придуриваетесь...
...
Рейтинг: 0 / 0
Вопрос по синтаксису Update
    #39912366
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
entrypoint
Да давайте уже закончим с Вами.
Всё же ясно ?
вы либо действительно неадекватны, либо просто придуриваетесь...
Предсказание сбылось - ответа на вопрос нет, кода нет, идиотизм - налицо :)
...
Рейтинг: 0 / 0
Вопрос по синтаксису Update
    #39912388
entrypoint
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
invm,

Человек загадка
22050667
...
Рейтинг: 0 / 0
Вопрос по синтаксису Update
    #39912396
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
entrypoint
Человек загадка
22050667
Не пытайтесь меня подловить, не владея матчастью - только усугубите негативное впечатление о вас и ваших опусов у сообщества.
Для начала наберитесь знаний, чтобы ответить на вопрос "Зачем сортировать строки источника при массовой вставке в кластерный индекс?"
Подсказка - это напрямую связано с механизмом хранения данных в индексе, но никак не связано с упорядоченным хранением.
...
Рейтинг: 0 / 0
Вопрос по синтаксису Update
    #39912402
entrypoint
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
invm
entrypoint
Человек загадка
22050667
Не пытайтесь меня подловить, не владея матчастью - только усугубите негативное впечатление о вас и ваших опусов у сообщества.
Для начала наберитесь знаний, чтобы ответить на вопрос "Зачем сортировать строки источника при массовой вставке в кластерный индекс?"
Подсказка - это напрямую связано с механизмом хранения данных в индексе, но никак не связано с упорядоченным хранением.


Зачем ловить
Так облажаться ещё нужно уметь )))) Спасибо за опыт

авторЗдесь же форум профессионалов, на котором делятся знаниями, помогают советом и всё такое, в том числе указывают на чужие ошибки, конструктивно, без оскорблений, как и подобает Программисту с большой буквы ))))
22056271

P.S.
автор"Зачем сортировать строки источника при массовой вставке в кластерный индекс?"
У что же у нас такое особенное с кластерным индексом, что при вставке в него сортировать ничего не нужно, может потому что
Код: sql
1.
* Кластеризованные индексы сортируют и хранят строки данных в таблицах или представлениях на основе их ключевых значений


https://docs.microsoft.com/ru-ru/sql/relational-databases/indexes/clustered-and-nonclustered-indexes-described?view=sql-server-ver15
22052270

Ах да, молчу ))) Мы же
неадекватны таки вы вместе с составителями документации 22056289

P.S.S Теперь Вы за пять минут сделали то, что не могли сделать за полторы недели ))))
...
Рейтинг: 0 / 0
Вопрос по синтаксису Update
    #39912467
entrypoint
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
nullin,

22051809
nullin

Что же качается вашего order by newid(), то select без явного указания сортировки эквивалентен select ... order by (select null) - может сейчас наступит просветление?


Не поможете, воспользовался Вашим советом, но он почему-то не работает, почему-то он не сортирует в случайном порядке как нужно, хотя Вы и пишете, что order by newid() = select ... order by (select null)

Скрипт нужно выполнить несколько раз, чтобы получить нужный эффект
Код: 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.
DECLARE @t AS TABLE(id INT NOT NULL PRIMARY KEY CLUSTERED); 

INSERT INTO @t(
       id
         )
SELECT 2 UNION ALL
SELECT 10 UNION ALL
SELECT 30 UNION ALL
SELECT 45;

SELECT 
       'Вывод без сортировки'
     , id
FROM 
     @t;

SELECT 
       'Cейчас наступит просветление'
     , id
FROM 
     @t
       ORDER BY
                (
                 SELECT 
                        NULL
                );

SELECT 
       'Непросветленный способ'
     , id
FROM 
     @t
       ORDER BY 
                NEWID();



Заранее благодарен
...
Рейтинг: 0 / 0
Вопрос по синтаксису Update
    #39912486
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
entrypoint
У что же у нас такое особенное с кластерным индексом, что при вставке в него сортировать ничего не нужно, может потому что
Код: sql
1.
* Кластеризованные индексы сортируют и хранят строки данных в таблицах или представлениях на основе их ключевых значений

Что же до вас никак не дойдет: дискутировать, не зная матчасти - признак неадекватности.

Изучайте:
Код: 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.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
use master;
set ansi_nulls, quoted_identifier, xact_abort on;
go

create database TestSortingOnInsert;
alter database TestSortingOnInsert set recovery full;
backup database TestSortingOnInsert to disk = 'nul:';
go

use TestSortingOnInsert;
go

create table dbo.t (id uniqueidentifier primary key clustered, filler char(500) null);
create table dbo.s (id uniqueidentifier, filler char(500) null);

declare @c int = 100000;

insert into dbo.t
 (id, filler)
 select top (@c)
  newid(), 'a'
 from
  master.dbo.spt_values a cross join
  master.dbo.spt_values b;

insert into dbo.s
 (id, filler)
 select top (@c)
  newid(), 'b'
 from
  master.dbo.spt_values a cross join
  master.dbo.spt_values b;
go

begin tran;
set statistics xml, time on;
insert into dbo.t (id, filler) select id, filler from dbo.s option (/*Запрещаем требовать сортировку строк источника*/querytraceon 8795);
set statistics xml, time off;

/*Сколько было сожрано места в журнале транзакций*/
select
 'Без сортировки', db_name(dbt.database_id) as [БД], dbt.database_transaction_log_bytes_used + dbt.database_transaction_log_bytes_used_system as [Сожрано в ЖТ]
from
 sys.dm_tran_current_transaction ct join
 sys.dm_tran_database_transactions dbt on dbt.transaction_id = ct.transaction_id;

rollback;
go

begin tran;
set statistics xml, time on;
insert into dbo.t (id, filler) select id, filler from dbo.s order by id;
set statistics xml, time off;

/*Сколько было сожрано места в журнале транзакций*/
select
 'С сортировкой', db_name(dbt.database_id) as [БД], dbt.database_transaction_log_bytes_used + dbt.database_transaction_log_bytes_used_system as [Сожрано в ЖТ]
from
 sys.dm_tran_current_transaction ct join
 sys.dm_tran_database_transactions dbt on dbt.transaction_id = ct.transaction_id;

rollback;
go

use master;
alter database TestSortingOnInsert set single_user with rollback immediate;
drop database TestSortingOnInsert;
go

БДСожрано в ЖТБез сортировкиTestSortingOnInsert118249508Без сортировкиtempdb0

БДСожрано в ЖТС сортировкойTestSortingOnInsert61107580С сортировкойtempdb0
...
Рейтинг: 0 / 0
Вопрос по синтаксису Update
    #39912489
entrypoint
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
invm,

Наслаждайтесь
22056482

Кстати может с 22056566 поможете, а то край как нужно (((
у меня вроде работает, но хочется по фэншую, как у взрослых
...
Рейтинг: 0 / 0
Вопрос по синтаксису Update
    #39912512
entrypoint
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
invm,

Может к документации ?

Вы используете NEWID() ( "функция NEWID вызывает непредсказуемый уровень нагрузки" ), которые генерирует непоследовательный uniqueidentifier и при вставке его в кластерный индекс много чего происходит для того, чтобы вставить его то в конец, то в начало, в середину.
для того чтобы избежать такого поведения рекомендуется использовать функцию NEWSEQUENTIALID() ( "использование NEWSEQUENTIALID может ускорить работу по сравнению с использованием функции NEWID" ), которая
авторСоздает идентификатор GUID, имеющий значение, большее любого идентификатора GUID, который был прежде создан на указанном компьютере при помощи этой функции с момента запуска Windows
https://docs.microsoft.com/ru-ru/sql/t-sql/functions/newsequentialid-transact-sql?view=sql-server-ver15

Немного изменяем Ваш скрипт только на этом основании, не вникая в тонкости и сразу же получаем и прирост производительности и с памятью уже все не так плохо. И это только всего оптимизация в лоб, без погружения, просто, книжку прочитал и всё (((

Код: 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.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
use master;
set ansi_nulls, quoted_identifier, xact_abort on;
go

create database TestSortingOnInsert;
alter database TestSortingOnInsert set recovery full;
backup database TestSortingOnInsert to disk = 'nul:';
go

use TestSortingOnInsert;
go

create table dbo.t (id uniqueidentifier primary key clustered DEFAULT NEWSEQUENTIALID ( ), filler char(500) null);
create table dbo.s (id uniqueidentifier DEFAULT NEWSEQUENTIALID ( ), filler char(500) null);

declare @c int = 100000;

insert into dbo.t
 (filler)
 select top (@c)
  'a'
 from
  master.dbo.spt_values a cross join
  master.dbo.spt_values b;

insert into dbo.s
 (filler)
 select top (@c)
   'b'
 from
  master.dbo.spt_values a cross join
  master.dbo.spt_values b;
go

begin tran;
set statistics xml, time on;
insert into dbo.t (id, filler) select id, filler from dbo.s option (/*Запрещаем требовать сортировку строк источника*/querytraceon 8795);
set statistics xml, time off;

/*Сколько было сожрано места в журнале транзакций*/
select
 'Без сортировки', db_name(dbt.database_id) as [БД], dbt.database_transaction_log_bytes_used + dbt.database_transaction_log_bytes_used_system as [Сожрано в ЖТ]
from
 sys.dm_tran_current_transaction ct join
 sys.dm_tran_database_transactions dbt on dbt.transaction_id = ct.transaction_id;

rollback;
go

begin tran;
set statistics xml, time on;
insert into dbo.t (id, filler) select id, filler from dbo.s order by id;
set statistics xml, time off;

/*Сколько было сожрано места в журнале транзакций*/
select
 'С сортировкой', db_name(dbt.database_id) as [БД], dbt.database_transaction_log_bytes_used + dbt.database_transaction_log_bytes_used_system as [Сожрано в ЖТ]
from
 sys.dm_tran_current_transaction ct join
 sys.dm_tran_database_transactions dbt on dbt.transaction_id = ct.transaction_id;

rollback;
go

use master;
alter database TestSortingOnInsert set single_user with rollback immediate;
drop database TestSortingOnInsert;
go




P.S. 22056596 Нет ?
...
Рейтинг: 0 / 0
Вопрос по синтаксису Update
    #39912614
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Уважаемый entrypoint, вы просили показать зачем может понадобится сортировка при массовой вставке в кластерный индекс? Просили. Было показано? Было.
Что-то не устраивает? Ну так это уже ваши трудности.

И не нужно переводить стрелки на документацию. Это и дальнейший поток мыслей не относится к заданному вопросу.

entrypoint
стати может с 22056566 поможете, а то край как нужно (((
у меня вроде работает, но хочется по фэншую, как у взрослых
Вы даже толком прочитать не можете, что написал nullin. Какая уж тут помощь? Так что дерзайте самостоятельно.
К тому же, включать телепатические способности, чтобы понять чего вы там пытаетесь изобразить и что для вас феншуй, лично мне просто лень.
...
Рейтинг: 0 / 0
Вопрос по синтаксису Update
    #39912644
nullin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
entrypoint, вы действительно не поняли то, что я вам отвечал.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
declare @t as table(id int not null primary key clustered); 
insert into @t(id) values (0), (1), (2), (3);

select N'Вывод без сортировки', id, N'Пустое поле' k
  from @t; 

select N'Cейчас наступит просветление', id, k = (select N'Пустое поле')
  from @t
 order by k;

select N'Непросветленный способ', id, k = newid()
 from @t
order by k;


dbfiddle


Утверждение "order by newid() = select ... order by (select null)" ложно.

Пожалуйста, приглядитесь внимательнее к моему сообщению и dbfiddle.
...
Рейтинг: 0 / 0
Вопрос по синтаксису Update
    #39912646
nullin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
nullin
Утверждение "order by newid() = select ... order by (select null)" ложно.

На всякий случай, поясню, Ваше утверждение о моих сказанных словах - ложное,
и лучше вам это признать, чтобы не подвергать людей сомнению в вашей адекватности.
...
Рейтинг: 0 / 0
Вопрос по синтаксису Update
    #39912691
Гавриленко Сергей Алексеевич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Модератор: Я, пожалуй, прикрою. Пора прекращать этот вертеп.

Уважаемый entrypoint,

Учите матчасть. Жизнь сильно богаче, чем в вашей реальности переведенного роботом msdn. Если вы потрудитесь углубиться, вы даже поразитесь, насколько.
...
Рейтинг: 0 / 0
112 сообщений из 112, показаны все 5 страниц
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Вопрос по синтаксису Update
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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