Ten cytat nie dotyczy ogólnie używania XML jako formatu pamięci (dla którego jest to w porządku, w zależności od wymagań), ale do przechowywania typu bazy danych.
Kiedy ludzie mówią o bazach danych, zwykle mają na myśli systemy pamięci masowej, które przechowują ogromne ilości danych, często w zakresie gigabajtów lub terabajtów. Baza danych jest potencjalnie znacznie większa niż ilość dostępnej pamięci RAM na serwerze, który ją przechowuje. Ponieważ nikt nigdy nie potrzebuje wszystkich danych w bazie danych na raz, bazy danych powinny być zoptymalizowane pod kątem szybkiego pobierania wybranych podzbiorów ich danych: po to jest SELECT
instrukcja, a relacyjne bazy danych, a także rozwiązania NoSQL optymalizują swój wewnętrzny format przechowywania w celu szybkiego wyszukiwanie takich podzbiorów.
XML jednak nie spełnia tych wymagań. Ze względu na zagnieżdżoną strukturę znaczników niemożliwe jest ustalenie, gdzie w pliku przechowywana jest pewna wartość (pod względem przesunięcia bajtu do pliku) bez przejścia całego drzewa dokumentów, przynajmniej do dopasowania. Relacyjna baza danych ma indeksy, a wyszukiwanie wartości w indeksie, nawet przy prymitywnej implementacji wyszukiwania binarnego, jest pojedynczym wyszukiwaniem O (log n), a następnie uzyskanie rzeczywistych wartości jest niczym innym jak wyszukiwaniem pliku (np. fseek(data_file_handle, row_index * row_size)
), czyli O (1). W pliku XML najskuteczniejszym sposobem jest uruchomienie analizatora składni SAX nad dokumentem, wykonując strasznie dużo odczytów i poszukiwań, zanim dotrzesz do rzeczywistych danych; nie da się tego uzyskać lepiej niż O (n), chyba że użyjesz indeksów, ale wtedy będziesz musiał odbudować cały indeks dla każdego wstawienia (patrz poniżej).
Wstawianie jest jeszcze gorsze. Relacyjne bazy danych nie gwarantują kolejności wierszy, co oznacza, że mogą po prostu dodawać nowe wiersze lub zastępować wiersze oznaczone jako „usunięte”. Jest to niezwykle szybkie: DB może po prostu przechowywać wokół siebie pulę zapisywalnych lokalizacji; uzyskanie wpisu z puli to O (1), chyba że pula jest pusta; w najgorszym przypadku pula jest pusta i należy utworzyć nową stronę, ale to także O (1). Natomiast baza danych oparta na XML musiałaby przenieść wszystko po punkcie wstawienia, aby zrobić miejsce; to jest O (n). Kiedy pojawiają się indeksy, sprawy stają się jeszcze bardziej interesujące: typowe indeksy relacyjnych baz danych można aktualizować przy stosunkowo niskiej złożoności, powiedzmy O (log n); ale jeśli chcesz zindeksować swoje pliki XML, każde wstawienie potencjalnie zmienia lokalizację na dysku każdej wartości w dokumencie, więc musiszodbuduj cały indeks . Dotyczy to również aktualizacji, ponieważ aktualizacja, powiedzmy, zawartości tekstowej elementu, może zmienić jego rozmiar, co oznacza, że kolejne pliki XML muszą się zmieniać. Relacyjna baza danych wcale nie musi dotykać indeksu, jeśli zaktualizujesz nieindeksowaną kolumnę; baza danych XML musiałaby odbudować cały indeks dla każdej aktualizacji, która zmienia rozmiar zaktualizowanego węzła XML.
To najważniejsze wady, ale jest ich więcej. XML jest bardzo szczegółowy, co jest dobre w komunikacji między serwerami, ponieważ zwiększa bezpieczeństwo (serwer odbierający może wykonywać wszelkiego rodzaju kontrole integralności XML, a jeśli coś pójdzie nie tak podczas przesyłania, dokument prawdopodobnie nie potwierdzi ). W przypadku pamięci masowej jest to jednak zabójstwo: nierzadko zdarza się, aby narzut danych XML wynosił 100% lub więcej (nierzadko obserwuje się narzuty w zakresie 1000% dla rzeczy takich jak komunikaty SOAP), podczas gdy typowe relacyjne przechowywanie DB schematy mają tylko stały narzut metadanych tabeli, a także niewielki bit na wiersz; większość kosztów w relacyjnych bazach danych pochodzi ze stałych szerokości kolumn. Jeśli masz terabajt danych, narzut 500% jest po prostu niedopuszczalny z wielu powodów.