Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.90
sardinka
0 / 0 / 0
Регистрация: 13.12.2007
Сообщений: 87
#1

Ускорение программы: сравнивание 4-х столов с пятым - C++

13.12.2007, 22:47. Просмотров 1234. Ответов 10
Метки нет (Все метки)

У меня естъ прoгрaмa кoтoрaя связaнa с SQL .Oнa делaет селект из 4 стoлoв и срaвнивaет с 5 стoлoм. Если в 5 стoле естъ тaкaя-же инфoрмaция кaк и в предудыщих 4 ,тo идет нa следющую стрoкы. Если нет тo удaляет вo всех четырех стoлaх. Oнa рaбoтaет oченъ медленнo, кaк ее ускoрит?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
pwa
0 / 0 / 0
Регистрация: 04.11.2007
Сообщений: 35
17.12.2007, 11:08     Ускорение программы: сравнивание 4-х столов с пятым #2
Над бы сообщит сервыровку стол - прымер SQL
sardinka
0 / 0 / 0
Регистрация: 13.12.2007
Сообщений: 87
17.12.2007, 19:50  [ТС]     Ускорение программы: сравнивание 4-х столов с пятым #3
Eto moi linii coda v C++:
dbcmd (dbproc_get1, 'select * from prov ');
dbfcmd(dbproc_get1, 'where num = '%d' and id = '%s'', num, id);
dbsqlexec (dbproc_get1);
Y menya v table okolo 1500000 recordov.
pwa
0 / 0 / 0
Регистрация: 04.11.2007
Сообщений: 35
18.12.2007, 10:45     Ускорение программы: сравнивание 4-х столов с пятым #4
У меня естъ прoгрaмa кoтoрaя связaнa с SQL .Oнa делaет селект из 4 стoлoв и срaвнивaет с 5 стoлoм. Если в 5 стoле естъ тaкaя-же инфoрмaция кaк и в предудыщих 4 ,тo идет нa следющую стрoкы. Если нет тo удaляет вo всех четырех стoлaх. Oнa рaбoтaет oченъ медленнo, кaк ее ускoрит?


Eto moi linii coda v C++:
dbcmd (dbproc_get1, 'select * from prov ');
dbfcmd(dbproc_get1, 'where num = '%d' and id = '%s'', num, id);
dbsqlexec (dbproc_get1);
Y menya v table okolo 1500000 recordov.

Я не совсем понял детали постановки задачи, поэтому ограничусь общими рекомендациями.
0. Естественно, что перебрать 1.5млн записей 1.5млн раз не всякому ПК под силу.
1. Думаю, нужно подготовить SQL-оператор, который вибирает из всех пяти таблиц те комбинации, которые не удовлетворяют Вашим условиям, и выполнить по полученной информации требуемые действия.
Поясню на примере.
Имеем две таблицы - Tbl1(id, val) и Tbl1(id1, val1).
Необходимо обновить Tbl1.val1 по соответствующей инф-и из Tbl.
SELECT Tbl1.id1 FROM Tbl1,Tbl2 WHERE Tbl1.id=Tbl2.id1 and
Tbl1.val<>Tbl2.val1;
Этот оператор сообщит нам список id1, по которым нужно выполнить необходимые действия.
Естественно, можно переделать этот оператор так, что эти действия сразу и будут выполнены (не очень силен в синтаксисе SQL, м.б. и ошибусь):
UPDATE Tbl2 SET Tbl2.val=Tbl1.val WHERE Tbl1.id=Tbl2.id1 and
Tbl1.val<>Tbl2.val1;

Короче, идея - переложить какую-либо работу на плечи SQL, а не делать это в своей программе.
sardinka
0 / 0 / 0
Регистрация: 13.12.2007
Сообщений: 87
18.12.2007, 16:37  [ТС]     Ускорение программы: сравнивание 4-х столов с пятым #5
Ya obyasnu bolee podrobno sadachy:
Ya vubirau is 1-go stola record. Esli sootvetstvyuzhii record naiden v ostalnuh 4 tables(osnovuvayac na NUM i ID)to moya programa idet na sledyuzhii record (s 1-go stola), esli ne nashla sootvetstvyishii record to ydali so vseh stolov etot record (osnovuvayac na NUM i ID)i idi na sledyishiy record is 1-go stola. Toest programa perebiraet vce record v 1-om table. Bolee ponytno? Podskashite kak ee yskorit ili est kakie libo drygie predlosheniya.
Spasibo
pwa
0 / 0 / 0
Регистрация: 04.11.2007
Сообщений: 35
20.12.2007, 11:50     Ускорение программы: сравнивание 4-х столов с пятым #6
Извиняюсь, мой уровень владения SQL не позволяет дать рекомендации по решению задачи, а времени на эксперименты сейчас нет..
Могу только посоветовать отработать сложные запросы на SQL-консоли (программа, кот. позволяет подключиться к SQL-серверу и выполнять запросы с клавиатуры), затем отработанные решения перенести в программу.
SQL-консоль должна быть в составе Вашей СУБД (типа Interactive SQL, SQL Explorer и т.п.)
boombastik
7 / 7 / 0
Регистрация: 13.02.2007
Сообщений: 1,255
20.12.2007, 12:21     Ускорение программы: сравнивание 4-х столов с пятым #7
Напиши хранимую процедуру - тогда не придется гонять кучу записей через соединение с БД.

