Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 change tracking performance  [new]
-Олег-
Member

Откуда:
Сообщений: 2
Добрый день! Подскажите пожалуйста, может быть, кто-нибудь сталкивался.
Возникла такая проблема. Есть необходимость синхронизировать одну таблицу на сервере и на клиентах, при этом каждому клиенту будет доступна только та часть записей, в которых прописан их clientid. Причём синхронизация должна быть достаточно быстрой - желательно сотни синхронизаций в секунду. Сами клиенты запускают синхронизацию довольно редко, но клиентов очень много. Исходя из описания синк фреймворка 2:
Microsoft
Performance Improvements: The new database providers in this release have been thoroughly tested in large-scale scenarios in which a single server supports thousands of clients with hundreds of concurrent synchronization operations. This testing resulted in a large number of internal performance improvements that enable Sync Framework database providers to perform as well as other Microsoft technologies like Remote Data Access (RDA) while offering a wide range of capabilities that compete with end-to-end solutions like merge replication.

задача обеспечить сотни синков не выглядит такой уж нереальной.
Первое, что нужно сделать - написать тесты производительности для такой задачи.
Изначально предполагалось делать всё на sync framework + change tracking, и даже сделал всю логику для теста, сделал передачу данных через WCF, но по причине того, что пример работал очень медленно, убрал транспорт, сделал всё тестирование на одной машине, однако и это не помогло.
Тогда решил зайти с другой стороны, убрал MSF, сделал всё чисто на скриптах и change tracking.
Скорость работы, конечно, быстрее, но совсем не то, что хотелось бы. Но даже не это главное. Самое странное то, что скорость сначала вроде достигает 150 синков в секунду, но через 10 минут падает до 30 синков, а потом и ещё ниже. Почему это происходит?
То же самое и при использовании MSF, только там падает со 120 до 2 синков :-O в секунду.
Пример простейший, очень удивляет, почему так медленно работает...

В тесте работает одновременно 5 клиентов, они безостановочно работают в цикле:
- добавил одну запись в таблицу
- синхронизация
- удалил запись из таблицы

Скрипты работают вот такие:

create database rawtest
go
use rawtest

alter database rawtest set single_user with rollback immediate
alter database rawtest set read_committed_snapshot on
alter database rawtest set allow_snapshot_isolation on
alter database rawtest set multi_user

alter database rawtest set change_tracking = on
(change_retention = 2 hours, auto_cleanup = on)

create table servertable (
[id] int not null,
[clientid] int not null,
[body] nvarchar(50) null,
constraint pk_servertable primary key (
[id] asc,
[clientid] asc
))

create procedure querychanges_servertable (
@lastversion bigint,
@ignoredcontext varbinary(128),
@clientid int
)
as
begin

select
ct.id,
tbl.body,
ct.sys_change_version as version,
ct.sys_change_creation_version as createversion,
ct.sys_change_operation as operation
from changetable(changes servertable, @lastversion) ct
left outer join servertable tbl
on tbl.[id] = ct.[id] and tbl.clientid = ct.clientid
where (ct.sys_change_context is null or ct.sys_change_context <> @ignoredcontext) and ct.clientid = @clientid

end

на клиенте таблица и скрипт такие же, только нет поля clientid.
26 ноя 09, 23:24    [7984992]     Ответить | Цитировать Сообщить модератору
 Re: change tracking performance  [new]
-Олег-
Member

Откуда:
Сообщений: 2
И вот ещё что интересно: судя по профайлеру, вызов querychanges_clienttable является причиной тормозов - то есть сперва он в пределах 7мс, а когда включаются тормоза, то этот же вызов занимает уже 400мс. Но я смотрю на этот вызов и не вижу ничего в нём такого особенного.
27 ноя 09, 05:02    [7985237]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить