2016-08-16 11 views
10

Oto prawdziwa, naprawdę prosta funkcja, powraca deterministycznie. Jeśli skompiluję to natywne, to nie jest już deterministyczne. Jak mogę uczynić go natywnym skompilowanym i deterministycznym?Jak zoptymalizować pamięć SQL? Native Compiled Function 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' 
+0

Znalazłeś DOWOLNE sprocs, które są natywne, które powracają jako deterministyczne? – dfundako

+0

Nie znalazłem żadnych deterministycznych funkcji natywnych, wszystkie te, które piszę, nie są deterministyczne. –

+0

tylko zgaduję, ponieważ [docs] (https://msdn.microsoft.com/en-us/library/ms178091.aspx) nie zdradza tego szczegółu: czy wykluczyłeś część "ATOMIC WITH" jako już to spowodowało? ustalenie poziomu izolacji transakcji prawdopodobnie wpłynie na stan globalny i kwalifikuje się do niedeterminizmu. btw. Jakiej wersji używasz? – dlatikay

Odpowiedz

1

tylko przypuszczenie, nie mam 2016, aby go przetestować,
ale postaram się zmienić:

RETURN N';' 

DO

DECLARE @R AS NCHAR(1) = N';' 
RETURN @R 

Myślę, że problemem jest to, że N';' jest tworzony jako NVARCHAR(1), a następnie niejawnie przekonwertowany na NCHAR(1), więc być może konwersja czyni go nie deterministycznym.

+0

Spróbuję i dam ci znać. Dzieki za sugestie. –

+0

@AaronStainback czy spróbowałeś? Jestem ciekawy :) – MtwStark

+0

Nope wciąż wraca "NIE" :( –

Powiązane problemy