Rozszerzenie przechwytywania SQL

20

Według Immermana klasa złożoności powiązana z zapytaniami SQL jest dokładnie klasą bezpiecznych zapytań w (zapytania pierwszego rzędu plus operator zliczania): SQL przechwytuje bezpieczne zapytania. (Innymi słowy, wszystkie zapytania SQL mają złożoność w , a wszystkie problemy w mogą być wyrażone jako zapytanie SQL).Q ( F O ( C O U N T ) ) Q ( F O ( C O U N T ) )Q(FO(COUNT))Q(FO(COUNT))Q(FO(COUNT))

Na podstawie tego wyniku, z teoretycznego punktu widzenia, istnieje wiele interesujących problemów, które można skutecznie rozwiązać, ale których nie można wyrazić w języku SQL. Dlatego interesujące wydaje się rozszerzenie SQL, które jest nadal wydajne. Oto moje pytanie:

Czy istnieje rozszerzenie SQL (zaimplementowane i używane w branży ), które przechwytujeP (tzn. Może wyrażać wszystkie zapytania obliczalne w czasie wielomianowym i żadnych innych)?

Chcę język zapytań do bazy danych, który spełnia wszystkie trzy warunki. Łatwo jest zdefiniować rozszerzenie, które rozszerzyłoby SQL i przechwytuje . Ale moje pytania brzmią, czy taki język ma sens z praktycznego punktu widzenia, więc chcę, aby język był używany w praktyce. Jeśli tak nie jest i nie ma takiego języka, to chciałbym wiedzieć, czy istnieje powód, który sprawia, że ​​taki język jest nieciekawy z praktycznego punktu widzenia? Na przykład, czy zapytania, które pojawiają się w praktyce, są zwykle wystarczająco proste, aby taki język nie był potrzebny?P

Kaveh
źródło
1
@JD, przepraszam, ale na podstawie twojego komentarza myślę, że nie rozumiesz pytania. Pytanie jest dobrze zdefiniowane. Przechwytywanie klasy złożoności przez język jest standardową terminologią. (to, co nie jest dobrze zdefiniowane, to moja preferencja, że ​​język powinien być językiem zapytań, ale to tylko preferencja i powiedziałem wam, że nie mam nic przeciwko temu, czego nie ma, jeśli nie ma takiego z preferencjami).
Kaveh
1
@ Shog9, już na to odpowiedziałem. JD nie rozumie pytania, nie wiedział nawet, co oznacza przechwytywanie, i nie zdaje sobie sprawy, że język przechwytujący P nie może być z definicji Turingem kompletnym. Oczekuje, że zostanie to określone w sposób, który mu się podoba. Podałem to w zwykłej terminologii złożoności opisowej i złożoności języków zapytań, a nawet mu to wyjaśniłem. Co tu nie jest jasne?
Kaveh
1
@ Shog9 motywacja pochodzi ze złożoności opisowej . Próbuję sprawdzić, czy istnieje język rozszerzający SQL używany w branży, który przechwytuje P. Oryginalny język SQL jest raczej słaby, jak pokazują wyniki Immermanna, z teoretycznego punktu widzenia nie można w nim podać wielu wydajnych obliczeń. Z drugiej strony chcielibyśmy utrzymać efektywność języka (np. ). Czy istnieje taki język? (Myślę, że są one prawdopodobnie jasne dla osób znających złożoność opisową). P
Kaveh
4
@ Shog9: Nie rozumiem, dlaczego to pytanie wymagało interwencji moderatora i zostało zamknięte. Czuję się wystarczająco swobodnie ze złożonością opisową, aby powiedzieć, że to prawdziwe pytanie (choć być może lepiej pasuje do TCS - to trochę trudne pytanie).
Alex ten Brink
1
Kiedy zauważyłem, że inne pytanie również zostało zamknięte (które również miało bliskie głosy), zadałem pytanie na ten temat: meta.cs.stackexchange.com/questions/97/...
Alex ten Brink

Odpowiedzi:

5

Jeśli chodzi o twoje główne pytanie, polecam tę krótką ankietę Martina Grohe.


Czy zapytania, które są potrzebne w praktyce, są zwykle na tyle proste, że nie ma potrzeby używania mocniejszego języka?

