Cykliczne przetwarzane zapytanie SQL

0

Pytanie 1:

Cyklicznie (co 1 sekundę) wykonuję tą sekwencję:

try
Query1.Close;
Query1.SQL.Clear;
Query1.SQL.Text:=('select * from Tab1 A where A.Id not in (select distinct B.Id from Tab2 B)');
Query1.Open;
except
WpisDoLogu('log.txt','DB','Błąd wykonania zapytania [select !!!]: '+Q1.SQL.Text);
end;

Po jakimś czasie lub zdarzeniu zapytanie to nie wykonuje się (w logu pojawia się wpis). Co z tym zrobić ? Macie jakiś pomysł ?

Pytanie 2:

W wyniku wykonywania zapytania pojawiają się w katalogu aplikacji kolejne pliki o nazwie nr _QSQ314.DB (wartość liczbowa rośnie) - jak nad tym zapanować ? Po co to powstaje ?

Z góry dziękuję za podpowiedzi (zaznaczam, że muszę to robić na paradoxie)

0
  1. po co za każdym razem czyścisz i wpisujesz zapytanie od nowa?? Wystarczy zamknąć i otworzyć Query i tyle.
  2. trochę dziwne to co robisz, no ale
  3. są to tabele tymczasowe i najprawdopodobniej usuną się jak zamkniesz program (paradoxa dawno olałem)
0

Z tą treścią zapytania masz rację, muszę to zmienić, ale problem polega na tym, że pewna część zapytania jest zmienna (w nazwie jednej z odpytywanych tabel jest data) - ok do zmiany,

Co masz na myśli pisząc dziwnie ? Może jakąś głupotę robię i brnę w to nie widząc innego rozwiązania ...

0

Usunięcie ciągłego wstawianie tekstu zapytania nie rozwiązało niestety mojego problemu. Nadal wykonanie zapytanie się "blokuje".

Proszę jeszcze :) o jakieś pomysły.

0

dziwne jest odpytywanie serwera co sekundę, może napisz dlaczego tak

0

Selectem tym wyszukuję wszystkie nowo dodane rekordy w Tab2 których nie mam jeszcze w Tab2 (w tej tylko Id). Tak znalezione wstawiam do bazy oracle (wybrane pola). Próbowałem chodzi po prostu po tej tabeli i ustawiać się na ostatnim rekordzie, ale skutek tego był taki, że pomijałem wten sposób rekordy dla których Id był np. 5 pozycji wcześniej (np. wysłałem id 9 i obrabiałem 10 a do bazy został wstawiony id 5). Problem polega na tym, że dziennych przyrost rekordów w tej bazie Paradox jest rzędu 5 tys.

0

tak zajedziesz tego paradoxa (co zresztą już zrobiłeś)

  1. aktualizować dużo rzadziej + na żądanie
  2. zmusić program, który dodaje te dane do dodawania ich do oracla, albo zapisywania w pliku textowym, cokolwiek innego żeby nie przeszukiwać tych tabel
  3. no i może zamiast
    select * from Tab1 A where A.Id not in (select distinct B.Id from Tab2 B)
    wystarczy
    select * from Tab1 A, Tab2 B where A.Id <> B.Id
    podzapytania są strasznie kosztowne (zarówno pamięć jak i czas i na pewno nie są mocną stroną paradoxa)
0
  1. rzadziej nie mogę, to musi być "on-line"
  2. nad rozwiązaniem z plikiem txt się zastanawiałem, choć miałem nadzieje, że coś się da z tego paradoxa "wydusić",
  3. takie zapytanie nie zwraca różnicy rekordów (ponadto w SQLu paradoxowym nie ma składni minus - różnica zapytań)

... będę walczył z tym dodatkowym logowaniem

0
Misiekd napisał(a)

tak zajedziesz tego paradoxa (co zresztą już zrobiłeś)

  1. aktualizować dużo rzadziej + na żądanie
  2. zmusić program, który dodaje te dane do dodawania ich do oracla, albo zapisywania w pliku textowym, cokolwiek innego żeby nie przeszukiwać tych tabel
  3. no i może zamiast
    select * from Tab1 A where A.Id not in (select distinct B.Id from Tab2 B)
    wystarczy
    select * from Tab1 A, Tab2 B where A.Id <> B.Id
    podzapytania są strasznie kosztowne (zarówno pamięć jak i czas i na pewno nie są mocną stroną paradoxa)

Napisanie a<> b nic Ci nie da.
raczej za pomoca

select a.* from a where not exists (select 'x' from b where b.id = a.id)
0

not exist jest dużo wolniejsze od not in select, a efekt końcowy jest taki sam (blokuje się zapytanie)

1 użytkowników online, w tym zalogowanych: 0, gości: 1