Parece que em linguagens de consulta populares para bancos de dados relacionais, é possível criar consultas que exigirão muitos recursos para serem respondidas. Na prática, os administradores de banco de dados gerenciam isso limitando a quantidade de memória por consulta e verificando se há consultas de longa duração, se houver uma desaceleração no banco de dados. Isso parece bastante ad-hoc, existe uma solução TCS para isso?
Existem linguagens de consulta que podem implementar apenas consultas eficientes?
Se não existem tais idiomas, existe uma razão teórica para isso?
Algumas razões pelas quais eu poderia esperar que esse tipo de coisa exista ou pelo menos fazem sentido:
- temos linguagens de programação projetadas especificamente para implementar apenas cálculos eficientes (geralmente com uma lógica restritiva no sistema de tipos)
- linguagens de consulta populares (como SQL) já são inspiradas pela lógica, portanto, não parece um exagero para os usuários do banco de dados considerar lógicas mais restritivas.
- um usuário de banco de dados não malicioso já tenta preparar consultas que são executadas rapidamente, portanto, devemos esperar que essas linguagens de consulta mais restritivas prejudiquem apenas usuários mal-intencionados.
Esta pergunta é inspirada na interseção de duas perguntas anteriores:
cc.complexity-theory
pl.programming-languages
db.databases
finite-model-theory
Artem Kaznatcheev
fonte
fonte
Respostas:
Uma maneira de analisar as linguagens de consulta de banco de dados é através das lentes de bancos de dados dedutivos , onde as consultas são representadas como programas lógicos. Nessa configuração, o trabalho mais relevante relacionado à sua pergunta é Sobre a análise de complexidade das análises estáticas de McAllester , que observou que você pode raciocinar sobre o tempo de execução de uma consulta, raciocinando sobre o número de "disparos de prefixo" nas regras do seu programa. O que é um "disparo de prefixo" não é terrivelmente complicado, mas vou lhe referir o artigo para isso.
No mundo da programação funcional, esse tipo de coisa é chamada de semântica de custos : não significa que você pode implementar apenas consultas (programas) eficientes, mas significa que você pode raciocinar sobre a complexidade assintótica de seu programa declarativo de uma maneira razoável. .
Alguns trabalhos posteriores sobre a implementação das idéias de McAllester incluem: desde regras de registro de dados até programas eficientes com garantias de tempo e espaço (Liu e Stoller) e Dedalus: Registro de dados no tempo e no espaço (Alvaro, Marczak, Conway, Hellerstein, Maier e Sears). Admito que ainda não li o último desses dois trabalhos.
fonte