WITH
A diferença entre cláusulas simples e detalhadas :
No tutorial do YouTube Tutorial 20 do SQL Server: Compressão de tabela, índice e linha , o exemplo da vez 5:43
contém uma WITH
cláusula simples das opções de índice, apenas WITH (DATA_COMPRESSION = ROW)
.
USE myDatabase;
CREATE TABLE dbo.Ch7RowCompression
(
ID int PRIMARY KEY,
FirstName varchar(50),
LastName varchar(50),
BirthDate datetime
)
WITH (DATA_COMPRESSION = ROW);
Entretanto, com o GUI Management Studio, o Storage > Manage Compression...
assistente gera comandos com uma WITH
cláusula mais detalhada, fornecendo explicitamente valores nas opções de índice. Por exemplo, para compactar um índice, ele obtém o comando de exemplo abaixo:
ALTER INDEX [SALES_ORDER_CREATED_AT] ON [schema].[sales_order]
REBUILD PARTITION = ALL WITH (
PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF
, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON
, DATA_COMPRESSION = PAGE
)
Outra observação sobre o comportamento do GUI Management Studio:
O GUI Management Studio gera comandos errados para desfazer uma compactação de índice.
Já habilitamos Script Data Compression Options
isso True
no contexto do Management Studio > Toolbar > Tools > Options... > SQL Server Object Explorer > Scripting > Object scripting options
. O sistema em teste possui Management Studio 2016 na versão 13.0.16106.4 e SQL Server 2016. Informe se precisar de mais detalhes.
Suspeitamos que o comportamento do sistema está errado ao desfazer a compactação em um índice: Por exemplo, ao definir a compactação de "Página" para "Nenhum", o assistente obtém o comando abaixo, faltando DATA_COMPRESSION = NONE
. E confirmamos no teste que o comando não desfaz a compactação.
ALTER INDEX [SALES_ORDER_CREATED_AT] ON [schema].[sales_order]
REBUILD PARTITION = ALL WITH (
PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF
, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON
)
O assistente funciona bem para desfazer a compactação em uma tabela , e o comando gerado inclui DATA_COMPRESSION = NONE
conforme o esperado.
Nossas perguntas:
Como obtemos um comando do SQL Server para fazer e desfazer a compactação? Pelo assistente da GUI, pela caligrafia ou por maneiras melhores?
Qual é a diferença entre a
WITH
cláusula simples e a cláusula detalhada com opções de índice explícitas? E, quando aWITH
cláusula não contém opção, qual será o valor padrão?Apenas verificando se todos os outros estão vendo o mesmo sintoma no GUI Management Studio tentando desfazer uma compactação de índice? Não tenho certeza se é um bug ou se perdemos alguma coisa.
Agradecemos quaisquer dicas e sugestões.
Os desenvolvedores que criaram o SSMS (SQL Server Management Studio) não são necessariamente os mesmos desenvolvedores que trabalharam no próprio produto SQL Server. Portanto, definitivamente há algumas discrepâncias entre o código que o SSMS gera automaticamente e qual seria o código ideal para determinados cenários.
Sua melhor aposta é sempre escrever o script sozinho, em vez de depender do SSMS. Isso lhe dará mais flexibilidade e confiabilidade, além de fazer com que você aprenda e entenda o que o código realmente faz.
A
WITH
cláusula detalhada gerada pelo SSMS inclui apenas todas as opções de reconstrução de índice disponíveis com seu valor atual para esse índice, independentemente de esse ser o valor padrão ou não, e independentemente de essa opção estar relacionada à compactação. O SSMS não rastreia quais valores são os valores padrão para cada uma dessas opções e, portanto, para garantir, ele apenas gera cada opção com seu valor atual, para garantir que uma opção não seja alterada acidentalmente ao ser omitida.Isso depende da opção específica e de seu valor padrão normal, que seria especificado na documentação da Microsoft no SQL Server.
Sim. Bug?...talvez ou possivelmente apenas por design (realmente falta de design).