Um cliente deseja que nosso aplicativo processe mais dados com mais rapidez, então agende uma reunião com seu dba para discutir as opções.
Este aplicativo gera muitos dados que são usados para relatórios. Antes de cada execução, os dados antigos desse item são excluídos, os cálculos são executados e, em seguida, os novos dados são inseridos. Em períodos de maior movimento, os usuários enfileiram centenas dessas tarefas de geração e executamos até 30 delas simultaneamente. Cada execução pode criar 60 mil linhas.
O dba sugeriu que poderíamos alterar o aplicativo para usar 30 partições (por exemplo, uma por thread) para reduzir o bloqueio entre threads durante a inserção e exclusão. Eles sugeriram que no sql padrão poderíamos fazer algo como
INSERT INTO schema.table.partition (...) VALUES (...)
Não vejo essa sintaxe nos documentos do msdn e isso significará alterar esse aplicativo, o que é uma dor, mas é possível fazer isso? Pelo que entendi, em vez disso, particionaríamos com base nas colunas das tabelas usando funções de partição?
Eu li os documentos de função de criação de partição, mas não tenho certeza de como criar uma função para atender às nossas necessidades. Para piorar a situação, ainda não tenho a edição corporativa para testar isso, então peço desculpas pela sintaxe incorreta.
Estou pensando que, por exemplo, se tivermos uma tabela de itens e uma tabela itemdata com dados para esse item, podemos particionar a tabela itemdata dividindo os dados com base em uma função como itemid mod 30
. Isso colocaria o item 1 na partição 1, o item 2 na partição 2 etc. Não tenho certeza se poderíamos fazer isso na função de partição, no esquema, na declaração da tabela ou precisaríamos criar uma coluna calculada e usar um cláusula de valores? Também não tenho certeza se veremos alguma melhoria de desempenho?
É assim que acho que poderíamos implementar isso:
CREATE PARTITION FUNCTION SplittingItemIds_PFunc(decimal(18,0)) AS
RANGE LEFT FOR VALUES
(0,1,2,3, ... ,29)
CREATE PARTITION SCHEME SplittingItemIds_Scheme
AS PARTITION SplittingItemIds_PFunc
ALL TO ([PRIMARY]);
CREATE TABLE ItemData
(
Id decimal(18,0),
ItemId decimal(18,0),
...
)
ON PartitionSplittingItemIds_Scheme(ItemId % 30)
CREATE INDEX ItemData_ItemId_Idx ON ItemData(ItemId);
Isso está certo? Pelo que li, o índice será particionado automaticamente - correto?
O software não pode consertar isso se os IO/discos subjacentes forem opacos para você.
Eu trabalhei em sistemas semelhantes onde tínhamos
Nós também
Parece que o dba está falando sobre particionamento horizontal em vez de particionamento de tabela, quebrando as tabelas problemáticas usando regras, como todos os clientes que começam com a letra a na tabelaA, b na tabelaB, etc. Isso pode ser útil em algumas circunstâncias , e pode ser feito com qualquer edição do servidor SQL, mas tem muitos dos mesmos problemas já mencionados, ou seja, E/S.