![](/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.