Parece que se sabe que para encontrar una respuesta a una consulta sobre una base de datos relacional , se necesita tiempo , y no se puede eliminar el exponente.
Como puede ser muy grande, nos preguntamos por qué las bases de datos funcionan en la práctica.
¿Es solo una cuestión de que las consultas habituales no sean tan grandes en las aplicaciones del mundo real? (Entonces es interesante saber cuál es el tamaño habitual de las consultas planteadas a los sistemas de bases de datos relacionales y cuál es el tamaño "máximo" de las consultas que se espera que un sistema de base de datos responda efectivamente en la práctica ).
Notas sobre el exponenteno 'extraíble'
Para mostrar que el exponenteno es extraíble, se puede usar una consulta preguntando si existe una camarilla de tamaño en el gráfico proporcionado por la base de datos. Verificar si un gráfico tiene una -clique es un problema NP-completo. Además, no es manejable con parámetros fijos, con el parámetro . Los detalles se pueden encontrar en, por ejemplo,
Libkin, L .: Elementos de la teoría de modelos finitos. Springer (2004)
o
Papadimitriou, CH, Yannakakis, M .: Sobre la complejidad de las consultas de bases de datos. J. Comput. Syst. Sci. 58 (3), 407–427 (1999)
fuente
SELECT * FROM users WHERE username="abc" AND passwrod="xyz"
) son búsquedas simples, que toman O (| D |) para ejecutarse. Si hay un índice en los campos relevantes de la base de datos, tomará O (log | D |). No me interesan las bases de datos, pero no creo que las consultas más complicadas puedan llevar un tiempo exponencial.Respuestas:
Hay grandes clases de consultas que son "fáciles", incluso en el peor de los casos. En particular, si la clase de consultas contiene solo consultas conjuntas y cada consulta tiene un ancho acotado (por ejemplo, ancho de árbol, ancho de árbol de su gráfico de incidencia, ancho de hipertree fraccional o ancho submodular), entonces la consulta se puede responder usando algo como un árbol de unión , junto con la enumeración de fuerza bruta para las partes locales de la consulta que se desvían del árbol. Esto requiere tiempo polinomial, con el grado del polinomio determinado por el parámetro ancho.
Parece que muchas consultas encontradas en la práctica son conjuntivas y tienen un ancho pequeño. Por lo tanto, el tiempo de ejecución polinomial tiene un bajo grado en este caso.
Dániel Marx presentó un documento en STOC 2010 sobre el ancho submodular recientemente, cuya versión completa incluye un buen resumen de las diversas nociones de ancho y cómo la formulación de CSP se relaciona con el formalismo de la base de datos (la versión de la conferencia carece de esto).
Esta no es una respuesta completa, ya que no se ocupa de la complejidad "típica" de las consultas de la base de datos, pero incluso con el análisis del peor de los casos hay consultas fáciles.
fuente
Se pueden usar las consultas Q_n para verificar si un gráfico, representado como una base de datos, contiene una camarilla con n elementos. Verificar si un gráfico tiene una camarilla es un problema de NP completo. Además, no es manejable con parámetros fijos, con el parámetro n (que significa D ^ n).
fuente
Otra forma de responder a esta pregunta es "¡no lo hacen!"
Si le da a una implementación típica de DBMS una consulta que contiene una gran cantidad de combinaciones, ni siquiera pasará la fase de planificación / optimización (y mucho menos la evaluación), incluso si la consulta es acíclica o tiene una estructura muy simple como András alude a lo anterior.
Pero, para las cargas de trabajo DBMS "típicas", tales consultas parecen no surgir.
fuente
Aquí hay una versión más preocupada por la realidad de la respuesta de tigreen desde el punto de vista de una persona que realmente hace un uso intensivo de las bases de datos (relacionales): todo el punto y la complejidad de su aplicación es estructurarlos de una manera que requerirían la menor cantidad de se une a todas y cada una de las consultas necesarias y es por eso que realmente funcionan . En otras palabras, no espere que las bases de datos resuelvan problemas complejos por su cuenta; no lo harían, pero si se usan con prudencia son un instrumento realmente útil y aplicable.
fuente
Las uniones solo son cuadráticas sobre las relaciones de muchos a muchos. Estos son relativamente raros: en la práctica, la mayoría de las relaciones y uniones son de 1 a muchos, por lo que tomarán un tiempo lineal si se definen índices / claves. Las consultas con varias uniones de muchos a muchos son un problema grave.
fuente