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

Jak przyspieszyć operacje ?

Nowy postNapisane: niedziela, 20 października 2013, 20:48
przez Pitek
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.

Re: Jak przyspieszyć operacje ?

Nowy postNapisane: poniedziałek, 21 października 2013, 10:58
przez Mironas
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)
 

Re: Jak przyspieszyć operacje ?

Nowy postNapisane: poniedziałek, 21 października 2013, 12:17
przez Pitek
Co zrobić kiedy chciałbym pobrać dwie kolumny ? np. sekcja i nazwisko (SectionName i MemberName).

Re: Jak przyspieszyć operacje ?

Nowy postNapisane: poniedziałek, 21 października 2013, 12:34
przez Mironas
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.

Re: Jak przyspieszyć operacje ?

Nowy postNapisane: poniedziałek, 21 października 2013, 13:44
przez Pitek
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.

Re: Jak przyspieszyć operacje ?

Nowy postNapisane: poniedziałek, 21 października 2013, 13:52
przez Mironas
Wyjaśnij dokładniej bo nie rozumiem. Najlepiej podaj przykład co masz w tabeli a co chcesz dostać w wyniku zapytania.

Re: Jak przyspieszyć operacje ?

Nowy postNapisane: poniedziałek, 21 października 2013, 14:27
przez Pitek
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.

Re: Jak przyspieszyć operacje ?

Nowy postNapisane: poniedziałek, 21 października 2013, 15:22
przez Mironas
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.