语境:
假设我有一个大查询(伪):
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
应用程序服务器上的运行时间,以及数据到达数据库服务器所需的时间)并由数据库处理)。
为什么我想知道:
好奇心。
我知道这样的事情可能会破坏查询计划器提供的很多(可能是全部)效率。我知道您永远无法保证绑定的评估将在查询中需要值时准确执行(存在值传输时间、数据库处理时间等)。我也知道它违反了许多原子性保证,并且在中止或中断的情况下可能会导致严重的问题。
不过,我很好奇。