簡體   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