Mar*_*ark 11 sql-server bulk import
我需要每周导入大约 500,000 条包含 IP 查找(只读参考)数据的记录(只有三个 int/bigint cols)。
我真的不想担心将数据与现有表合并,我更愿意清除旧表并重新导入。
理想情况下,运行在数据上的查询将继续运行(我们没有得到很多这样的查询,它们在导入时运行得慢一点是可以接受的,但需要 24/7,所以运行这个“非工作时间”不是一种选择)。
到目前为止尝试过的事情
SSIS:我创建了一个 SSIS 包来截断表和导入 - 运行大约需要 30 秒(真的太长了)。
临时表:导入临时表、截断和复制也需要大约 30 秒。
BCP:批量导入也太慢了(出于某种原因,它比 SSIS 慢(即使没有要维护的索引)-我猜这与 char->int/bigint 事务有关:/
镜台?所以,目前,我想知道如何通过视图读取表,将数据导入镜像表,并更改视图以指向该表......这看起来会很快,但看起来很小对我来说有点hacky。
这似乎应该是一个常见问题,但我找不到推荐的做法 - 任何想法都将不胜感激!
谢谢
Aar*_*and 13
我过去使用过的一个解决方案(之前在这里和 StackOverflow 上都推荐过)是创建两个额外的模式:
CREATE SCHEMA shadow AUTHORIZATION dbo;
CREATE SCHEMA cache AUTHORIZATION dbo;
Run Code Online (Sandbox Code Playgroud)
现在在cache模式中创建表的模拟:
CREATE TABLE cache.IPLookup(...columns...);
Run Code Online (Sandbox Code Playgroud)
现在,当您进行切换操作时:
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.
Run Code Online (Sandbox Code Playgroud)
如果您有外键和其他依赖项(因为您可能必须删除它们并重新创建它们),这将更加麻烦,当然它会使统计信息等完全无效,这反过来会影响计划,但是如果最重要的是在您的用户面前以最少的中断获得准确的数据,这是一种可以考虑的方法。
| 归档时间: |
|
| 查看次数: |
2819 次 |
| 最近记录: |