Otimização de tabela SQL Server
Olá pessoa!
Sou um usuário de nível intermediário do SQL Server e utilizo no meu dia a dia para consultas básicas, no entanto a estrutura do BD de onde trabalho é bem ruim, assim eu acabo por fazer as vezes do DBA tendo que criar e manter algumas tabelas, utilizo o SQL Server 2008. O meu problema é, tenho hoje uma tabela de transações que é atualizada todo dia com a inserção de pelo menos uns 900 mil registros e hoje esta tabela conta com mais de 100 milhões deles, não consigo ter uma chave primária pois tenho alguns campos como número da conta, número de cartão, data da transação e valor, ou seja, estes registros podem se repetir. O que eu fiz até o momento foi criar um indicie simples não clusterizado para conta, cartão e data de transação, um vez que são os principais campos usados nas nossas pesquisas e joins, o problema é que esta tabela esta ficando muito pesada, para cada consulta simples(como trazer o total transacionado nos últimos 6 meses por exemplo) demora em média 1 hora, para inserção dos registros, também é este tempo.
Alguém consegue me dar alguma dica de que tipo de índice eu poderia usar, se é melhor particionar ou algo do tipo, me desculpem pelo tamanho do texto e desde já agradeço a força.
Sou um usuário de nível intermediário do SQL Server e utilizo no meu dia a dia para consultas básicas, no entanto a estrutura do BD de onde trabalho é bem ruim, assim eu acabo por fazer as vezes do DBA tendo que criar e manter algumas tabelas, utilizo o SQL Server 2008. O meu problema é, tenho hoje uma tabela de transações que é atualizada todo dia com a inserção de pelo menos uns 900 mil registros e hoje esta tabela conta com mais de 100 milhões deles, não consigo ter uma chave primária pois tenho alguns campos como número da conta, número de cartão, data da transação e valor, ou seja, estes registros podem se repetir. O que eu fiz até o momento foi criar um indicie simples não clusterizado para conta, cartão e data de transação, um vez que são os principais campos usados nas nossas pesquisas e joins, o problema é que esta tabela esta ficando muito pesada, para cada consulta simples(como trazer o total transacionado nos últimos 6 meses por exemplo) demora em média 1 hora, para inserção dos registros, também é este tempo.
Alguém consegue me dar alguma dica de que tipo de índice eu poderia usar, se é melhor particionar ou algo do tipo, me desculpem pelo tamanho do texto e desde já agradeço a força.
Diogo Jorge
Curtidas 0
Melhor post
Alex Lekao
08/03/2019
Oi Diogo,
Cara nesse caso já não sei te dizer, 900 mil novos registros diários?
Dependendo do que for, tem que verificar a infra, no caso chegar o server, se tem memoria o suficiente, tipo de disco, tudo isso influenciara também na performance.
Não sei se o SQL apresenta plano de execução estimado para inserts, pode ser interessante dar uma olhada no plano de execução estimado, com isso ele apresentará ponto de maior incidência de tempo, indicará índices para serem criados e tal.
Atenciosamente,
Cara nesse caso já não sei te dizer, 900 mil novos registros diários?
Dependendo do que for, tem que verificar a infra, no caso chegar o server, se tem memoria o suficiente, tipo de disco, tudo isso influenciara também na performance.
Não sei se o SQL apresenta plano de execução estimado para inserts, pode ser interessante dar uma olhada no plano de execução estimado, com isso ele apresentará ponto de maior incidência de tempo, indicará índices para serem criados e tal.
Atenciosamente,
GOSTEI 1
Mais Respostas
Alex Lekao
08/03/2019
Oi Diego, bom dia!!!
Já experimentou criar Views para ver se ajuda no retorno das respostas?
Em alguns casos que tive, eu substitui os joins por outer apply, e a performance foi considerável, alem de aumentar a gama de tratativas em um único lugar, melhorando os resultados.
Espero que tenha te ajudado de alguma forma.
Atenciosamente,
Já experimentou criar Views para ver se ajuda no retorno das respostas?
Em alguns casos que tive, eu substitui os joins por outer apply, e a performance foi considerável, alem de aumentar a gama de tratativas em um único lugar, melhorando os resultados.
Espero que tenha te ajudado de alguma forma.
Atenciosamente,
GOSTEI 0
Diogo Jorge
08/03/2019
Fala Alex, blza?
Obrigado pela dica, cheguei a ver sim a implementação de views em alguns fóruns, mas será que isto também melhoraria a performance no que se trata dos inserts? Como eu disse, todos os dias carregamos uma média de 900 mil novos registros, este processo de inserção também demora bastante.
Obrigado pela dica, cheguei a ver sim a implementação de views em alguns fóruns, mas será que isto também melhoraria a performance no que se trata dos inserts? Como eu disse, todos os dias carregamos uma média de 900 mil novos registros, este processo de inserção também demora bastante.
GOSTEI 0
Fabiano Carvalho
08/03/2019
Boa tarde.
Voce precisa avaliar o servidor como um todo, monitorar o disco, processador e memoria e também olhar o plano de execução do SQL como ja mencionado.
Não basta somente criar um indice e pronto...
Como está o tempo de respostas dos arquivos MDF e LDF das bases? Se estiver acima de 80 é algo a ser analisado (Disco), verificar IOPS, enfim, não é algo tão simples de se resolver.
E sobre a chave primaria aconselho MUITO voce criar uma, nem que seja uma coluna nova, irá alivar um pouco a memória.
Voce precisa avaliar o servidor como um todo, monitorar o disco, processador e memoria e também olhar o plano de execução do SQL como ja mencionado.
Não basta somente criar um indice e pronto...
Como está o tempo de respostas dos arquivos MDF e LDF das bases? Se estiver acima de 80 é algo a ser analisado (Disco), verificar IOPS, enfim, não é algo tão simples de se resolver.
E sobre a chave primaria aconselho MUITO voce criar uma, nem que seja uma coluna nova, irá alivar um pouco a memória.
GOSTEI 1