Construções com suporte nos procedimentos armazenados compilados de modo nativo
Este tópico contém uma lista de recursos com suporte para procedimentos armazenados compilados nativamente (CREATE PROCEDURE (Transact-SQL)):
Programação em procedimentos armazenados compilados nativamente
Funções internas em procedimentos armazenados compilados nativamente
Área da superfície de consulta em procedimentos armazenados compilados nativamente
Para obter informações sobre os tipos de dados suportados em procedimentos armazenados compilados de modo nativo, consulte Supported Data Types.
Para obter informações completas sobre construções sem suporte e sobre como resolver problemas de alguns recursos sem suporte em procedimentos armazenados compilados nativamente, consulte Migration Issues for Natively Compiled Stored Procedures. Para mais informações sobre os recursos sem suporte, veja Constructos do Transact-SQL sem suporte no OLTP in-memory.
Programação em procedimentos armazenados compilados nativamente
Há suporte para o seguinte:
BEGIN ATOMIC (no nível externo do procedimento armazenado), LANGUAGE, ISOLATION LEVEL, DATEFORMAT e DATEFIRST.
Declaração de variáveis como NULL ou NOT NULL. Se uma variável for declarada como NOT NULL, a declaração deverá ter um inicializador. Se uma variável não for declarada como NOT NULL, um inicializador será opcional.
IF e WHILE
INSERT/UPDATE/DELETE
Subconsultas têm suporte. Na cláusula WHERE ou HAVING, há suporte para AND e BETWEEN; não há suporte para OR, NOT e IN.
Tipos de tabela com otimização de memória e variáveis de tabela.
RETURN
SELECT
SET
TRY/CATCH/THROW
Para otimizar o desempenho, use um único bloco TRY/CATCH para um procedimento armazenado originalmente compilado inteiro.
Operadores com suporte
Há suporte para os operadores que se seguem.
Operadores de comparação (Transact-SQL) (por exemplo, >, , <>= e <=) têm suporte em condicionais (IF, WHILE).
Operadores unários (+, -).
Operadores binários (*, /, +, -, % (módulo)).
O operador de adição (+) tem suporte em números e cadeias de caracteres.
Operadores lógicos (AND, OR, NOT). OR e NOT têm suporte em instruções IF e WHILE, mas não nas cláusulas WHERE ou HAVING.
Operadores bit a bit ~, &, |, e ^
Funções internas em procedimentos armazenados compilados nativamente
As seguintes funções têm suporte em restrições padrão nas tabelas com otimização de memória e em procedimentos armazenados compilados nativamente.
Funções matemáticas: ACOS, ASIN, ATAN, ATN2, COS, COT, DEGREES, EXP, LOG, LOG10, PI, POWER, RADIANS, RAND, SIN, SQRT, SQUARE e TAN
Funções de data: CURRENT_TIMESTAMP, DATEADD, DATEDIFF, DATEFROMPARTS, DATEPART, DATETIME2FROMPARTS, DATETIMEFROMPARTS, DAY, EOMONTH, GETDATE, GETUTCDATE, MONTH, SMALLDATETIMEFROMPARTS, SYSDATETIME, SYSUTCDATETIME e YEAR.
Funções de cadeia de caracteres: LEN, LTRIM, RTRIM e SUBSTRING
Função de identidade: SCOPE_IDENTITY
Funções NULL: ISNULL
Funções uniqueidentifier: NEWID e NEWSEQUENTIALID
Funções de erro: ERROR_LINE, ERROR_MESSAGE, ERROR_NUMBER, ERROR_PROCEDURE, ERROR_SEVERITY e ERROR_STATE
Conversões: CAST e CONVERT. Não há suporte para conversões entre cadeias de caracteres Unicode e não Unicode (n(var)char e (var)char).
Funções do sistema: @@rowcount. As instruções dentro de procedimentos armazenados compilados nativamente atualizam @@rowcount e você pode usar @@rowcount em um procedimento armazenado compilado nativamente para determinar o número de linhas afetadas pela última instrução executada dentro desse procedimento armazenado compilado nativamente. No entanto, @@rowcount é redefinido como 0 no início e no final da execução de um procedimento armazenado compilado nativamente.
Área da superfície de consulta em procedimentos armazenados compilados nativamente
Há suporte para o seguinte:
BETWEEN
Aliases de nome de coluna (usando AS ou a sintaxe =).
CROSS JOIN e INNER JOIN, com suporte apenas com consultas SELECT.
As expressões têm suporte na lista SELECT e na cláusula WHERE (Transact-SQL) se usarem um operador com suporte. Consulte Supported Operators para obter a lista de operadores com suporte no momento.
Predicado de filtro IS [NOT] NULL
FROM <memory optimized table>
O GROUP BY (Transact-SQL) tem suporte, juntamente com as funções de agregação AVG, COUNT, COUNT_BIG, MIN, MAX e SUM. MIN e MAX não têm suporte para os tipos nvarchar, char, varchar, varchar, varbinary e binary. A Cláusula ORDER BY (Transact-SQL) terá suporte com GROUP BY (Transact-SQL) se uma expressão na lista ORDER BY aparecer textualmente na lista GROUP BY. Por exemplo, GROUP BY + b ORDER BY a + b tem suporte, mas GROUP BY a, b ORDER BY a + b, não.
HAVING, sujeita às mesmas limitações de expressão da cláusula WHERE.
INSERT VALUES (uma linha por instrução) e INSERT SELECT
ORDER BY 1
Predicados que não fazem referência a uma coluna.
SELECT, UPDATE e DELETE
TOP 1
Atribuição de variável na lista SELECT.
ONDE... E
1 ORDER BY e TOP têm suporte em procedimentos armazenados compilados nativamente, com algumas restrições:
Não há suporte para
DISTINCT
na cláusulaSELECT
ouORDER BY
.Não há suporte para
WITH TIES
ouPERCENT
na cláusulaTOP
.TOP
combinado comORDER BY
não dá suporte a mais de 8.192 ao usar uma constante na cláusulaTOP
. Esse limite poderá ser diminuído caso a consulta contenha junções ou funções de agregação. (Por exemplo, com uma junção (duas tabelas), o limite é 4.096 linhas. Com duas junções (três tabelas), o limite é 2.730 linhas.)Você pode obter resultados maiores que 8.192 armazenando o número de linhas em uma variável:
DECLARE @v INT = 9000 SELECT TOP (@v) ... FROM ... ORDER BY ...
No entanto, uma constante na cláusula TOP
resulta em um desempenho melhor comparado a usar uma variável.
Essas restrições não se aplicam ao acesso Transact-SQL interpretado em tabelas com otimização de memória.
Auditoria
A auditoria no nível de procedimento tem suporte em procedimentos armazenados compilados nativamente. Não há suporte para a auditoria no nível da instrução.
Para obter mais informações sobre a auditoria, consulte Criar uma especificação de auditoria de banco de dados e de servidor.
Dicas de tabela, consulta e junção
Há suporte para o seguinte:
Dicas INDEX, FORCESCAN e FORCESEEK, na sintaxe de dicas de tabela ou na Cláusula OPTION (Transact-SQL) da consulta.
FORCE ORDER
INNER LOOP JOIN
OPTIMIZE FOR
Para obter mais informações, consulte Dicas (Transact-SQL).
Limitações na classificação
Você pode classificar mais de 8.000 linhas em uma consulta que usa TOP (Transact-SQL) e uma cláusula ORDER BY (Transact-SQL). No entanto, sem a Cláusula ORDER BY (Transact-SQL),TOP (Transact-SQL) pode classificar até 8.000 linhas (menos linhas se houver junções).
Se a consulta usar o operador TOP (Transact-SQL) e uma Cláusula ORDER BY (Transact-SQL), você poderá especificar até 8.192 linhas para o operador TOP. Se você especificar mais de 8192 linhas, receberá a mensagem de erro: Msg 41398, Level 16, State 1, Procedure <procedureName>, LineNumber<> O operador TOP poderá retornar um máximo de 8192 linhas; <o número> foi solicitado.
Se você não tiver uma cláusula TOP, poderá classificar qualquer número de linhas com ORDER BY.
Se você não usar uma cláusula ORDER BY, poderá usar qualquer valor inteiro com o operador TOP.
Exemplo com TOP N = 8192: compila
CREATE PROCEDURE testTop
WITH EXECUTE AS OWNER, SCHEMABINDING, NATIVE_COMPILATION
AS
BEGIN ATOMIC WITH (TRANSACTION ISOLATION LEVEL = SNAPSHOT, LANGUAGE = N'us_english')
SELECT TOP 8192 ShoppingCartId, CreatedDate, TotalPrice FROM dbo.ShoppingCart
ORDER BY ShoppingCartId DESC
END;
GO
Exemplo com TOP N > 8192: falha ao compilar.
CREATE PROCEDURE testTop
WITH EXECUTE AS OWNER, SCHEMABINDING, NATIVE_COMPILATION
AS
BEGIN ATOMIC WITH (TRANSACTION ISOLATION LEVEL = SNAPSHOT, LANGUAGE = N'us_english')
SELECT TOP 8193 ShoppingCartId, CreatedDate, TotalPrice FROM dbo.ShoppingCart
ORDER BY ShoppingCartId DESC
END;
GO
A limitação de 8192 linhas só se aplica a TOP N
onde N
é uma constante, como nos exemplos anteriores. Se você precisar de N
maior que 8192, poderá atribuir o valor a uma variável e usar essa variável com TOP
.
Exemplo usando uma variável: compila
CREATE PROCEDURE testTop
WITH EXECUTE AS OWNER, SCHEMABINDING, NATIVE_COMPILATION
AS
BEGIN ATOMIC WITH (TRANSACTION ISOLATION LEVEL = SNAPSHOT, LANGUAGE = N'us_english')
DECLARE @v int = 8193
SELECT TOP (@v) ShoppingCartId, CreatedDate, TotalPrice FROM dbo.ShoppingCart
ORDER BY ShoppingCartId DESC
END;
GO
Limitações nas linhas retornadas: há dois casos em que isso pode, potencialmente, reduzir o número de linhas a serem retornadas pelo operador TOP:
Uso de JOINs na consulta. A influência de JOINs na limitação depende do plano de consulta.
Uso de funções de agregação ou de referências a funções de agregação na cláusula ORDER BY.
A fórmula para calcular o pior caso de N com suporte em TOP N é: N = floor ( 65536 / number_of_tables * 8 + total_size+of+aggs )
.
Consulte Também
Procedimentos armazenados compilados nativamente
Problemas de migração para procedimentos armazenados compilados nativamente