gpt4 book ai didi

sql - 性能考虑 : Spread rows in multiple tables vs concentrate all rows in one table

转载 作者:行者123 更新时间:2023-12-02 05:23:48 25 4
gpt4 key购买 nike

性能考虑:将行分散在多个表中与将所有行集中在一个表中。

嗨。

我需要在 SQL DB 中记录有关应用程序中进行的每个步骤的信息。有某些表,我希望日志应该与以下内容相关:产品 - 应记录产品何时创建、更改等。顺序 - 与上面相同运输 - 相同等等等等等等

需要经常检索数据。

我对如何做到这一点没有什么想法:

  1. 有一个日志表,其中包含所有这些表的列,那么当我想在 UI 中表示某个产品的数据时,将执行 select * from Log where LogId = Product.ProductId。我知道这可能会很有趣,因为有很多cols,但我有这种感觉,性能会更好。另一方面,该表中将会有大量的行。
  2. 每种日志类型都有许多日志表(ProductLogs、OrderLogs 等)。我真的不喜欢这个想法,因为它不一致,并且拥有许多具有相同结构的表没有意义,但是(?)它可能是在行数较少的表中搜索时速度更快(我错了吗?)。
  3. 根据声明编号。 1,我可以做第二个多对一表,该表将具有 LogId、TableNameId 和 RowId 列,并将日志行引用到数据库中的许多表行,然后将有一个 UDF 来检索数据(例如日志 id 234属于 CustomerId 345 处的 Customer 表和 Product 表(其中 ProductId = RowId);我认为这是最好的方法,但是同样,可能会有大量的行,它会减慢搜索速度吗?或者这就是应该如何做,怎么说呢?...

以上列表中第 3 项的示例:

CREATE TABLE [dbo].[Log](
[LogId] [int] IDENTITY(1,1) NOT NULL,
[UserId] [int] NULL,
[Description] [varchar](1024) NOT NULL,
CONSTRAINT [PK_Log] PRIMARY KEY CLUSTERED
(
[LogId] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

GO
ALTER TABLE [dbo].[Log] WITH CHECK ADD CONSTRAINT [FK_Log_Table] FOREIGN KEY([UserId])
REFERENCES [dbo].[Table] ([TableId])
GO
ALTER TABLE [dbo].[Log] CHECK CONSTRAINT [FK_Log_Table]
---------------------------------------------------------------------
CREATE TABLE [dbo].[LogReference](
[LogId] [int] NOT NULL,
[TableName] [varchar](32) NOT NULL,
[RowId] [int] NOT NULL,
CONSTRAINT [PK_LogReference] PRIMARY KEY CLUSTERED
(
[LogId] ASC,
[TableName] ASC,
[RowId] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

GO
SET ANSI_PADDING OFF
GO
ALTER TABLE [dbo].[LogReference] WITH CHECK ADD CONSTRAINT [FK_LogReference_Log] FOREIGN KEY([LogId])
REFERENCES [dbo].[Log] ([LogId])
GO
ALTER TABLE [dbo].[LogReference] CHECK CONSTRAINT [FK_LogReference_Log]
---------------------------------------------------------------------
CREATE FUNCTION GetLog
(
@TableName varchar(32),
@RowId int
)
RETURNS
@Log TABLE
(
LogId int not null,
UserId int not null,
Description varchar(1024) not null
)
AS
BEGIN

INSERT INTO @Log
SELECT [Log].LogId, [Log].UserId, [Log].Description
FROM [Log] INNER JOIN
LogReference ON [Log].LogId = LogReference.LogId
WHERE (LogReference.TableName = @TableName) AND (LogReference.RowId = @RowId)
RETURN
END
GO

最佳答案

预优化数据库时要小心。大多数数据库都相当快并且有些复杂。您想首先运行效率测试。

其次,将所有内容放入一个表中,这样您想要的结果更有可能位于缓存中,这将极大地提高性能。不幸的是,这也使得您更有可能必须搜索一个巨大的表才能找到您要查找的内容。这可以通过索引部分解决,但索引并不是免费的(例如,它们使写入成本更高)。

我的建议是进行测试,看看性能是否真的很重要,然后测试不同的场景,看看哪个是最快的。

关于sql - 性能考虑 : Spread rows in multiple tables vs concentrate all rows in one table,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1142296/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com