none
奇怪的锁的问题 RRS feed

  • 问题

  • 存在一个存储过程,用来将历史数据库中的数据移动到正式数据库中。刚才有一笔需要采取这种操作。

    其中第一个表满足条件的数据是800多笔,但是在正式数据库执行sp_lock发现就有2800多个表的X锁。

    导致不能运行完成。只得强制终止。

    请问要怎么解决这个问题呢


    If you haven't all the things you want,be grateful for the things you don't have that you didn't want.
    2011年9月29日 8:38

答案

  • In that case, I may copy rows to staging table in prod db via linked server first then copy rows from staging table to prod table locally.
    2011年9月30日 3:00
  • Join可以考虑在远程去做,用一个view,或者用远程的sql语句。这样就不用staging table了。

    但是如果远程数据库还有性能瓶颈的话,也许还是得用staging table。


    想不想时已是想,不如不想都不想。
    2011年10月1日 13:42
    版主

全部回复

  • 但是过一会执行又好了。 最开始执行的时候,检查根本没有任何其他进程来挡住这个session。 很奇怪
    If you haven't all the things you want,be grateful for the things you don't have that you didn't want.
    2011年9月29日 8:50
  • All those locks came from same session?
    2011年9月29日 13:21
  • All those locks came from same session?

    是的
    If you haven't all the things you want,be grateful for the things you don't have that you didn't want.
    2011年9月30日 0:33
  • Then you should look at lock level like row lock, page lock or index lock. Look like you need optimize the query a little bit.
    2011年9月30日 2:06
  • Then you should look at lock level like row lock, page lock or index lock. Look like you need optimize the query a little bit.


    很多的Page lock。

    我当时执行的是:

    SET IDENTITY_INSERT A ON

    INSERT A(a1,a2,a3)   select p.a1,p.a2,p.a3   FROM DBLINK.DBNAME.dbo.A AS P 
         INNER JOIN DBLINK.DBNAME.dbo.Lottestheader AS T
          ON P.Lottestid = T.Lottestid
          AND P.Lotid = T.Lotid
                        inner join DBLINK.DBNAMEdbo.w_d_archive_chips  L      
          On T.Lotid = L.Lotid
          and T.Waferid = L.Waferid
                            and T.Chipid=L.Chipid


    If you haven't all the things you want,be grateful for the things you don't have that you didn't want.
    2011年9月30日 2:29
  • Issue maybe on linked server. Why don't run the process on source server? That way, sql just copies result set to linked server and possible to use better plan for join.
    2011年9月30日 2:34
  • Issue maybe on linked server. Why don't run the process on source server? That way, sql just copies result set to linked server and possible to use better plan for join.

    因为在当前运行的数据库中的那些表存在identity列,必须在当前的数据库运行。远程不能使用set identity_insert on。
    If you haven't all the things you want,be grateful for the things you don't have that you didn't want.
    2011年9月30日 2:38
  • Why need identity if all rows are copied from other tables?
    2011年9月30日 2:42
  • Why need identity if all rows are copied from other tables?


    我们现在的逻辑是这样的。

    主数据库是我们的生产数据库,里面很多表都存在identity列。

    然后我们有一个历史数据库,历史数据库的资料都是从正式生产数据库来的。

    但是存在一些情况,会历史数据库的数据放回到正式生产数据库,这样就只能set identity_insert on才能插入进去


    If you haven't all the things you want,be grateful for the things you don't have that you didn't want.
    2011年9月30日 2:44
  • In that case, I may copy rows to staging table in prod db via linked server first then copy rows from staging table to prod table locally.
    2011年9月30日 3:00
  • In that case, I may copy rows to staging table in prod db via linked server first then copy rows from staging table to prod table locally.

    是的,这样可能会对速度上有一定的提升。
    If you haven't all the things you want,be grateful for the things you don't have that you didn't want.
    2011年9月30日 6:41
  • Join可以考虑在远程去做,用一个view,或者用远程的sql语句。这样就不用staging table了。

    但是如果远程数据库还有性能瓶颈的话,也许还是得用staging table。


    想不想时已是想,不如不想都不想。
    2011年10月1日 13:42
    版主
  • Join可以考虑在远程去做,用一个view,或者用远程的sql语句。这样就不用staging table了。

    但是如果远程数据库还有性能瓶颈的话,也许还是得用staging table。


    想不想时已是想,不如不想都不想。

    但是每次我都是传得不同的参数进去,写视图不行吧?
    If you haven't all the things you want,be grateful for the things you don't have that you didn't want.
    2011年10月2日 14:13
  • 视图也可以有条件啊,简单的说就是要让远程服务器去做Join


    想不想时已是想,不如不想都不想。
    2011年10月3日 3:29
    版主