Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Как быстро сравнить 2 датасета?  [new]
Новичок111
Guest
День добрый!

Задача следующая: есть некая конфигурация в БД (SQL 2000) одна табличка (на самом деле их несколько, но это только для нормализации) размером порядка 30000 записей. И есть XML файл, откуда эта конфигурация изначально появляется.
На старте системы, XML файл читается и нужно по сути сделать merge того, что есть в файле и в БД (то, что есть в XML нужно предоставить для текущей работы, а что было использовать при показе уже собранных данных).
Критерей для мержа таков - если набор определенных полей совпадает, то элемент считается идентичным существующему, иначе он записыватеся в базу как новый элемент.
Клиент на .Net. Сейчас написал по простому - читаем все из БД в датасет, из XML - тоже, а затем построчно ищем строчку из XML в таблице из БД и выполняем соотв. действие. НО получается очень медленно (около 3 минут).

Есть ли решения, чтобы ускорить такую задачу?
22 июл 04, 08:56    [826175]     Ответить | Цитировать Сообщить модератору
 Re: Как быстро сравнить 2 датасета?  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
Можно распарсить XML документ прямо на сервере в какую-нибудь табличку (напрмер во временную), а потом уже сделать изменения тех строк, которые не совпадают и вставку отсутствующих. Всё это, есссно, завернуть в ХП. Её то с клиента и пинать. ИМХО.
22 июл 04, 09:18    [826225]     Ответить | Цитировать Сообщить модератору
 Re: Как быстро сравнить 2 датасета?  [new]
andsm
Member

Откуда: Москва
Сообщений: 1319
Блог
Отсортируй по одному из полей, лучше всего по первичному ключу. Метод DataTable.Sort(). Идем по одному из датасетов, смотрим соответствующую запись в другом датасете. Поиск будет с использованием индекса, должно работать быстрее.
22 июл 04, 09:19    [826233]     Ответить | Цитировать Сообщить модератору
 Re: Как быстро сравнить 2 датасета?  [new]
GreenSunrise
Member

Откуда:
Сообщений: 12310
Мне кажется, tpg прав. Надо распарсить XML в таблицу и сделать пару селектов:

create table t1 (
    id int not null unique,
    f1 int
)
go
create table t2 (
    id int not null unique,
    f1 int
)
go
insert into t1 (id, f1) values (1, 1)
insert into t1 (id, f1) values (2, 2)
insert into t1 (id, f1) values (3, 3)

insert into t2 (id, f1) values (2, 2)
insert into t2 (id, f1) values (3, 1)
insert into t2 (id, f1) values (4, 5)
go

-- new data

select t2.* from t2 left outer join t1 on t2.id = t1.id where t1.id is null -- changed data
select * from t1 inner join t2 on t1.id = t2.id where t1.f1 <> t2.f1 id f1 ----------- -----------
4 5 id f1 id f1 ----------- ----------- ----------- -----------
3 3 3 1

Это пример для случая, когда у вас есть уникальный ключ для идентификации строк. Если его нет, то вместо сравнения t1.id = t2.id надо писать суммарное сравнение тех полей, которые уникальным образом идентифицируют запись:
t1.a = t2.a and t1.b = t2.b and ...

Скорость работы должна быть явно выше построчного прохождения.
22 июл 04, 11:13    [826697]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить