以最少的停机时间重新导入大量数据的最佳方法


11

我每周大约需要导入约500,000条包含IP查找(只读参考)数据的记录(仅三个int / bigint cols)。

我真的不想担心将数据与现有表合并,我希望清除旧表并重新导入。

理想情况下,对数据运行的查询将继续运行(我们不会收到很多查询,可以接受的是,在导入期间它们的运行速度会稍慢一些,但需要提高24/7,所以运行此“时间不足”)。

到目前为止尝试过的事情

SSIS:我创建了一个SSIS包,该包会截断表并导入-运行大约需要30秒(实际上太长)。

临时表:导入到临时表中,进行截断和复制也大约需要30秒钟。

BCP:批量导入也相当慢(由于某种原因,它比SSIS慢(即使没有索引需要维护))-我猜想这与char-> int / bigint事务有关:/

镜子表?所以,此刻,我想知道如何通过视图读取表,将数据导入到镜像表中以及更改视图以指向该表...这似乎会很快,但是看起来很小对我有点

这似乎应该是一个普遍的问题,但我找不到推荐的做法-任何想法将不胜感激!

谢谢

Answers:


13

我过去使用过的一种解决方案(并且在此处以及之前在StackOverflow上已经推荐过)是创建两个其他架构:

CREATE SCHEMA shadow AUTHORIZATION dbo;
CREATE SCHEMA cache  AUTHORIZATION dbo;

现在在cache模式中创建表的模拟:

CREATE TABLE cache.IPLookup(...columns...);

现在,当您执行切换操作时:

TRUNCATE TABLE cache.IPLookup;
BULK INSERT cache.IPLookup FROM ...;

-- the nice thing about the above is that it doesn't really
-- matter if it takes one minute or ten - you're not messing
-- with a table that anyone is using, so you aren't going to
-- interfere with active users.


-- this is a metadata operation so extremely fast - it will wait
-- for existing locks to be released, but won't block new locks
-- for very long at all:

BEGIN TRANSACTION;
  ALTER SCHEMA shadow TRANSFER    dbo.IPLookup;
  ALTER SCHEMA dbo    TRANSFER  cache.IPLookup;
COMMIT TRANSACTION;


-- now let's move the shadow table back over to
-- the cache schema so it's ready for next load:

ALTER SCHEMA cache TRANSFER shadow.IPLookup;
TRUNCATE TABLE cache.IPLookup; 

-- truncate is optional - I usually keep the data
-- around for debugging, but that's probably not
-- necessary in this case.

如果您有外键和其他依赖项(因为您可能必须删除它们并重新创建它们),这将变得很麻烦,当然,它完全会使统计信息无效,这反过来会影响计划,但是如果最重要的是,可以在您的用户面前获得准确的数据,同时将中断降到最低,这是可以考虑的方法。


谢谢,另一个有趣的替代方法-我认为最后两个语句不太正确,应该将阴影移到缓存中并截断缓存。我想知道是否也可以使用同义词?
2012年

你是对的,我把那些混在一起。我不确定确切如何更好地使用同义词,我想这也是一种方法-具有指向同义词的视图,并在填充其他版本时更改事务中的基础同义词。我个人觉得这更好一些-当您查询dbo.IPLookup时,您知道那是“当前”表,而不必去追逐视图和同义词。
亚伦·伯特兰

仅供参考,我本周在博客上对此进行了更详细的介绍:sqlperformance.com/2012/08/t-sql-queries/…–
亚伦·贝特朗
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.