Гость
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / При вставки строк в таблицы dbo.table VS #table / 13 сообщений из 13, страница 1 из 1
16.04.2021, 00:24
    #40062919
Focha
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
При вставки строк в таблицы dbo.table VS #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.
SET NOCOUNT ON;


-- физ таблиц
drop table dbo.test
create table dbo.test(a int not null)

declare @i as int = 1;

while @i < 10000
begin
	
	insert into dbo.test values(@i)
	set @i = @i + 1

end



-- врем таблица
drop table #test
create table #test(a int not null)


declare @i as int = 1;

while @i < 10000
begin
	
	insert into #test values(@i)
	set @i = @i + 1

end


План запроса у них один, почему вставка во временную таблицу быстрее, из-за статистики или из-за записи на диск?
Если вставку в физ таблицу сделать с помощью транзакции, скорость получаем похожую при вставки во временную

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
-- физ таблиц
begin tran

drop table dbo.test
create table dbo.test(a int not null)

declare @i as int = 1;

while @i < 10000
begin
	
	insert into dbo.test values(@i)
	set @i = @i + 1

end

COMMIT
...
Рейтинг: 0 / 0
16.04.2021, 02:51
    #40062931
felix_ff
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
При вставки строк в таблицы dbo.table VS #table
Focha,

модель восстановления в базе какая?
...
Рейтинг: 0 / 0
16.04.2021, 08:43
    #40062948
alexeyvg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
При вставки строк в таблицы dbo.table VS #table
Focha
Если вставку в физ таблицу сделать с помощью транзакции, скорость получаем похожую при вставки во временную
Всегда так было.
При коммите транзакции выполнение продолжается после физической записи лога на диск (точнее, когда контроллер скажет, что запись в лог состоялась). Соответственно, без общей транзакции будет ожидание на каждую записанную строку.
А при записи во временную таблицу запись в лог кешируется.
...
Рейтинг: 0 / 0
16.04.2021, 08:44
    #40062949
alexeyvg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
При вставки строк в таблицы dbo.table VS #table
felix_ff
Focha,

модель восстановления в базе какая?
От модели такое поведение не зависит.
...
Рейтинг: 0 / 0
16.04.2021, 08:55
    #40062951
Focha
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
При вставки строк в таблицы dbo.table VS #table
alexeyvg
Focha
Если вставку в физ таблицу сделать с помощью транзакции, скорость получаем похожую при вставки во временную
Всегда так было.
При коммите транзакции выполнение продолжается после физической записи лога на диск (точнее, когда контроллер скажет, что запись в лог состоялась). Соответственно, без общей транзакции будет ожидание на каждую записанную строку.
А при записи во временную таблицу запись в лог кешируется.

Логи отключить можно как-то на конкретную схему? БД не OLTP, да и вообще используется для расчетов
...
Рейтинг: 0 / 0
16.04.2021, 09:43
    #40062958
архивариус
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
При вставки строк в таблицы dbo.table VS #table
Focha,

ALTER DATABASE ... SET DELAYED_DURABILITY = FORCED
...
Рейтинг: 0 / 0
16.04.2021, 09:48
    #40062959
invm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
При вставки строк в таблицы dbo.table VS #table
Focha,

Ваш скрипт выполняется в режиме autocommit. Т.е. каждый insert - отдельная транзакция.
В обычной БД по commit происходит сброс буфера ЖТ на диск.
Но tempdb - специальная БД и в ней по coommit ничего на диск не сбрасывается.

Отсюда и разница в скорости.
...
Рейтинг: 0 / 0
16.04.2021, 09:48
    #40062960
Focha
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
При вставки строк в таблицы dbo.table VS #table
архивариус
Focha,

ALTER DATABASE ... SET DELAYED_DURABILITY = FORCED

спасибо, да теперь вставка в физическую таблицу ускорилась.
...
Рейтинг: 0 / 0
16.04.2021, 11:21
    #40062980
alexeyvg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
При вставки строк в таблицы dbo.table VS #table
Focha
архивариус
Focha,

ALTER DATABASE ... SET DELAYED_DURABILITY = FORCED

спасибо, да теперь вставка в физическую таблицу ускорилась.
Что, прям на проде? :-)
...
Рейтинг: 0 / 0
16.04.2021, 13:15
    #40063029
Владислав Колосов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
При вставки строк в таблицы dbo.table VS #table
авторSET DELAYED_DURABILITY = FORCED

Сурово! Надеюсь, база маловажная?
...
Рейтинг: 0 / 0
16.04.2021, 17:04
    #40063117
Focha
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
При вставки строк в таблицы dbo.table VS #table
alexeyvg
Что, прям на проде? :-)
не OLTP
Владислав Колосов
Сурово! Надеюсь, база маловажная?
да

Пользователи загружают данные из Экселей и потом запускают расчет и получают результат.
Если сервер отключится, заново загрузят.
...
Рейтинг: 0 / 0
16.04.2021, 18:46
    #40063153
Владислав Колосов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
При вставки строк в таблицы dbo.table VS #table
Focha,

в таком случае, если позволяют ресурсы памяти, можно использовать InMemory таблицы с durability = schema_only, вставка будет ещё быстрее. Такие таблицы в журнал ничего не пишут.
...
Рейтинг: 0 / 0
16.04.2021, 21:58
    #40063203
alexeyvg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
При вставки строк в таблицы dbo.table VS #table
Focha
alexeyvgЧто, прям на проде? :-)
не OLTP Тут важно не "OLTP/не OLTP", а то, можете вы базу потерять, или нет.

Focha
Если сервер отключится, заново загрузят.
Загрузят - это создадут с нуля, или восстановят из бакапа? Учтите ,что она может быть необратимо порушена, не получится взять и загрузить туда данные.
Тогда да, установить SET DELAYED_DURABILITY = FORCED - хорошее решение.
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / При вставки строк в таблицы dbo.table VS #table / 13 сообщений из 13, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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