Estou tentando usar o SQL In-Memory OLTP. A limitação é que a solução precisa ser compatível com o SQL Express 2019 e 2022.
Este link afirma que o In-Memory OLTP é compatível com todas as versões do SQL, incluindo o Express.
Com a versão 2022 não estou conseguindo iniciar:
EXECUTE master.dbo.xp_create_subdir 'C:\data\'
GO
ALTER DATABASE S2X ADD FILEGROUP S2x_mod
CONTAINS MEMORY_OPTIMIZED_DATA;
GO
ALTER DATABASE S2x ADD FILE (
name='S2x_mod1', filename='c:\data\S2x_mod1')
TO FILEGROUP S2x_mod;
Chego até a última parte da consulta acima e recebo o seguinte erro:
Não foi possível processar a operação. O gerenciador de réplicas do Always On Availability Groups está desabilitado nesta instância do SQL Server. Habilite o Always On Availability Groups usando o SQL Server Configuration Manager. Em seguida, reinicie o serviço do SQL Server e tente a operação atual novamente. Para obter informações sobre como habilitar e desabilitar o Always On Availability Groups, consulte os Manuais Online do SQL Server.
Ao tentar habilitar a opção por meio do SQL Server Configuration Manager, ele informa que não é possível ativar "Always On Availability Groups" com esta versão do SQL Express.
Com a versão 2019, superei a consulta acima e consegui criar uma tabela otimizada para memória e um procedimento armazenado nativo:
-- Creating a memory-optimized table
CREATE TABLE dbo.State
(
CID NVARCHAR(50) NOT NULL PRIMARY KEY NONCLUSTERED HASH WITH (BUCKET_COUNT = 1000),
PNO INT NOT NULL,
IsStart BIT NOT NULL,
IsEnd BIT NOT NULL,
CMPID NVARCHAR(50) NOT NULL
)
WITH (MEMORY_OPTIMIZED = ON, DURABILITY = SCHEMA_AND_DATA);
GO
CREATE PROCEDURE dbo.GetStateByCID
@CID NVARCHAR(50)
WITH NATIVE_COMPILATION, SCHEMABINDING, EXECUTE AS OWNER
AS
BEGIN ATOMIC WITH
(
TRANSACTION ISOLATION LEVEL = SNAPSHOT,
LANGUAGE = N'English'
)
SELECT CID, PNO, IsStart, IsEnd, CMPID
FROM dbo.State
WHERE CID = @CID;
END;
mas ao executá-lo:
EXEC @return_value = [dbo].[GetStateByCID]
@CID = N'1234'
Recebo o seguinte erro:
Ocorreu um erro ao executar o lote. A mensagem de erro é: Erro fatal de conexão interna. Estado do erro: 15, Token: 0
Não encontrei muita ajuda on-line sobre isso; mas parecia ser um problema que foi corrigido na versão 2017 (veja aqui ). Isso não faz muito sentido para mim, pois eu esperava que a correção fosse incluída na versão 2019 por padrão. Em qualquer caso, usar o In-Memory OLTP só seria possível para mim se fosse compatível com o Express 2019 e 2022.
O que estou esquecendo aqui? O In-Memory OLTP é compatível com SQL express ou não? Estou fazendo algo errado?
Sim, conforme documentado , é.
Sim.
Isso ocorre porque você está executando o RTM e não aplicou nenhum patch dos últimos ~3 anos. Isso foi corrigido no CU1 , a primeira atualização cumulativa. Depois de aplicado (CU14 é o mais recente no momento da escrita), você não terá esse problema. Espero que isso transmita a importância de aplicar patches.
Sua execução está incorreta com base no exemplo fornecido. Seu exemplo tem
@ConnectionID = N'1234'
como parâmetro, mas o procedimento armazenado compilado nativamente tem o parâmetro de,@CID
o que significa que você deve receber um erro sobre parâmetros esperados estão faltando. Provavelmente, devido à falta de patch, ele está tendo um problema que já foi corrigido. Não consegui que meu lote fosse encerrado do lado do servidor, como o seu, embora eu também não tenha tentado muito, pois está incorreto em muitos níveis, o que, quando corrigido, não deve ter problemas.Esse é um caso de uso, se você estiver encontrando caminhos quentes em locking e latching. A maioria deles não são tabelas grandes, mas menores que são frequentemente atualizadas ou usadas por múltiplas conexões simultâneas, como o estado da sessão em asp.net, no entanto, há outros usos, como absorção de choque para carregamento de dados (embora eu concorde com o comentário original de que esse cenário não é muito útil para a edição Express), ter tabelas sem registro (você não se importa com os dados, eles não precisam ser recuperados, mas precisam estar disponíveis), etc.
Não vi nada que especifique a necessidade absoluta de um mecanismo de banco de dados relacional totalmente na memória.