Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 почему Merge логируется по-полной?  [new]
.
Guest
имеем:
Minimal logging for this statement has the following requirements:
The recovery model of the database is set to simple or bulk-logged.
The target table is an empty or nonempty heap.
The target table is not used in replication.
The TABLOCK hint is specified for the target table.

Rows that are inserted into a heap as the result of an insert action in a MERGE statement may also be minimally logged.

создаю все требуемые условия: база в симпле, куча, вставляю с TABLOCK (999 rows) и вставка минимально логируется.
теперь делаю MERGE, тоже с TABLOCK,
логирует по-полной.
в чем подвох?

+
CREATE DATABASE mlog ON  PRIMARY 
( NAME = N'mlog', FILENAME = N'c:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\DATA\mlog.mdf' , SIZE = 2048KB , FILEGROWTH = 1024KB )
 LOG ON 
( NAME = N'mlog_log', FILENAME = N'c:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\DATA\mlog_log.ldf' , SIZE = 4mb , FILEGROWTH = 4mb)
GO

ALTER DATABASE mlog
SET RECOVERY SIMPLE
GO
------------------------------------
create table t_source (c1 int, c2 int, c3 char (100), c4 char(1000))
go

declare @i int
select @i = 1
while (@i < 1000)
begin
            insert into t_source values (@i, @i+10000, 'aaa', 'bbb')
            select @i= @i + 1
end
-------------------------------------
create table t_heap (c1 int, c2 int, c3 char(100), c4 char(1000))
go
------------------------------------

insert into t_heap with (TABLOCK) 
select * from t_source
go

--и да, минимально залогировалось!

create table t_source2 (c1 int, c2 int, c3 char (100), c4 char(1000))
go

declare @i int
select @i = 1
while (@i < 1000)
begin
            insert into t_source2 values (@i, @i+30000, 'aaa', 'bbb')
            select @i= @i + 1
end
-----------------------------------
MERGE t_heap with (TABLOCK) AS target
USING (SELECT c1, c2, c3, c4 from t_source2) AS source (c1, c2, c3, c4)
ON (target.c2 = source.c2)
WHEN MATCHED THEN 
    UPDATE SET c3 = source.c3
WHEN NOT MATCHED THEN	
    INSERT (c1, c2, c3, c4)
    values( source.c1, source.c2,source.c3, source.c4);

--логирует полностью, хоть и вставляются те же 999 строк
22 янв 13, 15:47    [13810315]     Ответить | Цитировать Сообщить модератору
 Re: почему Merge логируется по-полной?  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37050
А где в статье про минимальное логирование написано что-то про merge?
22 янв 13, 15:52    [13810354]     Ответить | Цитировать Сообщить модератору
 Re: почему Merge логируется по-полной?  [new]
.
Guest
Гавриленко Сергей Алексеевич,

[url=http://msdn.microsoft.com/en-us/library/dd425070%28v=sql.100%29.aspx
]например тут[/url]

MERGE

The Transact-SQL MERGE command offers minimal logging of the inserted rows. Unless you run MERGE on a heap, this minimal logging ability will only be used if trace flag 610 is enabled.

еще и таблица там же, где сказано, что и без флага, в куче, будет минимально логироваться.
22 янв 13, 15:56    [13810405]     Ответить | Цитировать Сообщить модератору
 Re: почему Merge логируется по-полной?  [new]
.
Guest
Microsoft SQL Server 2008 R2 (SP2) - 10.50.4000.0 (Intel X86) Jun 28 2012 08:42:37 Copyright (c) Microsoft Corporation Express Edition on Windows NT 5.1 <X86> (Build 2600: Service Pack 3)

версия позволяет,
и вон же, с инсертом на 1000 строк катит.
даже на 500.
на 250 не хочет.
все с TABLOCK, без него да, не хочет.
22 янв 13, 15:59    [13810427]     Ответить | Цитировать Сообщить модератору
 Re: почему Merge логируется по-полной?  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37050
И даже флаг 610 включен?
22 янв 13, 16:17    [13810603]     Ответить | Цитировать Сообщить модератору
 Re: почему Merge логируется по-полной?  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37050
Хотя для кучи, походу, не надо флаг.
22 янв 13, 16:19    [13810622]     Ответить | Цитировать Сообщить модератору
 Re: почему Merge логируется по-полной?  [new]
.
Guest
...и с флагом 610 тоже все логирует
22 янв 13, 16:34    [13810755]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить