2012-01-12 24 views
5

Próbuję odczytać kolumnę typu clob z oracle w .Net i obserwując bardzo słabą wydajność i duży ruch sieciowy.Słaba wydajność uzyskiwanie pola klamry od Oracle w .Net

Próbowałem metod ODP + OCI, devArt + OCI, aby uzyskać dostęp do danych z tymi samymi wynikami - uzyskanie 1000 wierszy w czytniku danych zajmuje około 20 sekund i odczytanie wartości clob dla każdego wiersza.

Analizując ślady wireshark, okazuje się, że za każdym razem, gdy próbuję odczytać pole clob dla pojedynczego wiersza w czytniku, istnieje kilka dodatkowych pakietów TCP wysyłanych między klientem a serwerem. Tak więc dla 1000 wierszy staje się to 1000 razy wolniejsze niż w przypadku zapytań tylko w jednym wierszu.

W tym samym czasie, jeśli uruchomię to samo zapytanie w SQL Developer (który, jak sądzę, używa cienkiego sterownika jdbc zamiast oci), natychmiast otrzymuję wyniki, w tym wartości clob. Nie próbuje kwerendy do clob dla każdego wiersza - pobiera je wszystkie za jednym razem!

Ale nie widzę cienkiego klienta dla .net. Jak mogę przyspieszyć? Proszę pomóż!

EDYCJA: Mój typ pola to faktycznie XMLTYPE zapisany jako clob, a nie prawdziwy clob. Użycie funkcji getClobVal powoduje poprawę wyniku o 50% do 10 sekund dla 1000 wierszy. Ale jednocześnie programista Sql zwraca wyniki natychmiast, nie w 10 sekund.

+0

Czy kiedykolwiek rozwiązałeś ten problem? Czy zarejestrowałeś żądanie wsparcia u dostawcy? –

Odpowiedz

1

Prawidłowo zauważyłeś, że Oracle opóźnia pobieranie LOB. W związku z tym wydajność aplikacji jest ograniczona przez czas obiegu w sieci.

Z obiektu klasy OracleCommandInitialLOBFetchSize (w ODP.NET patrz documentation), można powiedzieć Oracle odzyskać część LOB z początkowym pobierania rzędu. Jeśli Twoje LOBy nie są zbyt długie, może to mieć znaczenie.

+0

Dzięki, patrzyłem na to wczoraj, ale to nie miało dla mnie znaczenia. W rzeczywistości nie byłam zbyt szczera w swoim przesłaniu - mamy pole XmlType przechowywane jako clob, a nie bezpośredni clob i może to powoduje problemy. Próbowałem również nazwać go getClobVal i daje on 50% wzrost wydajności, ale to tylko 10 sekund dla 1000 wierszy, podczas gdy SQL Developer pobiera 5000 praktycznie natychmiast. – neonknight

Powiązane problemy