繁体   English   中英

在查询执行期间,是否可以根据需要评估SQL绑定的任何方式/平台?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM