ここは本当に単純な関数ですが、これは確定的に戻ってきます。私がそれをネイティブにコンパイルすると、それはもはや確定的ではありません。どうすればそれをネイティブでコンパイルして決定論的にすることができますか?SQLメモリを最適化する方法ネイティブコンパイル済み関数deterministic
CREATE FUNCTION [hash].[HashDelimiter2]()
RETURNS NCHAR(1)
WITH SCHEMABINDING
AS BEGIN
RETURN N';'
END
GO
/* This does indeed result in YES */
SELECT IS_DETERMINISTIC
FROM INFORMATION_SCHEMA.ROUTINES
WHERE ROUTINE_NAME = 'HashDelimiter2'
/* But then compile it native and it's no longer deterministic */
CREATE FUNCTION [hash].[HashDelimiter3]()
RETURNS NCHAR(1)
WITH NATIVE_COMPILATION, SCHEMABINDING
AS BEGIN ATOMIC WITH (
TRANSACTION ISOLATION LEVEL = SNAPSHOT,
LANGUAGE = N'English'
)
RETURN N';'
END
GO
/* This results in NO */
SELECT IS_DETERMINISTIC
FROM INFORMATION_SCHEMA.ROUTINES
WHERE ROUTINE_NAME = 'HashDelimiter3'
決定的に戻ってくるネイティブスピーカーが見つかりましたか? – dfundako
決定論的なネイティブ関数が見つかりませんでした。それらの関数はすべて非決定論的に出てきます。 –
[docs](https://msdn.microsoft.com/en-us/library/ms178091.aspx)はこの詳細を知らせていないので、あなたは 'ATOMIC WITH'部分を既に起こっている?トランザクション分離レベルを設定することは、グローバル状態に影響を及ぼし、非決定論に適格である可能性が高い。 btw。どのバージョンを使用していますか? – dlatikay