powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Кластерный индекс до или после.
18 сообщений из 18, страница 1 из 1
Кластерный индекс до или после.
    #40076020
Kolu4ka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Дилетантский вопрос.
Создаем временную таблицу на которую нужен кластерный индекс, записей будет пусть 50к
По производительности лучше кластерный индекс до вставки создать или после?

По моему мнению быстрее получится сначала создать, а потом вставить данные. Т.к. данные уже будут вставляться в нужном порядке, но нужна будет предварительная сортировка.
Если иначе, то будет создана куча, которую потом также нужно будет сортировать и перестраивать данные.
...
Рейтинг: 0 / 0
Кластерный индекс до или после.
    #40076025
0wl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
0wl
Гость
Kolu4ka,

Вставка в кучу может быть быстрее, если соблюсти условия минимального логирования (см. https://docs.microsoft.com/en-US/sql/t-sql/statements/insert-transact-sql?view=sql-server-ver15#using-insert-intoselect-to-bulk-import-data-with-minimal-logging-and-parallelism и https://docs.microsoft.com/en-US/sql/relational-databases/import-export/prerequisites-for-minimal-logging-in-bulk-import?view=sql-server-ver15 . Первая вставка в пустцю таблицу с кластерным индексом тоже будет минимально логироваться, но следующие итерации будут с полным логированием.

Ну и такой важный бонус: если создавать индекс по существующим данным, он вместе с собой соберёт актуальную статистику. А если сначала создать индекс, а потом наливать данные, придётся уповать на автообновление статистик.
...
Рейтинг: 0 / 0
Кластерный индекс до или после.
    #40076029
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kolu4ka,

сортировка будет использована при вставке в пустую таблицу, даже если Вы ее не укажете явно, то есть этого не избежать. Дважды заполнять таблицу я не вижу смысла - при вставке и при создании кластерного индекса.
...
Рейтинг: 0 / 0
Кластерный индекс до или после.
    #40076064
Kolu4ka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
0wl, спасибо,
читала еще топик
https://www.sql.ru/forum/1320821/insert-with-tablock

Конечный вывод делаю для себя такой, если в свою таблицу я заливаю все данные одним insert(одна интерация) и дальнейшие операции с таблицей будут только по кластерному полю, то имеет смысл создавать кластерный индекс сначала и использовать tablock при вставке.

Да, еще вопросик, если при работе с такой таблицей мне понадобится удалять записи, правильнее сделать поле для признака удаления и update его, что бы таблица не перестраивалась? Или можно сразу удалять? К примеру для удаления 10 из 50 тыс.
...
Рейтинг: 0 / 0
Кластерный индекс до или после.
    #40076072
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kolu4ka

Да, еще вопросик, если при работе с такой таблицей мне понадобится удалять записи, правильнее сделать поле для признака удаления и update его, что бы таблица не перестраивалась? Или можно сразу удалять? К примеру для удаления 10 из 50 тыс.


Правильнее - не вставлять ненужное.
Двойной кэшбэк.
...
Рейтинг: 0 / 0
Кластерный индекс до или после.
    #40076077
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kolu4ka

Конечный вывод делаю для себя такой, если в свою таблицу я заливаю все данные одним insert(одна интерация) и дальнейшие операции с таблицей будут только по кластерному полю, то имеет смысл создавать кластерный индекс сначала и использовать tablock при вставке.


Вот скока не мучился - так и не пришел к однозначному выводу "что быстрее"

Код: sql
1.
2.
select ... into #t from ...;
alter table #t add primary key (...) 



Код: sql
1.
2.
insert #t with(tablockx) (...)
select ... from ... order by ...



Но второй вариант сильно проигрывает по необходимости явно писать
Код: sql
1.
create table #t( поля...)
...
Рейтинг: 0 / 0
Кластерный индекс до или после.
    #40076078
Кесарь
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kolu4ka
Дилетантский вопрос.
Создаем временную таблицу на которую нужен кластерный индекс, записей будет пусть 50к
По производительности лучше кластерный индекс до вставки создать или после?

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


На этот вопрос есть только один строгий ответ: смотрите время выполнения в том и другом случаях и сравнивайте планы выполнения.


Что же касается рекомендаций вообще, то имейте ввиду, что создание индекса на временной таблице - это DDL операция. Из-за которой меняется схема данных. И код процедуры будет перекомпилирован. Это не всегда плохо, но надо иметь это в виду.

Поэтому если вы хотите избежать перекомпиляций, делайте объявление индекса внутри объявления временной таблицы, а не отдельной командой. И само собой в самом начале процедуры. Если вы не уверены на счёт перекомпиляций, то делайте так, чтобы их избежать, всегда.
...
Рейтинг: 0 / 0
Кластерный индекс до или после.
    #40076079
Кесарь
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aleks222
Kolu4ka

Конечный вывод делаю для себя такой, если в свою таблицу я заливаю все данные одним insert(одна интерация) и дальнейшие операции с таблицей будут только по кластерному полю, то имеет смысл создавать кластерный индекс сначала и использовать tablock при вставке.


Вот скока не мучился - так и не пришел к однозначному выводу "что быстрее"

Код: sql
1.
2.
select ... into #t from ...;
alter table #t add primary key (...) 



Код: sql
1.
2.
insert #t with(tablockx) (...)
select ... from ... order by ...



Но второй вариант сильно проигрывает по необходимости явно писать
Код: sql
1.
create table #t( поля...)



В серьёзных компаниях такой вопрос даже не стоит. Все поля всегда должны быть описаны явно.
...
Рейтинг: 0 / 0
Кластерный индекс до или после.
    #40076081
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алекс прав, особой разницы в производительности нет, но пространства в базе, я предполагаю, будет затрачено больше в случае "перелива". Если добавление записей происходит не одной командой, то выгоднее по времени будет вариант с финальным созданием кластерного индекса.
...
Рейтинг: 0 / 0
Кластерный индекс до или после.
    #40076083
Кесарь
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kolu4ka
Да, еще вопросик, если при работе с такой таблицей мне понадобится удалять записи, правильнее сделать поле для признака удаления и update его, что бы таблица не перестраивалась? Или можно сразу удалять? К примеру для удаления 10 из 50 тыс.


Это зависит от многих обстоятельств. От размера таблицы и загрузки сервера например. Если у вас многие миллионы записей, то было бы неплохо такую таблицу уменьшить.

Если очистка памяти не является необходимой, то лучше не удалять, а делать дополнительное поле и по нему индекс.
...
Рейтинг: 0 / 0
Кластерный индекс до или после.
    #40076084
Кесарь
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владислав Колосов
Алекс прав, особой разницы в производительности нет, но пространства в базе, я предполагаю, будет затрачено больше в случае "перелива". Если добавление записей происходит не одной командой, то выгоднее по времени будет вариант с финальным созданием кластерного индекса.


Одно мне тут непонятно: а зачем тогда создавать именно кластерный индекс?
...
Рейтинг: 0 / 0
Кластерный индекс до или после.
    #40076095
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кесарь

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


Удивительное дело.
А шо select ... into #t "неописывает поля"?
Вроде все однозначно описывается из исходных таблиц.
Более того, если базовые таблицы переопределены - не надо метаться по процедурам, правя определения времянок.
...
Рейтинг: 0 / 0
Кластерный индекс до или после.
    #40076102
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кесарь
Что же касается рекомендаций вообще, то имейте ввиду, что создание индекса на временной таблице - это DDL операция. Из-за которой меняется схема данных. И код процедуры будет перекомпилирован. Это не всегда плохо, но надо иметь это в виду.

Поэтому если вы хотите избежать перекомпиляций, делайте объявление индекса внутри объявления временной таблицы, а не отдельной командой. И само собой в самом начале процедуры. Если вы не уверены на счёт перекомпиляций, то делайте так, чтобы их избежать, всегда.
Описанное сильно устарело, причем уже давно.
https://sqlperformance.com/2017/05/sql-performance/sql-server-temporary-object-caching
...
Рейтинг: 0 / 0
Кластерный индекс до или после.
    #40076118
Кесарь
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
invm
Кесарь
Что же касается рекомендаций вообще, то имейте ввиду, что создание индекса на временной таблице - это DDL операция. Из-за которой меняется схема данных. И код процедуры будет перекомпилирован. Это не всегда плохо, но надо иметь это в виду.

Поэтому если вы хотите избежать перекомпиляций, делайте объявление индекса внутри объявления временной таблицы, а не отдельной командой. И само собой в самом начале процедуры. Если вы не уверены на счёт перекомпиляций, то делайте так, чтобы их избежать, всегда.
Описанное сильно устарело, причем уже давно.
https://sqlperformance.com/2017/05/sql-performance/sql-server-temporary-object-caching


Немного не понял, что из написанного мной устарело, если по ссылке ровно оно самое?

"To be cached, a temporary object additionally must not:
Perform "DDL" after object creation"

"Be sure to meet the conditions for temporary table caching, which most often means not creating indexes or statistics after the initial table creation statement. This is made more convenient from SQL Server 2014 onward due to the introduction of the INDEX clause of the CREATE TABLE statement."
...
Рейтинг: 0 / 0
Кластерный индекс до или после.
    #40076120
Кесарь
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aleks222
Кесарь

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


Удивительное дело.
А шо select ... into #t "неописывает поля"?
Вроде все однозначно описывается из исходных таблиц.
Более того, если базовые таблицы переопределены - не надо метаться по процедурам, правя определения времянок.


Возможность переопределения базовых таблиц как бы ведёт к тому, что схема данных нестабильна. А значит будет перекомпиляция. Т.е. select into это DML и DDLв одном флаконе. Именно поэтому этого и нужно избегать.
...
Рейтинг: 0 / 0
Кластерный индекс до или после.
    #40076122
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кесарь
aleks222
пропущено...


Удивительное дело.
А шо select ... into #t "неописывает поля"?
Вроде все однозначно описывается из исходных таблиц.
Более того, если базовые таблицы переопределены - не надо метаться по процедурам, правя определения времянок.


Возможность переопределения базовых таблиц как бы ведёт к тому, что схема данных нестабильна. А значит будет перекомпиляция. Т.е. select into это DML и DDLв одном флаконе. Именно поэтому этого и нужно избегать.


Я ЗА!
Только вот эти скотины-пользователи...

ЗЫ. Может хватит вещать прописные лозунги?
...
Рейтинг: 0 / 0
Кластерный индекс до или после.
    #40076131
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кесарь,

Процедуры уже давно не перекомпилируются. Перекомпилируются инструкции в процедуре.
Какие именно и как это зависит от кешируемости временных объектов можете посмотреть выполнив указанный ниже простой пример с отслеживанием SQL:StmtRecompile
Код: 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.
use tempdb;
set ansi_nulls, quoted_identifier, xact_abort on;
go

create procedure dbo.p1
as
begin
 declare @c int;
 select @c = count(*) from master.dbo.spt_values;

 create table #p1 (a int not null primary key clustered, b int);
 select @c = checksum_agg(checksum(*)) from #p1 where a = 10;
end;
go

create procedure dbo.p2
as
begin
 declare @c int;
 select @c = count(*) from master.dbo.spt_values;

 create table #p2 (a int not null, b int);
 alter table #p2 add primary key clustered (a);
 select @c = checksum_agg(checksum(*)) from #p2 where a = 10;
end;
go

exec dbo.p1;
exec dbo.p1;
go

exec dbo.p2;
exec dbo.p2;
go

drop procedure dbo.p1, dbo.p2;
go
...
Рейтинг: 0 / 0
Кластерный индекс до или после.
    #40076430
Фотография StarikNavy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kolu4ka,

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


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