Menurut Immerman , kelas kompleksitas yang terkait dengan kueri SQL adalah kelas kueri aman di (kueri urutan pertama ditambah operator penghitungan): SQL menangkap kueri aman. (Dengan kata lain, semua kueri SQL memiliki kompleksitas dalam , dan semua masalah di dapat diekspresikan sebagai kueri SQL.)Q ( F O ( C O U N T ) ) Q ( F O ( C O U N T ) )
Berdasarkan hasil ini, dari sudut pandang teoretis, ada banyak masalah menarik yang dapat diselesaikan secara efisien tetapi tidak dapat diekspresikan dalam SQL. Oleh karena itu perpanjangan SQL yang masih efisien tampaknya menarik. Jadi inilah pertanyaan saya:
Apakah ada ekstensi SQL (diimplementasikan dan digunakan dalam industri ) yang menangkap (yaitu dapat mengekspresikan semua kueri yang dihitung waktu polinomial dan tidak ada yang lain)?
Saya ingin bahasa query database yang memenuhi ketiga kondisi. Sangat mudah untuk mendefinisikan ekstensi yang akan memperluas SQL dan akan menangkap . Tetapi pertanyaan saya adalah apakah bahasa seperti itu masuk akal dari perspektif praktis, jadi saya ingin bahasa yang digunakan dalam praktik. Jika ini bukan masalahnya dan tidak ada bahasa seperti itu, maka saya ingin tahu apakah ada alasan yang membuat bahasa seperti itu tidak menarik dari sudut pandang praktis? Misalnya, apakah pertanyaan yang muncul dalam praktik biasanya cukup sederhana sehingga tidak perlu bahasa seperti itu?
Jawaban:
Adapun pertanyaan utama Anda, saya sarankan survei singkat ini oleh Martin Grohe.
Saya akan mengatakan ini memegang sebagian besar waktu, mengingat jumlah ekstensi yang adil ditambahkan ke bahasa permintaan umum (penutupan transitif, operator aritmatika, penghitungan, dll.). Ini berasal dari sudut pandang seseorang yang telah melakukan beberapa pekerjaan sebagai pengembang lepas situs web yang relatif sederhana dan aplikasi lain, jadi saya tidak yakin tentang penggunaan nyata SQL dalam industri yang lebih besar / database yang lebih besar.
Dalam kasus yang jarang terjadi, bahasa yang lebih kuat mungkin diperlukan, saya duga bahwa pengembang perangkat lunak menanganinya dengan menggunakan bahasa tempat mereka menulis aplikasi, bukan kueri (seperti C ++ atau java).
sumber
Pertama, kekuatan ekspresif SQL kurang jelas dari yang terlihat. Fitur agregat, pengelompokan, dan aritmatika dari SQL ternyata memiliki efek yang cukup halus. A priori, tampaknya layak bahwa dengan beberapa pengkodean operator aljabar menggunakan fitur-fitur ini, orang benar-benar dapat mengekspresikan jangkauan dalam SQL. Ternyata ini sebenarnya bukan kasus untuk SQL-92 , yang merupakan "lokal".
Ini berarti bahwa ekstensi diperlukan untuk SQL-92 untuk menangkap PTIME, dan yang memungkinkan bahasa yang dihasilkan menjadi "non-lokal".
Namun, memungkinkan struktur yang dipesan dan dengan aritmatika yang terbatas secara realistis, membuktikan bahwa SQL-92 tidak dapat mengungkapkan jangkauan akan menyiratkan bahwa seragam dan karenanya cenderung cukup sulit. (Dapat dikatakan bahwa pemesanan linear alami selalu ada pada tipe data dalam SQL-92, dan oleh karena itu orang dapat mengasumsikan bahwa struktur yang mendasarinya dipesan.)TC0⊊ NLOGSPACE
Kemudian lansekap berubah lagi, karena SQL: 1999 (SQL3) termasuk rekursi. Jadi SQL: 1999 tampaknya setidaknya sama ekspresifnya dengan logika titik tetap dengan penghitungan (meskipun saya pikir detailnya mungkin agak rumit, termasuk masalah pesanan). Apakah konstruksi baru membuat logika lebih ekspresif daripada yang diperlukan untuk menangkap PTIME, saya tidak tahu, dan beberapa studi akan diperlukan untuk membangun ini. Sementara itu, revisi lebih lanjut dilakukan pada tahun 2003 , 2006 , 2008 dan 2011(menjadi dokumen ISO, hanya konsep yang tersedia secara gratis). Revisi ini menambahkan banyak sekali fitur baru, termasuk memungkinkan XQuery sebagai "bagian" dari pertanyaan SQL. Dugaan saya adalah bahwa "SQL" sekarang lebih ekspresif daripada yang diperlukan untuk menangkap PTIME, tetapi pengkodean yang diperlukan untuk melakukannya mungkin memerlukan kueri yang besar dan agak tidak wajar yang mungkin tidak didukung dalam sistem nyata.
Jadi saya pikir ada bukti bahwa tidak ada ekstensi industri SQL yang secara tepat menangkap PTIME , menjawab pertanyaan Anda dengan cara yang kabur. Singkatnya, ekstensi industri agak kuat dan mungkin sudah melampaui PTIME. Jika memang benar bahwa SQL: 1999 sudah cukup kuat untuk menangkap setidaknya PTIME, maka itu juga tidak jelas apa arti "SQL" dalam pertanyaan Anda, karena orang harus mendefinisikan "SQL" berarti versi yang mendahului SQL: 1999.
Akhirnya, survei Grohe tentang pencarian logika yang menangkap PTIME (juga disebutkan oleh Janoma) menunjukkan tidak hanya bahwa menangkap PTIME itu rumit kecuali jika kita memiliki urutan linier sebagai bagian dari bahasa, tetapi juga bukti bahwa tidak ada logika seperti itu juga akan menyiratkan .P ≠ NP
sumber
Meskipun mungkin tidak ada untuk tujuan nyata, itu pasti ada dan dapat dibangun dan diimplementasikan. Anda bisa mendefinisikan bahasa itu dengan sesuatu yang mampu mensimulasikan mesin Turing hingga sejumlah langkah yang belum dilakukan. IE, mampu menyelesaikan masalah P-complete . Namun, jika Anda membangun hal seperti itu, itu hampir Turing-lengkap kecuali untuk pembatasan "diberi sejumlah langkah", yang dalam bahasa seperti SQL akan menjadi cara yang sangat aneh untuk membatasi hanya untuk permintaan yang aman. Anda bisa melakukan ini jika langkah-langkahnya adalah catatan dari beberapa tabel, tetapi ini masih tidak terlihat berharga untuk tujuan praktis.
sumber