表T:
ID      int   自增 pk
TITLE   nvarchar(1800)
TIME    datetime
ADDR    nvarchar(900)另有一视图V:
CREATE VIEW T
AS SELECT * FROM T需求要定时(大概每10分钟)对T进行大容量导入数据,此时对视图V进行查询:
select * from V where id in (...)
会阻塞很长时间,直到导入完成为止。现在这种情况已经影响正常使用了。请问哪位高手有什么好的解决办法?

解决方案 »

  1.   

    select * from V where id in (...)--------------------------------------1、不建议使用in,使用表关联。
    2、加with (nolock)查询。
      

  2.   

    select * from V where id in (...)
    -->改为select * 
    from V as A 
          inner join ()  AS B  on A.id=B.id
      

  3.   

    CREATE VIEW T
    AS SELECT * FROM T with (nolock)
      

  4.   

    楼主如是用BCP导入的话,请带上参数:-b batch_size
      

  5.   

    用内连接 OR 外连接方式,IN效率低。
      

  6.   

    那如果我在视图V中设置with (nolock)能不能在select的时候忽略lock而解决这个问题呢?
      

  7.   

    有日志记录和最小日志记录的大容量复制操作
    使用完整恢复模式时,所有由 bcp 执行的行插入操作都记录在事务日志中。如果数据量较大,会造成事物日志迅速写满。为了防止事务日志耗尽空间,当符合以下全部条件时,可以执行最小日志记录的大容量复制: 恢复模式是简单模式或大容量日志记录模式。
    没有正在复制目标表。
    目标表没有任何触发器。
    目标表具有 0 行或没有索引。
    指定了 TABLOCK 提示。有关更多信息,请参见控制锁定行为。 
    任何不满足上述条件的到 Microsoft® SQL Server™ 实例的大容量复制都将记入日志。在进行大容量复制操作前,如果在通常情况下使用完整恢复模式,则建议将恢复模式设置为大容量日志记录模式。这样可以防止大容量复制操作过多使用日志空间而可能写满日志。然而,即使使用大容量日志恢复模式,也将使用一些事务日志空间。可能需要在大容量复制操作期间创建事务日志备份以释放事务日志空间。当要将大量的行大容量复制到带有索引的表中时,可以通过删除所有索引,执行大容量复制,然后再重新创建索引来提高速度。有关更多信息,请参见优化大容量复制性能。说明  尽管在执行最小日志记录的大容量复制操作时,数据插入操作没有记录在事务日志中,但 SQL Server 仍会在每次为表分配新的扩展盘区时记录扩展盘区的分配。
      

  8.   

    那如果我在视图V中设置with (nolock)能不能在select的时候忽略lock而解决这个问题呢?
    =======SELECT查询语句默认情况下就是:with (nolock),又何改多此一举呢?楼主当然可以在查询语句(SELECT)中忽略lock,但问题还是解决不了的.
      

  9.   

    批量导入是必须要做的,而且随着数据量的增加,肯定会越来越慢,到时候就影响大了!
    我是用bulk insert在程序中来做批量导入的。我希望能够实现批量导入基本不影响查询的效果。请问各位有什么好的建议?
      

  10.   

    可以try一下:
    因为ID是自增长的,而且查询的条件也是ID,所以可以建一个cluster索引,不知道效果如何,因为我这边没有环境。