2013-03-26 2 views
0

Contexte:Existe-t-il un moyen/une plate-forme sur lequel les liaisons SQL peuvent être évaluées selon les besoins, lors de l'exécution de la requête?

Dire que j'ai une grande requête (pseudo):

SELECT %boundthing,data 
WHERE data in (
    ...do lots of long-running stuff 
) 

Supposons que boundthing n'est pas utilisé dans ma requête partout, mais quand je veux imprimer la sortie (je sais c'est un cas d'utilisation stupide, mais cela illustre le point que je sais que boundthing ne sera pas nécessaire avant que la clause WHERE ne soit exécutée). Si tel est le cas, si je transmets la valeur pour boundthing à ma requête dans le langage de programmation de mon choix, il est évalué lorsque je lance la requête, peu importe combien de temps plus tard il sera réellement "utilisé" par le base de données.

Question:

Est-il possible (dans une base de données/langage de programmation existante) pour définir une chose de style se lient à évaluer (qui est, elle produit une valeur pour la variable liée, si la source est une variable ou une fonction) à la demande dans une requête, plutôt que lorsque le plan de requête est construit?

Par exemple, je pourrais dire, en pseudocode d'application:

function MyFunc: 
    return "foo" + system.GetEpochTimestamp(); 

var results = database_handle.Execute(SQL = " 
    SELECT %boundthing,data 
    WHERE data in (
     ...do lots of long-running stuff 
    )", BINDS = [ ("boundthing", MyFunc) ] 
); 

Et la valeur de « boundthing » dans la sortie correspondrait à l'horodatage sur le serveur d'application, après laWHEREclause filtrée tout (moins le temps d'exécution de myfunc sur le serveur d'applications, et quel que soit le temps nécessaire pour que les données le rendent au serveur de base de données et soient traitées par la base de données).

Pourquoi je veux savoir:

curiosité.

Je sais que quelque chose comme ça détruirait probablement beaucoup (peut-être tout) l'efficacité prêtée par un planificateur de requêtes. Je sais que vous n'auriez jamais une garantie que l'évaluation de la liaison serait exécutée exactement quand la valeur était nécessaire dans la requête (il y a le temps de transmission de valeur, le temps de traitement sur la base de données, etc). Je sais aussi que cela viole beaucoup de garanties d'atomicité et pourrait causer de sérieux problèmes en cas d'avortement ou de panne.

Pourtant, je suis curieux.

Répondre

1
CREATE PROC MyFunc 
AS 
BEGIN 
    SELECT * INTO #MyTempTable FROM data where data in (...do lots of long-running stuff); 
    $boundthing='EXEC boundthing' 
    select $boundthing, * from #MyTempTable 
END 
GO 

Espérons que ça aide Zac.

-Pete

+0

C'est un peu effrayant, d'un point de vue-exécution de code arbitraire, mais travaille dans une pincée, je suppose. Peut-être qu'un jour, il y aura un pilote de base de données qui permettra aux clients de spécifier (ou suggérer) des techniques d'évaluation de liaison. –

Questions connexes