【发布时间】:2013-03-26 15:31:11
【问题描述】:
上下文:
假设我有一个大查询(伪):
SELECT %boundthing,data
WHERE data in (
...do lots of long-running stuff
)
假设boundthing 没有在我的查询中使用,但当我想打印输出时(我知道这是一个愚蠢的用例,但它说明了我知道boundthing 不需要直到WHERE 子句运行之后)。
事实上,如果我使用我选择的编程语言将boundthing 的值传递给我的查询,则在我触发查询时会对其进行评估,无论以后它实际上会被“使用”多久数据库。
问题:
有没有办法(在现有的数据库/编程语言中)设置要评估的绑定样式的事物(即,它为绑定变量生成一个值,无论源是变量还是函数) - 查询中的需求,而不是构建查询计划时?
例如,我可以说,在应用程序伪代码中:
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 ) ]
);
输出中“boundthing”的值将对应于应用服务器上的时间戳,在 WHERE 子句过滤所有内容之后(减去myfunc 在应用程序服务器上,无论数据到达数据库服务器并被数据库处理所需的时间有多长。
为什么我想知道:
好奇心。
我知道这样的事情可能会破坏查询计划器提供的很多(可能是全部)效率。我知道您永远无法保证绑定的评估将在查询中需要该值时执行(存在值传输时间、数据库处理时间等)。我也知道它违反了很多原子性保证,并且在中止或中断的情况下可能会导致严重的问题。
不过,我很好奇。
【问题讨论】:
标签: sql bind ondemand sql-execution-plan sqlbindparameter