Od dawna deweloperzy z największymi głowami zastanawiają się nad najlepszymi sposobami komunikacji różnych aplikacji i baz danych. Problematyka ta wbrew pozorom do banalnych nie należy i najczęściej nie ma jednoznacznej odpowiedzi na pytanie o najlepsze rozwiązanie. Oceniać oczywiście można w różnych aspektach: wydajności (szybkości działania), przenoszalności, bezpieczeństwa, ale i to czasem nie wystarcza do dokonania definitywnego wyboru.
Chciałbym tutaj zaprezentować porównanie dwóch technologii transportu danych między SQL Serverem 2005 a testową aplikacją-skryptem napisanym w języku Perl. Ocenie podlegał będzie jedynie aspekt wydajności, gdyż tylko na tym polu można sprawiedliwie porównać technologię o ogólnym przeznaczeniu - ODBC oraz technologię dedykowaną pod środowisko SQL Servera - OLE DB.
Skrypt Perl, działający w środowisku Microsoft Windows 2003 Server SE (32bit, interpreter ze stajni
ActiveState w wersji 5.8.8.819) z bazą danych SQL Server 2005 SP1, miał do wykonania dwa zadania:
1. ciągły odczyt 100 tyś. rekordów zawierających dane teleadresowe
2. 1000x odczyt grup rekordów zawężanych wspólnym wyróżnikiem (wspólny NIP/kod pocztowy), wybór jednego z rekordów - o największej liczbie liter 'a' w nazwie i update jednego z pól rekordu
Zadanie 1 - używając analogii rajdowej - można określi jako "długą prostą", natomiast zadanie 2 - "jazda w zakrętach".
Skyrpt wykonany został w dwóch wersjach warstwy dostępu do BD:
1. DBI (v1.52) z DBD::ODBC (v1.13)
2. Win32::SqlServer (v2.002)
A teraz wyniki:
ODBC
zadanie 1: 12 sek.
zadanie 2: 19 sek.
OLE DB
zadanie 1: 23 sek.
zadanie 2: 12 sek.
Wyniki wskazują, że do nieprzerwanych odczytów dużych ilości rekordów wydajniejsze wydaje się ODBC. Jednak muszę podkreślić, że im większa ilość rekordów do pobrania, tym różnice w wydajności dwóch testowanych providerów są mniejsze - przy milionie rekordów stają się już praktycznie niezauważalne. OLE DB jest natomiast lepsze do odczytów sekwencyjnych i modyfikacji danych.
To, co powyżej napisałem, jest jedynie pewną generalną zasadą wskazującą - z określonym prawdopodobieństwem - na najwydajniejsze rozwiązanie. Znam jednak przypadki, które stanowią wyjątek od tej reguły. Niektóre zaawansowane algorytmy (Perl) przypominające charakterystykę operacji z zadania 2, teoretycznie powinny wydajniej działać na providerze OLE DB (baza danych to SQL Server 2k5), jednak działają o 20-25% szybciej na ODBC. Powodem tego może być sam provider (Win32::SqlServer) - o ile dałoby się go napisać lepiej. Może w kolejnych wersjach modułu sytuacja ulegnie zmianie.