CYFROWY BARON • PROGRAMOWANIE • Zobacz wątek - Jak przyspieszyć operacje ?

Jak przyspieszyć operacje ?

Problemy związane z tworzeniem i zarządzaniem programami bazo-danowymi.
Regulamin działu


Zadając pytania dotyczące baz danych należy podawać szczegółowe informacje o bazie danych nad którą się pracuje, czyli:

  • Rodzaj serwera bazodanowego: MySql, MSSQL, Oracle itp.
  • Wersja bazy danych
  • Technologia bazodanowa używana w programie: ADO, DbExpress, InterBase
  • Komponenty użyte do zestawienia połączenia: ADOConnection, SqlConnection
  • Sposób zestawienia komponentów bazodanowych np. DataSet - DataSource - DbGrid lub DataSet - DataSetProvider - ClientDataSet - DataSource - DbGrid
  • Jeżeli używane były biblioteki innych firm niż Borland, CodeGeer i Embarcadero proszę podać ich nazwy, numer wersji i adres źródła.

Jak przyspieszyć operacje ?

Nowy postprzez Pitek » niedziela, 20 października 2013, 20:48

Witam poniżej przedstawiam kod którym łączę się z bazą przeszukuje daną tabele i wykonuje proste operacje.
Problem w tym że bardzo często przeskakuje pomiędzy tabelami i czasem wykonanie bardziej złożonego kodu (tak jak poniżej) ale na 5 tabelach po kolei zajmuje nawet 20 sek.
Czy da rade to jakoś przyspieszyć ? Nie mam zbyt dużej wiedzy na temat baz danych w Builderze. Może powinienem inaczej rozwiązać swój problem, może używać innych komponentów. Proszę o pomoc.
KOD cpp:     UKRYJ  
void ReadWriteMessage(String SectionName, TMemo * Memo, bool Write)
{
        if(Write)
        {
                BaseForm->m_SQLDataSet->CommandText = "SELECT * FROM  tmt_messages";
                BaseForm->m_SQLDataSet->Open();

                for(int i=0;i<BaseForm->m_SQLDataSet->RecordCount;i++)
                {
                        if(BaseForm->m_SQLDataSet->FindField("sekcja")->AsString == SectionName)
                        {
                                BaseForm->SQLQuery->CommandText = "UPDATE tmt_messages SET text = '" + Memo->Lines->Text + "' WHERE sekcja = '" + SectionName + "'";
                                BaseForm->SQLQuery->ExecSQL(true);
                                BaseForm->m_SQLDataSet->Close();
                                return;
                        }
                BaseForm->m_SQLDataSet->Next();
                }
                BaseForm->SQLQuery->CommandText = "INSERT INTO tmt_messages (sekcja) VALUES ('" + SectionName + "')";
                BaseForm->SQLQuery->ExecSQL(true);
                BaseForm->SQLQuery->CommandText = "UPDATE tmt_messages SET text = '" + Memo->Lines->Text + "' WHERE sekcja = '" + SectionName + "'";
                BaseForm->SQLQuery->ExecSQL(true);
        }
        else
        {
                BaseForm->m_SQLDataSet->CommandText = "SELECT * FROM  tmt_messages";
                BaseForm->m_SQLDataSet->Open();

                for(int i=0;i<BaseForm->m_SQLDataSet->RecordCount;i++)
                {
                        if(BaseForm->m_SQLDataSet->FindField("sekcja")->AsString == SectionName)
                        {
                                Memo->Lines->Text =  BaseForm->m_SQLDataSet->FindField("text")->AsString;
                                BaseForm->m_SQLDataSet->Close();
                                return;
                        }
                BaseForm->m_SQLDataSet->Next();
                }
        }
BaseForm->m_SQLDataSet->Close();
}

