|
|
1
10
here . 他们说批量插入具有更高的启动成本,但此后速度更快。在远程客户端场景中,它们在大约1000行处划出界限(对于“简单”服务器逻辑)。从他们的描述来看,我认为你应该可以使用TVP。性能上的损失(如果有的话)可能可以忽略不计,而且架构上的好处似乎非常好。
|
|
|
2
7
另一方面,SQL Server客户咨询团队提供了以下白皮书: Maximizing Throughput with TVP
我倾向于避免使用临时表,因为数据验证应该在应用层完成。通过使用TVPs,这很容易适应,并且存储过程中的TVP Table变量本质上是一个本地化的暂存表(因此与同时运行的其他进程没有冲突,就像使用实际表进行暂存时一样)。 关于问题中所做的测试,我认为可以证明它比最初发现的更快:
|
|
3
5
我想我还是坚持批量插入的方法。您可能会发现,使用具有合理行数的TVP仍然会命中tempdb。这是我的直觉,我不能说我已经测试过使用TVP的性能(不过我也对听别人的输入感兴趣) 您没有提到是否使用.NET,但我为优化以前的解决方案而采取的方法是使用 SqlBulkCopy SqlBulkCopy 类(例如)DataTable-这是将数据插入数据库的最快方法。5-10K行并不多,我已经使用了750K行。我怀疑,一般来说,使用TVP的几百行不会有很大的不同。但扩大规模对IMHO来说是有限的。 也许是新的 MERGE SQL 2008中的功能对您有好处吗? 另外,如果您现有的暂存表是用于此流程的每个实例的单个表,并且您担心争用等问题,您是否考虑过每次创建一个新的“临时”但物理的暂存表,然后在完成后将其删除? 注意:您可以通过在不使用任何索引的情况下填充此临时表来优化加载。然后,一旦填充完毕,在该点上添加任何所需的索引(FILLFACTOR=100以获得最佳读取性能,因为此时它不会被更新)。 |
|
|
4
-2
中转台很好!真的,我不想用别的方法。为什么?因为数据导入可能会发生意外的变化(通常是以您无法预见的方式,例如,当列仍被称为first name和last name,但在last name列中有first name数据时,选择一个不是随机的例子。)很容易研究暂存表的问题,这样您就可以确切地看到导入处理的列中有哪些数据。我想当你使用内存中的表时,很难找到。我知道很多人和我一样以进口为生,他们都建议使用中转表。我怀疑这是有原因的。
那么,您将如何取消所有的数据清理任务呢?你可能做得不一样,但仍然需要去做。同样,按照您描述的方式更改流程是非常危险的。 就我个人而言,听起来你只是因为使用了旧技术而不是因为有机会玩新玩具而生气。除了批量插入是如此2000之外,您似乎没有想要更改的实际依据。 |