Temos um problema com algumas tabelas que são muito grandes, deixando o sistema lento. então minha dúvida é se esse tamanho é normal para a quantidade de linhas da tabela, e também o que poderia ser feito para torná-la menor e mais leve para não deixar tudo lento.
CREATE TABLE [dbo].[TransactionEntry](
[TransactionEntryID] [uniqueidentifier] NOT NULL,
[TransactionID] [uniqueidentifier] NULL,
[ItemStoreID] [uniqueidentifier] NULL,
[Sort] [int] NULL,
[TransactionEntryType] [int] NOT NULL,
[Taxable] [bit] NULL,
[Qty] [decimal](19, 3) NULL,
[UOMPrice] [money] NULL,
[UOMType] [money] NULL,
[UOMQty] [decimal](19, 3) NULL,
[Total] [money] NULL,
[RegUnitPrice] [money] NULL,
[DiscountPerc] [decimal](19, 3) NULL,
[DiscountAmount] [money] NULL,
[SaleCode] [nvarchar](50) NULL,
[PriceExplanation] [nvarchar](50) NULL,
[ParentTransactionEntry] [uniqueidentifier] NULL,
[AVGCost] [money] NULL,
[Cost] [money] NULL,
[ReturnReason] [int] NULL,
[Note] [nvarchar](50) NULL,
[DepartmentID] [uniqueidentifier] NULL,
[DiscountOnTotal] [decimal](19, 3) NULL,
[Status] [smallint] NULL,
[DateCreated] [datetime] NULL,
[UserCreated] [uniqueidentifier] NULL,
[DateModified] [datetime] NULL,
[UserModified] [uniqueidentifier] NULL,
[TotalAfterDiscount] [decimal](18, 3) NULL,
[TaxID] [uniqueidentifier] NULL,
[TaxRate] [decimal](18, 4) NULL,
CONSTRAINT [PK_TransactionEntry] PRIMARY KEY CLUSTERED
(
[TransactionEntryID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 90) ON [PRIMARY]
) ON [PRIMARY]
GO
Essa não é uma tabela grande, o SQL-Server deve ser capaz de lidar com isso facilmente, supondo que você esteja executando em hardware de nível de servidor. Se o seu hardware estiver com pouca potência, nada do que dissermos poderá resolver o problema completamente.
Você pode ter problemas de desempenho relacionados ao uso de GUIDs. Seu PK é clusterizado e é um GUID, isso significa que ele está continuamente movendo linhas na inserção para manter o índice clusterizado correto. Se você não estiver usando
newsequentialid
o valor padrão de seus GUIDs, terá um problema aqui. É claro que as junções são mais rápidas usando chaves int, mas provavelmente é tarde demais para redesenhar completamente em torno disso.Você pode precisar experimentar índices - você quer aqueles que funcionem com suas consultas, mas muitos retardarão consideravelmente as inserções.
Quando foi a última vez que você atualizou as estatísticas ou reindexou a tabela?
Você pode olhar para o particionamento da tabela por data. Isso pode acelerar as coisas. Se você não tiver o Enterprise Edition e o hardware certo para particionar, poderá arquivar registros antigos e usá-los apenas para geração de relatórios, unindo os registros ativos na tabela principal com os registros inativos na tabela de arquivamento. Assim, você teria muito menos registros para lidar com a maior parte do seu trabalho.
Mas claramente o que você precisa com mais urgência é um bom DBA sólido que saiba como ajustar o desempenho. Alguém que não permitirá que você cometa erros de design no futuro e que tenha a habilidade e a capacidade de refatorar seu sistema para fazê-lo funcionar. O ajuste de desempenho não é o tipo de coisa que você pode aprender fazendo perguntas em um quadro como este. É um assunto complexo que exige um bom conhecimento adquirido ao longo dos anos e trabalhando com muitos bancos de dados. Se você não tem DBA, contrate um. Para projetos posteriores, você provavelmente deve contratar um em tempo de design; os bancos de dados são difíceis de refatorar e precisam ser projetados para desempenho desde o início.