Você está na página 1de 3

Arquivo txt vazio 05

Considere substituir a tabela temporária global pela seguinte tabela com otimização
de memória que tem DURABILITY = SCHEMA_ONLY.

SQL

Copiar
CREATE TABLE dbo.soGlobalB
(
Column1 INT NOT NULL INDEX ix1 NONCLUSTERED,
Column2 NVARCHAR(4000)
)
WITH
(MEMORY_OPTIMIZED = ON,
DURABILITY = SCHEMA_ONLY);
Etapas B.1
A conversão de temporário global para SCHEMA_ONLY é o seguinte:

Crie a tabela dbo.soGlobalB uma vez, como faria com qualquer tabela no disco
tradicional.
No Transact-SQL, remova a criação da tabela ##tempGlobalB . É importante criar a
tabela com otimização de memória no momento da implantação, não em um runtime, para
evitar a sobrecarga de compilação que acompanha a criação da tabela.
No T-SQL, substitua todas as menções de ##tempGlobalB por dbo.soGlobalB.
C. Cenário: substituir #table de tempdb de sessão
As preparações para substituir uma tabela temporária de sessão envolvem mais T-SQL
que para o cenário anterior da tabela temporária global. Felizmente o T-SQL extra
não significa a necessidade de mais esforço para realizar a conversão.

Assim como no cenário de tabela temporária global, a maior alteração é criar a


tabela no momento da implantação, não no runtime, para evitar a sobrecarga de
compilação.

Suponha que você tem a seguinte tabela temporária de sessão.

SQL

Copiar
CREATE TABLE #tempSessionC
(
Column1 INT NOT NULL ,
Column2 NVARCHAR(4000)
);
Primeiro, crie a função de valor de tabela a seguir para filtrar em @@spid. A
função poderá ser usada por todas as tabelas SCHEMA_ONLY convertidas de tabelas
temporárias de sessão.

SQL

Copiar
CREATE FUNCTION dbo.fn_SpidFilter(@SpidFilter smallint)
RETURNS TABLE
WITH SCHEMABINDING , NATIVE_COMPILATION
AS
RETURN
SELECT 1 AS fn_SpidFilter
WHERE @SpidFilter = @@spid;
Em segundo lugar, crie a tabela SCHEMA_ONLY, bem como uma política de segurança na
tabela.

Observe que cada tabela com otimização de memória deve ter pelo menos um índice.

Para a tabela dbo.soSessionC, um HASH de índice pode ser melhor se for possível
calcular o BUCKET_COUNT apropriado. Porém para este exemplo, simplificamos um
índice NONCLUSTERED.
SQL

Copiar
CREATE TABLE dbo.soSessionC
(
Column1 INT NOT NULL,
Column2 NVARCHAR(4000) NULL,

SpidFilter SMALLINT NOT NULL DEFAULT (@@spid),

INDEX ix_SpidFiler NONCLUSTERED (SpidFilter),


--INDEX ix_SpidFilter HASH
-- (SpidFilter) WITH (BUCKET_COUNT = 64),

CONSTRAINT CHK_soSessionC_SpidFilter
CHECK ( SpidFilter = @@spid ),
)
WITH
(MEMORY_OPTIMIZED = ON,
DURABILITY = SCHEMA_ONLY);
go

CREATE SECURITY POLICY dbo.soSessionC_SpidFilter_Policy


ADD FILTER PREDICATE dbo.fn_SpidFilter(SpidFilter)
ON dbo.soSessionC
WITH (STATE = ON);
go
Em terceiro lugar, seu código geral T-SQL:

Altere todas as referências à tabela temporária em suas instruções Transact-SQL


para a nova tabela com otimização de memória:
Antigo: #tempSessionC
Nova: dbo.soSessionC
Substitua as instruções CREATE TABLE #tempSessionC no seu código com DELETE FROM
dbo.soSessionC, para garantir que uma sessão não seja exposta ao conteúdo da tabela
inserido por uma sessão anterior com o mesmo session_id. É importante criar a
tabela com otimização de memória no momento da implantação, não em um runtime, para
evitar a sobrecarga de compilação que acompanha a criação da tabela.
Remova as instruções DROP TABLE #tempSessionC do seu código. Opcionalmente, você
pode inserir uma instrução DELETE FROM dbo.soSessionC caso o tamanho de memória
seja um problema potencial
D. Cenário: Uma variável da tabela pode ter MEMORY_OPTIMIZED=ON
Uma variável de tabela tradicional representa uma tabela no banco de dados tempdb.
Para um desempenho muito mais rápido, você pode otimizar a memória da variável de
tabela.

Aqui está o T-SQL para uma variável de tabela tradicional. Seu escopo termina
quando o lote ou a sessão termina.

SQL
Copiar
DECLARE @tvTableD TABLE
( Column1 INT NOT NULL ,
Column2 CHAR(10) );
D. 1 Conversão embutida para explícita
A sintaxe anterior deve criar a variável de tabela embutida. A sintaxe embutida não
dá suporte à otimização da memória. Por isso, vamos converter a sintaxe embutida na
sintaxe explícita para o TYPE.

Escopo: A definição TYPE criada pelo primeiro lote delimitado por go persiste mesmo
depois que o servidor é desligado e reiniciado. Porém, após o primeiro delimitador
go, a tabela declarada @tvTableC persiste somente até o próximo go ser atingido e o
lote terminar.

SQL

Copiar
CREATE TYPE dbo.typeTableD
AS TABLE
(
Column1 INT NOT NULL ,
Column2 CHAR(10)
);
go

SET NoCount ON;


DECLARE @tvTableD dbo.typeTableD
;
INSERT INTO @tvTableD (Column1) values (1), (2)
;
SELECT * from @tvTableD;
go
D.2 Conversão explícita em disco para otimização de memória
Uma variável de tabela com otimização de memória não reside em tempdb. A otimização
de memória resulta em um aumento de velocidade geralmente 10 vezes mais rápido ou
ainda maior.

A conversão para a otimização de memória é obtida em apenas uma etapa. Aprimore a


criação de TYPO explícito para o seguinte, que adiciona:

Um índice. Novamente, cada tabela com otimização de memória deve ter pelo menos um
índice.
MEMORY_OPTIMIZED = ON.
SQL

Você também pode gostar