2010-03-09 13 views
5

Piszę ogólną usługę hostowania zasobów Http i przechowuję większe obiekty jako obiekty BLOB w bazie danych Oracle. Chcę móc ustawić nagłówek "Content-Length" podczas zwracania przechowywanego obiektu, co oznacza, że ​​muszę znać rozmiar obiektu BLOB, zanim zacznę go pisać do klienta (wiem, że mogłem użyć kodowania ugunkowanego i w niektórych przypadkach). Czy ktokolwiek ma jakiekolwiek doświadczenie z wywoływaniem wpływu na wydajność, które wywołuje dbms_lob.getlength() przy każdym odczycie, czy powinienem obliczyć rozmiar BLOBa na INSERT i zapisać go w tabeli? Przeciętnie spodziewam się, że współczynniki zapisu będą wyższe niż wskaźniki odczytu. Piszę teraz test porównawczy, aby zobaczyć, jaki jest wpływ, ale wydaje mi się, że takie częste pytanie myślałem, że ktoś już to zrozumiał. Również, używając JDBC/Spring 3, jak mógłbym obliczyć rozmiar BLOBa podczas zapisu? (i nie mogę używać wyzwalaczy ani procedur przechowywanych) Dzięki.Oracle Blobs - rozmiar sklepu lub kalkulować?

+1

Mierz, mierz, zmierz. Domysły to tylko domysły. – skaffman

+0

Jak zawsze, ale z czymś podobnym do Oracle (używanym przez tysiące), wydawało się to dość częstym paradygmatem i takim, który już wiele DBA już rozwiązało. Gdyby istniały jakieś "gnojki", chciałbym to wiedzieć. – Gandalf

Odpowiedz

6

Zrobiłem szybkie sprawdzenie wybierając BLOB z tabeli, a następnie LENGTH (BLOB) i DBMS_LOB.GETLENGTH (BLOB). Wybierając sam BLOB, uzyskałem 44 spójne wyniki. Kiedy wybrałem długość (dowolną metodą), uzyskałem 7 stałych wyników.

Na tej podstawie, gdy otrzymam długość, nie pobiera ona całego obiektu typu blob i nie oblicza długości. Rozsądnie jest przyjąć, że długość zapisana na początku BLOBa (tak jak zapisana jest długość wartości VARCHAR2) i jest używana bezpośrednio.

W związku z tym, nie powinno być zbyt dużego nakładu, aby określić długość, a nie przechowywać. Zmniejsza to również ryzyko niespójności.

+0

Istnieje INDEKS LOBU, który jest oddzielnym segmentem, więc jeśli twój LOB nie może być przechowywany w linii, może szybko znaleźć liczbę bloków, które należy zastosować. W skrócie, podczas pobierania pojedynczego obiektu LOB, OP powinien pobierać DBMS_LOB.GETLENGTH() w tym samym czasie, zamiast przechowywać wartość potencjalnie niepoprawną. –

+0

Ponadto, z 11g można użyć wirtualnej kolumny, aby podać długość obiektu typu blob. – JavaRocky

0

Ponieważ nie widzę żadnych odpowiedzi ..

nie mam nic osobiście zmierzyć, ale nasz DBA zaleca przechowywanie ich rozmiar (wiem, że to właśnie on powiedział mi tak). Jest całkiem niezły, więc osobiście uważam, że przechowywanie rozmiaru jest drogą do wykonania - przynajmniej jeśli jest to krytyczne pod względem wydajności (musielibyśmy nazwać .length() A LOT).

+2

Niektóre DBA powiedzą coś starego. Dobry DBA będzie w stanie wybić przykład kodu, aby uzasadnić swoje twierdzenia. – APC

2

Ponieważ nasze Blobs kompresji dobrze w ogóle podjęliśmy tego podejścia: -

  • sklep BLOB skompresowane. Kompresja jest wykonywana po stronie java podczas przesyłania strumieniowego do obiektu BLOB
  • zapisanie nieskompresowanego rozmiaru w bajtach w innej kolumnie w tej samej tabeli dekompresowanie przez strumień, gdy wysyłamy BLOB ponownie, wiedząc, jaki rozmiar zawartości będzie

Możesz rozważyć takie podejście, jeśli twoje BLOBy są kompresowalne.

Powiązane problemy