![](/img/trans.png)
[英]Will SQL Select query select record which was inserted during Select query execution?
[英]Is there any way/platform on which SQL binds can be evaluated as-needed, during query execution?
内容:
假设我有一个大型查询(伪):
SELECT %boundthing,data
WHERE data in (
...do lots of long-running stuff
)
让我们假设在我的查询中没有使用boundthing
,而是在我想打印输出时使用(我知道这是一个愚蠢的用例,但这说明了我知道直到WHERE
子句运行后才需要boundthing
)。 。
boundthing
,如果我使用自己选择的编程语言将boundthing
的值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 ) ]
);
并且在WHERE
子句过滤了所有内容之后 (减去应用程序服务器上myfunc
的运行时间,但是将数据存储到数据包中花费的时间很长),输出中的“ boundthing”值将与应用程序服务器上的时间戳相对应。数据库服务器并由数据库处理)。
为什么我想知道:
好奇心。
我知道,类似这样的事情可能会破坏查询计划人员借出的很多(也许全部)效率。 我知道您永远无法保证将在查询中需要值时(确切的是值传输时间,数据库处理时间等) 准确执行绑定的评估。 我还知道,它违反了许多原子性保证,并且在中止或中断的情况下可能引起严重的问题。
不过,我很好奇。
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
希望对Zac有帮助。
-皮特
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.