Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/73.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在查询执行期间,是否有任何方式/平台可以根据需要对SQL绑定进行评估?_Sql_Bind_Ondemand_Sql Execution Plan_Sqlbindparameter - Fatal编程技术网

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

在查询执行期间,是否有任何方式/平台可以根据需要对SQL绑定进行评估?,sql,bind,ondemand,sql-execution-plan,sqlbindparameter,Sql,Bind,Ondemand,Sql Execution Plan,Sqlbindparameter,上下文: 假设我有一个大查询(伪): 让我们假设boundthing没有在我的查询中任何地方使用,而是在我想要打印输出时使用(我知道这是一个愚蠢的用例,但它说明了一点,我知道boundthing在WHERE子句运行之后才需要) 事实上,如果我用自己选择的编程语言将boundthing的值传递给我的查询,那么在我启动查询时就会对其进行计算,而不管数据库在多长时间后会实际“使用”它 问题: 是否有一种方法(在现有数据库/编程语言中)可以在查询中按需而不是在构建查询计划时设置要评估的绑定样式(即,它为

上下文:

假设我有一个大查询(伪):

让我们假设
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
的运行时间,以及数据到达数据库服务器并由数据库处理所花费的时间)

我想知道的原因:

好奇

我知道这样的事情可能会破坏查询计划器提供的很多(可能全部)效率。我知道,您永远无法保证在查询中需要值时(有值传输时间、数据库上的处理时间等)会准确执行绑定的评估。我还知道,它违反了许多原子性保证,在中止或停机的情况下可能会导致严重问题

不过,我还是很好奇

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
希望这能帮助扎克


-Pete

从任意代码执行的角度来看,这有点吓人,但我想这是在必要的时候工作的。也许有一天会有一个数据库驱动程序,允许客户端指定(或提示)绑定评估技术。
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