Cześć, w mojej aplikacji pewne obliczenia wykonują się dość długo. Obliczenia te zależą od przekazanego zakresu dat. I wpadłem na pomysł, że, żeby zwiększyć prędkość wystarczy obliczenia te rozbić na kilka wątków.
Chodzi o to, że zamiast wywołać procedurę składowaną dla całego zakresu, np:
ProcessData '2010-01-01', '2010-12-31'
mogę wywołać tą procedurę w dwóch osobnych wątkach z ograniczonymi zakresami, czyli:
wątek 1: ProcessData '2010-01-01', '2010-05-31'
wątek 2: ProcessData '2010-06-01', '2010-12-31'
Oczywiście przekazując też ID wątku, bo jest mi to potrzebne.
Załóżmy w uproszczeniu, że procedura ProcessData wypełnia mi tabelę TAB pewnymi danymi. Najpierw zbiera te dane i odpowiednio je przelicza, a na końcu dodaje rekord do tabeli TAB. Wszystko dzieje się w kursorze.
Zrobiłem sobie prosty test z użyciem SQL Server Management Studio (wersja sql: SQL 2005 Express)
Tzn. na jednej karcie odpaliłem jedną procedurę, na drugiej drugą. I okazało się, że czas wykonania osiągnął 40 sekund, czyli jakieś 2 razy więcej niż normalnie.
I teraz pytania:
- czy taki test jest miarodajny, czy gdzieś dałem tyłka?
- czy muszą być spełnione jakieś specyficzne warunki, żeby mój pomysł miał rację bytu?
Okazuje się, że tabela TAB jest wypełniona mieszanymi danymi(tzn. w kolejności dane były zapisywane: trochę z jednego wywołania, trochę z drugiego). Tego się spodziewałem, jednak moim zdaniem ten stopień "pomieszania" jest trochę mały w porównaniu do ilości danych.
Spróbuję jeszcze zrobić tak, żeby każde wywołanie insertowało dane do tylko swojej tabeli, a potem unię z nich.