Powiedziałbym, że dzieje się tak przez większość czasu, biorąc pod uwagę sporą liczbę rozszerzeń dodanych do popularnych języków zapytań (zamykanie przechodnie, operatory arytmetyczne, liczenie itp.). Wynika to z punktu widzenia kogoś, kto wykonał pracę jako niezależny programista stosunkowo prostych stron internetowych i innych aplikacji, więc nie jestem pewien co do prawdziwego zastosowania SQL w większych branżach / większych bazach danych.

W rzadkich przypadkach może być potrzebny bardziej zaawansowany język. Sądzę, że programiści radzą sobie z nimi, używając języka, w którym piszą aplikację, a nie zapytań (takich jak C ++ lub java).

Janoma
źródło
3

Po pierwsze, ekspresyjna moc SQL jest mniej wyraźna niż się wydaje. Okazało się, że funkcje agregujące, grupujące i arytmetyczne SQL mają dość subtelne efekty. A priori wydaje się wykonalne, że przez pewne kodowanie operatorów algebraicznych korzystających z tych funkcji można faktycznie wyrazić osiągalność w SQL. Okazuje się, że tak nie jest w przypadku SQL-92 , który jest „lokalny”.

Oznacza to, że do przechwytywania PTIME wymagane jest rozszerzenie SQL-92 oraz takie, które pozwalają, aby język wynikowy był „nielokalny”.

Jednak zezwolenie na uporządkowane struktury i realistycznie ograniczoną arytmetykę, dowodzenie, że SQL-92 nie może wyrazić osiągalności, oznaczałoby, że jednolity a zatem może być dość trudny. (Można argumentować, że zawsze istnieje naturalne uporządkowanie liniowe dla typów danych w SQL-92 i dlatego można założyć, że struktury leżące u podstaw są uporządkowane.)TC0NLOGSPACE

Potem krajobraz zmienił się ponownie, ponieważ SQL: 1999 (SQL3) zawierał rekurencję. Tak więc SQL: 1999 wydaje się być co najmniej tak wyrazisty jak logika stałoprzecinkowa z liczeniem (choć myślę, że szczegóły mogą być znowu dość trudne, w tym kwestia kolejności). Nie wiem, czy nowe konstrukcje uczyniły logikę bardziej wyrazistą, niż jest wymagana do przechwytywania PTIME, i aby to ustalić, potrzebne byłyby jakieś badania. W międzyczasie dokonano dalszych zmian w 2003 , 2006 , 2008 i 2011 r(będąc dokumentami ISO, tylko wersje robocze są swobodnie dostępne). Te zmiany dodały całą masę nowych funkcji, w tym umożliwienie XQuery jako „części” zapytań SQL. Domyślam się, że „SQL” jest teraz bardziej wyrazisty niż jest wymagany do przechwytywania PTIME, ale że wymagane do tego kodowanie może wymagać dużych i raczej nienaturalnych zapytań, które mogą nie być obsługiwane w prawdziwych systemach.

Myślę więc, że istnieją dowody na to, że nie ma przemysłowego rozszerzenia SQL, które precyzyjnie przechwytuje PTIME , odpowiadając na twoje pytanie w niewyraźny sposób. Krótko mówiąc, rozszerzenia przemysłowe są dość potężne i mogą już mieć przekroczony czas PTIME. Jeśli prawdą jest, że SQL: 1999 jest już wystarczająco potężny, aby przechwycić przynajmniej PTIME, to nie jest również jasne, co tak naprawdę oznacza „SQL” w twoim pytaniu, ponieważ należałoby zdefiniować „SQL”, aby oznaczać wersję wcześniejszą niż SQL: 1999.

Wreszcie badanie Grohe dotyczące poszukiwania logiki przechwytującej PTIME (wspomniane również przez Janomę) wskazuje nie tylko, że przechwytywanie PTIME jest trudne, chyba że mamy liniowy porządek jako część języka, ale że dowód, że taka logika nie istniałaby, również implikuje .PNP