С другой сороны, если бы знать еще, что такое стол и что содержиться в этом столе, то может быть задачу можно было бы пересмотреть... например,
DELETE FROM tbl1 WHERE NOT EXISTS (SELECT tbl2.id FROM tbl2, tbl3, tbl4, tbl5 WHERE tbl2.id = tbl1.id AND tbl3.id = tbl1.id AND tbl4.id = tbl1.id AND tbl5.id = tbl1.id)

Но я не уверен, что могу рекомендовать этот SQL, так как задача действительно очень темная (синтаксис SQL - Oracle, но по идее должен работать и для других СУБД)

Удачи, Владимир
sardinka
0 / 0 / 0
Регистрация: 13.12.2007
Сообщений: 87
20.12.2007, 17:01  [ТС]     Ускорение программы: сравнивание 4-х столов с пятым #8
Eto moya sp kototyu ya putalas sdelat na SQL:
DECLARE @num int, @id varchar(10)
declare @row_count int
SET @row_count = 0
DECLARE c1 CURSOR FOR
SELECT distinct num ,id FROM table1
OPEN c1
FETCH NEXT FROM c1 INTO @num , @id
WHILE @@FETCH_STATUS = 0
BEGIN
SET @row_count = @row_count + 1
print 'row count:' + convert(varchar,@row_count)
if NOT EXISTS (select * from table2 t1
inner join table3 t3 on t1.id=t3.id and t1.num =t3.num
inner join table4 t4 on t1.id=t4.id and t1.num =t4.num
Where t1.num =@num and t1.id=@id)
begin

PRINT 'Deleted id:' + @id + ' ' + convert(varchar,@num )
delete from table3 where num =@num and id=@id
delete from table2 where num =@num and id=@id
delete from table4 where num =@num and id=@id
delete from table1 where num =@num and id=@id
end
FETCH NEXT FROM c1 INTO @num , @id
END
CLOSE c1
DEALLOCATE c1
boombastik
7 / 7 / 0
Регистрация: 13.02.2007
Сообщений: 1,255
20.12.2007, 17:21     Ускорение программы: сравнивание 4-х столов с пятым #9
Это уже хорошо, теперь определимся с задачей...
Пока что все что мне приходит на ум из того что здесь было написано/описано - это то, что задача следующего плана:
Есть пять таблиц и необходимо синхронизировать их так, чтобы в них оставались только те записи, ссылки на которую существуют во всех таблицах... И судя по всему есть мастер таблица - остальные 4 содержат ID и num с сылками Foreign Key на пятую... Это верно?

Если да, то существует несколько подходов к решению этой задачи.
Но сначала необходимо определиться каких записей больше: 'правильных' - те что существуют во всех таблицах и которые необходимо оставить, или 'неправильных'.
1) Если первых ('правильных') совсем немного, тогда проще всего сделать выборку всех id, которые имеют ссылки во всех пяти таблицах, затем выполнить DELETE FROM tblX WHERE id NOT IN (выборка), или какой там синтаксис поддерживается SQL server'ом. Сначала удалить из дочерних таблиц, потом из мастер.
2) Если противоположная ситуация, то необходимо выполнить синхронизацию от обратного - пример SQL я приводил выше - их тоже необходимо выполнять в последовательности, начиная с дочерних таблиц, а потом из мастер-таблицы.

Желаю удачи, уверен, что она тебе пригодится, Владимир.
sardinka
0 / 0 / 0
Регистрация: 13.12.2007
Сообщений: 87
20.12.2007, 19:27  [ТС]     Ускорение программы: сравнивание 4-х столов с пятым #10
Moya sp eto i delaet, no delaet eto medlenno. Vo vseh table y menya okolo 1,5 mln recordov(kashdui).Osnovuvaya na table 1 (master tabliza) y menya idet delete ili propysti record.
Moya problema v tom cho kak-to mne nyshno eto yskorit'.Ye ne snau kak.
Saranee spasibo
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.12.2007, 14:02     Ускорение программы: сравнивание 4-х столов с пятым
Еще ссылки по теме:

Сравнивание строк C++
C++ Сравнивание строк в структуре
C++ Сравнивание CLASS1* с CLASS2
Сформировать вещественную матрицу, вставив в исходную новый столбец между пятым и шестым C++
ускорение времени выполнения программы C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
boombastik
7 / 7 / 0
Регистрация: 13.02.2007
Сообщений: 1,255
30.12.2007, 14:02     Ускорение программы: сравнивание 4-х столов с пятым #11
Есть несколько уровней оптимизации решения использующего реляционную базу данных:
1) Оптимизация на уровне SQL
2) Использование средств оптимимизации предоставляемые СУБД такие как индексы и пр.
3) Оптимизация на уровне модели данных - можно поменять структуру с расчетом на производительность, даже если это идет во вред 3-й или еще какой нормальной форме. (Например, создать вместо четырех одну таблицу)
4) Поменять СУБД - радикально, но что делать SQL Server на Oracle...

Удачи, Владимир
Yandex
Объявления
30.12.2007, 14:02     Ускорение программы: сравнивание 4-х столов с пятым
Ответ Создать тему
Опции темы

Текущее время: 20:10. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru