在SQL数据库中执行10000次插入的最佳方法?

在SQL数据库中执行10000次插入的最佳方法?,sql,notifications,Sql,Notifications,当我把媒体上传到我的网站上时会发生什么;每个人都会收到通知。每个人都可以点击一个框来删除,它将永远从他们的消息队列中消失 如果我的网站上有10000人,我将如何将其添加到每个人的msg队列中?我可以想象这需要很多时间,所以我会选择文件系统日志之类的东西吗?标记我需要通知的人,数据然后我的当前位置。然后每隔100次左右更新我的位置?我需要一个PK在我的观察者名单,所以如果任何人登记在中间,我的订单不会被打破,因为我将排序通过PK < /P> 这是大规模通知系统的最佳解决方案吗 -编辑- 此网站是用

当我把媒体上传到我的网站上时会发生什么;每个人都会收到通知。每个人都可以点击一个框来删除,它将永远从他们的消息队列中消失

如果我的网站上有10000人,我将如何将其添加到每个人的msg队列中?我可以想象这需要很多时间,所以我会选择文件系统日志之类的东西吗?标记我需要通知的人,数据然后我的当前位置。然后每隔100次左右更新我的位置?我需要一个PK在我的观察者名单,所以如果任何人登记在中间,我的订单不会被打破,因为我将排序通过PK < /P> 这是大规模通知系统的最佳解决方案吗

-编辑-


此网站是用户创建的内容网站。管理员可以发送全局消息,而受欢迎的人可能有数千个订阅者。

可能只是为每个用户记录他们看到的通知-因此向用户显示的通知集是在他们的“最早通知”期限之前创建的(当他们注册时,或一周前…)减去他们承认的那些。这样,您就可以延迟插入任何内容,直到它一次成为单个用户为止。另外,如果您只向用户显示不到一周的消息,则可以清除一周或更长时间的“读取此通知”标志


(我的DBA在我以前的工作中给出了性能优化提示:“业务流程是最容易更改的,请先查看它们”)

可能只是为每个用户记录他们看到的通知-因此,要向用户显示的通知集是在“最早的通知”范围之前创建的(当他们注册时,或一周前…)减去他们已确认的内容。这样,您可以延迟插入任何内容,直到它同时成为单个用户为止-另外,如果您只向用户显示少于一周的消息,您可以清除一周或更长时间的“读取此通知”标志


(我的DBA在我以前的工作中给我的绩效优化提示:“业务流程是最容易改变的事情,先看看它们”)

如何插入记录可能不是解决此问题的最有效方法。您是否可以使用客户端cookie来存储用户是否删除了通知,或者即使他们清除了cookie,您是否也必须对此进行跟踪?如果上载新视频,应用程序只需将cookie与新视频记录id进行比较,然后决定显示或删除根据cookie中存储的内容隐藏通知。这将为您节省大量的数据库插入,并让客户端承担大部分繁重的工作。

插入记录可能不是解决此问题的最有效方法。您是否可以使用客户端cookie来存储用户是否删除了通知,或者您是否必须跟踪如果你上传了一个新的视频,应用程序就可以将cookie与新的视频记录id进行比较,并根据cookie中存储的内容决定显示或隐藏通知。这将为你节省大量的数据库插入,并让客户端负担最重。

如果你使用Postgres,你可以使用副本命令是其中最快的方法:

COPY tablename (col1, col2, col3) FROM '/path/to/tabfile';

其中,tabfile是一个以选项卡分隔的文件,包含大量条目。但是,如果存在一些唯一的约束,并且文件中存在重复项,则此操作将失败。

如果使用Postgres,则可以使用COPY命令,这是其中最快的方法:

COPY tablename (col1, col2, col3) FROM '/path/to/tabfile';

其中,tabfile是一个以选项卡分隔的文件,包含大量条目。但是,如果存在一些唯一的约束,并且文件中存在重复项,则此操作将失败。

如果在一个狭窄的多对多表中插入10000个内容,将收件人链接到邮件
(recipientid、messageid、status)
速度很慢,我希望您的设计会遇到更大的问题

这是一种操作,我通常不会担心批处理或在操作后订阅的人——基本上是:

假设SQL Server上已知
@publisherid
@msg

BEGIN TRANSACTION

INSERT INTO msgs (publisherid, msg)
VALUES(@publisherid, @msg)
SET @messageid = SCOPE_IDENTITY()

INSERT INTO msqqueue (recipientid, messageid, status)
SELECT subscriberid, @messageid, 0 -- unread
FROM subscribers
WHERE subscribers.publisherid = @publisherid

COMMIT TRANSACTION

如果10000次插入到一个狭窄的多对多表中,将收件人链接到邮件
(recipientid,messageid,status)
的速度很慢,我认为您的设计会遇到更大的问题

这是一种操作,我通常不会担心批处理或在操作后订阅的人——基本上是:

假设SQL Server上已知
@publisherid
@msg

BEGIN TRANSACTION

INSERT INTO msgs (publisherid, msg)
VALUES(@publisherid, @msg)
SET @messageid = SCOPE_IDENTITY()

INSERT INTO msqqueue (recipientid, messageid, status)
SELECT subscriberid, @messageid, 0 -- unread
FROM subscribers
WHERE subscribers.publisherid = @publisherid

COMMIT TRANSACTION

我想说的是让数据库处理好它有能力和设计的事情。插入和管理数据。不要试图用代码来处理,只需编写SQL来一次性插入数据。10000行对于所有真正的数据库来说都是骗局。

我想说的是让数据库处理好它有能力和设计的事情。插入和管理数据。不要尝试用代码来完成,只需编写SQL即可一次性插入数据。10000行对于所有真正的数据库来说都是骗局。

您使用的是什么数据库软件?它是在单台服务器上运行还是在主/从设置中运行,还是作为群集运行,或者…?请提供更多详细信息。Wim:我实际上没有任何详细信息。目前,我有一个使用C#和sqlite作为数据库的原型。你使用的是什么数据库软件?它是在一台服务器上运行的,还是在主/从设置中运行的,还是作为集群运行的?或者…?请提供更多细节。Wim:我实际上没有任何细节。目前,我有一个使用C#和sqlite作为数据库的原型。这听起来像是我不会做的事情o复制结构(更改时,而不是立即).但在这种情况下,这不是更糟吗?10000将持续轮询我,以查看我是否已更新?我不认为这更糟--即使在创建消息时插入了通知表,您将如何驱动通知用户--您一定已经轮询过了?是的,每个用户都将执行类似的操作“从message.created所在的消息中选择…”