András Salamon
źródło
Dzięki, András, szczególnie za to, że wspomniałem, że SQL3 obsługuje „rekurencję”, muszę sprawdzić i zobaczyć, co o tym wiadomo. :)
Kaveh
ps: Zgaduję, że uwzględniłeś omówienie relacji z teorią złożoności i logiką przechwytującą P dla czytelników, ale pozwól mi dodać jako notatkę dodatkową i wyjaśnienie: Używam SQL w tym sensie, że Immerman użył go w wyniku i że wynik używa precyzyjnej definicji SQL. Wiem o relacjach do separacji klas złożoności i pytaniu o logikę przechwytującą P, jednak nie sądzę, aby miały one wpływ na odpowiedź na moje pytanie,
Kaveh
odpowiedź na moje pytanie może być pozytywna (lub przecząca) i byłyby spójne ze wszystkimi możliwymi odpowiedziami na P vs. NP i istnieniem logiki niezmiennej dla P.
Kaveh
Kaveh, jeśli zdefiniujesz SQL tak, jak zrobił to Immerman, myślę, że odpowiedź brzmi „prawdopodobnie nie”, ponieważ istniejące rozszerzenia przemysłowe wydają się albo zbyt słabe, albo zbyt potężne. Ale (AFAIK) nie mamy na to surowego dowodu. Być może niektóre podzbiory rozszerzeń dokładnie wychwytują PTIME, ale nie jestem pewien, czy chciałbym przeszukiwać specyfikacje, próbując je wyodrębnić ...
András Salamon
-1

Twoje pytanie nie jest wystarczająco jasne, jeśli chcesz rozszerzenie, które przechwytuje i tylko , czy też oddaje i ewentualnie rzeczy poza . Wygląda na to, że interesuje Cię tylko dokładna klasa , ponieważ chcesz bezpiecznych zapytań, a jeśli tak nie jest, wystarczyłoby każde rozszerzenie SQL Turinga.PPPPP

Nie wiemy, czy . Jeśli , rozszerzenie SQL zdolne do przechwytywania i tylko powinno być w stanie obliczyć, czy formuła boolowska jest zadowalająca w czasie wielomianowym lub rozwiązać inny problem w czasie wielomianowym.P=NPP=NPPPNPC

Ale jeśli , twój język rozszerzony SQL nie będzie w stanie obliczyć, jeśli dana formuła boolowska jest zadowalająca.PNP

Mamy więc pytanie: czy istnieje algorytm (lub zapytanie lub cokolwiek innego) napisany w takim języku, który jest w stanie zdecydować, czy formuła boolowska jest zadowalająca? Nie mogę na to odpowiedzieć (i prawdopodobnie nikt tutaj nie może, ponieważ odpowiedź na to pytanie odpowiada, jeśli ). To pytanie pozwala mi wierzyć, że jest bardzo mało prawdopodobne, aby ten język istniał w prawdziwych celach.P=NP

Chociaż prawdopodobnie nie istnieje do prawdziwych celów, z pewnością istnieje i jest konstruowalny i możliwy do wdrożenia. Możesz zdefiniować ten język za pomocą czegoś, co może symulować maszynę Turinga do określonej liczby kroków. IE, zdolny do rozwiązania problemu P-complete . Jeśli jednak skonstruujesz coś takiego, jest on prawie ukończony przez Turinga, z wyjątkiem ograniczenia „dającego nieograniczoną liczbę kroków”, co w języku podobnym do SQL byłoby bardzo dziwnym sposobem ograniczenia go tylko do bezpiecznych zapytań. Możesz to zrobić, jeśli kroki są zapisami tabeli, ale nadal nie wygląda to nic cennego ze względów praktycznych.

Victor Stafusa
źródło
2
kiedy mówimy, że przechwytuje klasę złożoności, mamy na myśli dokładnie tę klasę złożoności. Na przykład mówimy, że język przechwytuje klasę złożoności . A C 0FOAC0
Kaveh
1
Nie widzę również związku vs. z moim pytaniem. Wiemy już, że istnieją języki, które przechwytują , np. (który, nawiasem mówiąc, nie jest ukończony). Pytam, czy istnieje język rozszerzający przechwytywanie SQL który jest używany w branży i chcę, aby wszystkie były zadowolone (lub wyjaśnienie, dlaczego taki język nie jest interesujący z punktu widzenia branży) . P P F O ( L F P ) PNPPPFO(LFP)P
Kaveh