Przyjmijmy że wykonuje trochę więcej operacji i poruszam się przy tym przechodząc przez 5 różnych tabel wykonanie trwa 20-30 sek.
Baza jest MySQL'owa, używam kontrolek dbExpress.
Komputer służy do tego aby ułatwić Ci pracę, której bez niego w ogóle byś nie miał.
E.Murphy
http://piotrekprogramy.pl
Avatar użytkownika
Pitek
Kreacjusz
Kreacjusz
 
Posty: 290
Dołączył(a): środa, 14 października 2009, 14:53
Lokalizacja: Rybnik/Wrocław
Podziękował : 43
Otrzymał podziękowań: 5
System operacyjny: Win 7 Ultimate 64bit SP1 / Ubuntu 19.04 LTS 64bit
Kompilator: Embarcadero RAD Studio XE2
SKYPE: pitek3010
Gadu Gadu: 7060047
    Windows 7Chrome

Re: Jak przyspieszyć operacje ?

Nowy postprzez Mironas » poniedziałek, 21 października 2013, 10:58

Zamiast pobierać wszystkie rekordy z tabeli ("SELECT * FROM tmt_messages) a potem sprawdzać które spełniają Twój warunek to od razu pobierz tylko te rekordy które cię interesują:
KOD cpp:     UKRYJ  
BaseForm->m_SQLDataSet->CommandText = "SELECT * FROM  tmt_messages WHERE sekcja = '"+SectionName+"'";
 

I już nie musisz sprawdzać:
KOD cpp:     UKRYJ  
//if(BaseForm->m_SQLDataSet->FindField("sekcja")->AsString == SectionName)
 

Za ten post autor Mironas otrzymał podziękowanie od:
Pitek
Avatar użytkownika
Mironas
Programista I
Programista I
 
Posty: 427
Dołączył(a): poniedziałek, 2 stycznia 2012, 19:02
Podziękował : 17
Otrzymał podziękowań: 61
System operacyjny: Windows 10
Kompilator: C++Builder 10.3 Rio
TMS Components Pack
Gadu Gadu: 0
    Windows XPChrome

Re: Jak przyspieszyć operacje ?

Nowy postprzez Pitek » poniedziałek, 21 października 2013, 12:17

Co zrobić kiedy chciałbym pobrać dwie kolumny ? np. sekcja i nazwisko (SectionName i MemberName).
Komputer służy do tego aby ułatwić Ci pracę, której bez niego w ogóle byś nie miał.
E.Murphy
http://piotrekprogramy.pl
Avatar użytkownika
Pitek
Kreacjusz
Kreacjusz
 
Posty: 290
Dołączył(a): środa, 14 października 2009, 14:53
Lokalizacja: Rybnik/Wrocław
Podziękował : 43
Otrzymał podziękowań: 5
System operacyjny: Win 7 Ultimate 64bit SP1 / Ubuntu 19.04 LTS 64bit
Kompilator: Embarcadero RAD Studio XE2
SKYPE: pitek3010
Gadu Gadu: 7060047
    Windows 7Chrome

Re: Jak przyspieszyć operacje ?

Nowy postprzez Mironas » poniedziałek, 21 października 2013, 12:34

SELECT sekcja, nazwisko FROM tabela WHERE warunek

Ale sugerowałbym najpierw poczytać o tworzeniu zapytań SQL i pobawić się nimi zanim zaczniesz pisać pierwszy bazodanowy program. Znajomość zapytań SQL to absolutna konieczność jeśli chcesz napisać program bazodanowy.
Avatar użytkownika
Mironas
Programista I
Programista I
 
Posty: 427
Dołączył(a): poniedziałek, 2 stycznia 2012, 19:02
Podziękował : 17
Otrzymał podziękowań: 61
System operacyjny: Windows 10
Kompilator: C++Builder 10.3 Rio
TMS Components Pack
Gadu Gadu: 0
    Windows XPChrome

Re: Jak przyspieszyć operacje ?

Nowy postprzez Pitek » poniedziałek, 21 października 2013, 13:44

OK, doucze się ale mam pytanie jeszcze tak na szybko. w miejscu warunku co podać jeśli sekcja i nazwisko przechowują coś innego a ja szukam konkretnie jednego wpisu.
Komputer służy do tego aby ułatwić Ci pracę, której bez niego w ogóle byś nie miał.
E.Murphy
http://piotrekprogramy.pl
Avatar użytkownika
Pitek
Kreacjusz
Kreacjusz
 
Posty: 290
Dołączył(a): środa, 14 października 2009, 14:53
Lokalizacja: Rybnik/Wrocław
Podziękował : 43
Otrzymał podziękowań: 5
System operacyjny: Win 7 Ultimate 64bit SP1 / Ubuntu 19.04 LTS 64bit
Kompilator: Embarcadero RAD Studio XE2
SKYPE: pitek3010
Gadu Gadu: 7060047
    Windows 7Chrome

Re: Jak przyspieszyć operacje ?

Nowy postprzez Mironas » poniedziałek, 21 października 2013, 13:52

Wyjaśnij dokładniej bo nie rozumiem. Najlepiej podaj przykład co masz w tabeli a co chcesz dostać w wyniku zapytania.
Avatar użytkownika
Mironas
Programista I
Programista I
 
Posty: 427
Dołączył(a): poniedziałek, 2 stycznia 2012, 19:02
Podziękował : 17
Otrzymał podziękowań: 61
System operacyjny: Windows 10
Kompilator: C++Builder 10.3 Rio
TMS Components Pack
Gadu Gadu: 0
    Windows XPChrome

Re: Jak przyspieszyć operacje ?

Nowy postprzez Pitek » poniedziałek, 21 października 2013, 14:27

Wedle tego SELECT sekcja, nazwisko FROM tabela WHERE warunek, szukam jakiegoś dla "sekcja" i innego dla "nazwisko" w tych kolumnach, jak to napisać w warunku. sekcja = SectionName, nazwisko = MemberName. Tak jakby użyć dwa razy WHERE.
Komputer służy do tego aby ułatwić Ci pracę, której bez niego w ogóle byś nie miał.
E.Murphy
http://piotrekprogramy.pl
Avatar użytkownika
Pitek
Kreacjusz
Kreacjusz
 
Posty: 290
Dołączył(a): środa, 14 października 2009, 14:53
Lokalizacja: Rybnik/Wrocław
Podziękował : 43
Otrzymał podziękowań: 5
System operacyjny: Win 7 Ultimate 64bit SP1 / Ubuntu 19.04 LTS 64bit
Kompilator: Embarcadero RAD Studio XE2
SKYPE: pitek3010
Gadu Gadu: 7060047
    Windows 7Chrome

Re: Jak przyspieszyć operacje ?

Nowy postprzez Mironas » poniedziałek, 21 października 2013, 15:22

Kod: Zaznacz cały
SELECT sekcja, nazwisko
FROM tabela
WHERE
  sekcja = 'Sekcja1'
  and
  nazwisko = 'Kowalski'


Zamiast 'and' może być 'or' - wtedy wystarczy aby tylko jeden warunek był spełniony. Oczywiście warunków może być więcej i można je grupować w nawiasach.
Jest mnóstwo kursów SQL-a, zwłaszcza dla MySQL. Poszukaj, poczytaj.

Za ten post autor Mironas otrzymał podziękowanie od:
Pitek
Avatar użytkownika
Mironas
Programista I
Programista I
 
Posty: 427
Dołączył(a): poniedziałek, 2 stycznia 2012, 19:02
Podziękował : 17
Otrzymał podziękowań: 61
System operacyjny: Windows 10
Kompilator: C++Builder 10.3 Rio
TMS Components Pack
Gadu Gadu: 0
    Windows XPChrome


  • Podobne tematy
    Odpowiedzi
    Wyświetlone
    Ostatni post

Powrót do Bazy danych

Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zalogowanych użytkowników i 1 gość

cron