【问题标题】:Is there any way/platform on which SQL binds can be evaluated as-needed, during query execution?在查询执行期间,是否有任何方式/平台可以根据需要评估 SQL 绑定?
【发布时间】: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


    【解决方案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
    

    希望对扎克有所帮助。

    -皮特

    【讨论】:

    • 这有点吓人,从任意代码执行的角度来看,但我猜是在紧要关头。也许有一天会有一个数据库驱动程序允许客户端指定(或提示)绑定评估技术。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-08-30
    • 2012-02-22
    • 2016-01-15
    • 2011-11-01
    • 2015-04-06
    • 1970-01-01
    • 2015-12-25
    相关资源
    最近更新 更多