Sou novo no mundo do banco de dados e recentemente comecei a trabalhar com um grande banco de dados com várias tabelas principalmente com texto varchar e inteiros. As duas maiores tabelas são de aproximadamente 50 milhões e 25 milhões de linhas. O banco de dados contém cerca de 350.000 números de identificação para pessoas e muitas vezes preciso recuperar informações sobre todos os indivíduos que envolvem junções para ambas as minhas tabelas muito grandes (elas são um para muitos relacionamentos). Essas consultas também são de natureza temporal e envolvem obetween
operador para determinar eventos que acontecem sem um determinado período de tempo. Geralmente, leva de 10 a 15 minutos para que algumas dessas consultas sejam executadas (ainda estou aprendendo e tento novos índices para ver se consigo melhorar o desempenho. Depois de ficar sem memória RAM executando uma consulta específica, meu computador congelou e eu tive que reiniciar. Mesmo depois de reiniciar, não consegui desanexar, descartar conexões e excluir meus arquivos de log para excluir meu banco de dados (que estava no modo de recuperação).
Inicializei no modo de segurança para excluir os arquivos mdf e ldf e vi que meu arquivo de log tinha o dobro do tamanho do arquivo de dados. Se eu precisar executar consultas rotineiramente que retornarão informações temporais agregadas em tabelas do tamanho especificado acima, há algo que eu possa fazer para evitar o inchaço do log? Além disso, sei que o SQL Server consome recursos para o almoço, mas que tipo de especificações um computador precisa ter para executar uma consulta como a seguinte com os tamanhos de tabela listados acima? (demora uma hora na minha máquina local)
EDIT: este banco de dados é estático por natureza e não terá nada adicionado a ele. também está indisponível apenas para um usuário, eu. Não tenho certeza de que tipo de recuperação teve, não tenho esse PC na minha frente no momento.
consulta:
--my real database field names are not this generic
;with x
as
( --the first CTE finds the number of different classes a person qualified for and lists a number for a given date
select rx.pat_id
,c.cal_date
,COUNT(distinct rx.class) as distinctClass
from rx,Calendar as c
where c.cal_date between rx.fill_date and rx.script_end_date
group by rx.pat_id,c.cal_date
),y
as
( --the second CTE gives interval number to the date so the max and min date values can be grouped by grp_nbr to give a time span
select x.pat_id
,x.cal_date
,c2.id-ROW_NUMBER() over(partition by x.pat_id,x.distinctClass
order by x.cal_date) as grp_nbr
,x.distinctClass
from x
inner join Calendar as c2
on c2.cal_date=x.cal_date
)
--this groups the max and min dates with a particular grp_nbr and the number of different classes a person qualifies for
select y.pat_id,min(cal_date),max(cal_date),MIN(distinctClass)
from y
group by y.pat_id,grp_nbr
order by MIN(distinctClass) desc
Se o banco de dados for verdadeiramente estático por natureza, colocá-lo no modo somente leitura impediria o crescimento do log. As consultas que estão causando o crescimento falhariam, portanto, isso pode não ser realmente o que você está procurando.
Coloque o banco de dados no modo de recuperação simples. Dessa forma, os logs de transações serão rotineiramente truncados. Quando estiver no modo completo, seus logs continuarão a crescer até que seja feito o backup.