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

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

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

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

13.12.2007, 22:47. Просмотров 1257. Ответов 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рит?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.12.2007, 22:47
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Ускорение программы: сравнивание 4-х столов с пятым (C++):

ускорение времени выполнения программы - C++
здравствуйте. решал олимпиадную задачу: ...Он берет произвольное положительное число А и выписывает на доске арифметическую прогрессию...

Объединить массивы в один, включив второй между пятым и шестым элементами - C++
Ввести с клавиатуры два одномерных массива содержащих 10 и 5 элементов. Объединить их в один массив, включив второй между пятым и шестым...

Сформировать вещественную матрицу, вставив в исходную новый столбец между пятым и шестым - C++
Помогите пожалуйста решить задачу : Даны вещественные числа a1, a2, …, an и вещественная квадратная матрица порядка n (n > 5)....

Сравнивание 3-х чисел - C++
Как сравнить 3 числа в с++,и вывести на экран число которое из них больше,если не сложно объясните

Сравнивание указателей - C++
Нужно подсчитать количество символов до определенной позиции, включительно, указатель на которую - begin_symbol начало подсчета с позиции...

Сравнивание строк - C++
Всем привет. В программу у меня вводится слово, заранее длинна слова не известна. Мне нужно проверить количество согласных в этом слове и...

10
pwa
0 / 0 / 0
Регистрация: 04.11.2007
Сообщений: 35
17.12.2007, 11:08 #2
Над бы сообщит сервыровку стол - прымер SQL
0
sardinka
0 / 0 / 0
Регистрация: 13.12.2007
Сообщений: 87
17.12.2007, 19:50  [ТС] #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.
0
pwa
0 / 0 / 0
Регистрация: 04.11.2007
Сообщений: 35
18.12.2007, 10:45 #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, а не делать это в своей программе.
0
sardinka
0 / 0 / 0
Регистрация: 13.12.2007
Сообщений: 87
18.12.2007, 16:37  [ТС] #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
0
pwa
0 / 0 / 0
Регистрация: 04.11.2007
Сообщений: 35
20.12.2007, 11:50 #6
Извиняюсь, мой уровень владения SQL не позволяет дать рекомендации по решению задачи, а времени на эксперименты сейчас нет..
Могу только посоветовать отработать сложные запросы на SQL-консоли (программа, кот. позволяет подключиться к SQL-серверу и выполнять запросы с клавиатуры), затем отработанные решения перенести в программу.
SQL-консоль должна быть в составе Вашей СУБД (типа Interactive SQL, SQL Explorer и т.п.)
0
boombastik
7 / 7 / 0
Регистрация: 13.02.2007
Сообщений: 1,255
20.12.2007, 12:21 #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, но по идее должен работать и для других СУБД)

Удачи, Владимир
0
sardinka
0 / 0 / 0
Регистрация: 13.12.2007
Сообщений: 87
20.12.2007, 17:01  [ТС] #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
0
boombastik
7 / 7 / 0
Регистрация: 13.02.2007
Сообщений: 1,255
20.12.2007, 17:21 #9
Это уже хорошо, теперь определимся с задачей...
Пока что все что мне приходит на ум из того что здесь было написано/описано - это то, что задача следующего плана:
Есть пять таблиц и необходимо синхронизировать их так, чтобы в них оставались только те записи, ссылки на которую существуют во всех таблицах... И судя по всему есть мастер таблица - остальные 4 содержат ID и num с сылками Foreign Key на пятую... Это верно?

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

Желаю удачи, уверен, что она тебе пригодится, Владимир.
0
sardinka
0 / 0 / 0
Регистрация: 13.12.2007
Сообщений: 87
20.12.2007, 19:27  [ТС] #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
0
boombastik
7 / 7 / 0
Регистрация: 13.02.2007
Сообщений: 1,255
30.12.2007, 14:02 #11
Есть несколько уровней оптимизации решения использующего реляционную базу данных:
1) Оптимизация на уровне SQL
2) Использование средств оптимимизации предоставляемые СУБД такие как индексы и пр.
3) Оптимизация на уровне модели данных - можно поменять структуру с расчетом на производительность, даже если это идет во вред 3-й или еще какой нормальной форме. (Например, создать вместо четырех одну таблицу)
4) Поменять СУБД - радикально, но что делать SQL Server на Oracle...

Удачи, Владимир
0
30.12.2007, 14:02
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.12.2007, 14:02
Привет! Вот еще темы с ответами:

сравнивание строк - C++
Здравствуйте. Обьясните пожалуйста чайнику, почему я немогу сравнить строку вот так: #include &lt;iostream&gt; using namespace std; ...

Сравнивание CLASS1* с CLASS2 - C++
есть вектор указателей CLASS1 и мне нужно функцией std::find найти нужный указатель делаю так: find( v.begin(), v.end(), CLASS2( 3, 4 )...

Сравнивание и присоединение строк - C++
Присоединение, проблема в том, как вывести результат присоединения: #include&lt;stdio.h&gt; #include&lt;string.h&gt; #include&lt;alloc.h&gt; void...

сравнивание двух чисел - C++
Написать функцию, которая сравнивает два целых числа и возвращает результат сравне-ния в виде одного из знаков: &gt;, &lt; или =.


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Опции темы

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