【问题标题】:SQL (sybase) query using TOP N performs very badly when inserted into table使用 TOP N 的 SQL (sybase) 查询在插入表时执行非常糟糕
【发布时间】:2013-03-15 15:58:36
【问题描述】:

当您尝试将以下代码插入表或临时表时,我在使用 SYBASE ASE 时遇到性能问题:

    INSERT INTO #temp (Id)
    SELECT TOP 100 a.Id
    FROM TableA a
    INNER JOIN TableB b ON a.Id = b.Id
    WHERE a.SomeColumn = 'blah' and b.SomeColumn = 'Blah'
    ORDER BY a.Id

WHERE 子句并不那么重要...重要的是 SELECT 查询会在瞬间自行运行,但是一旦您尝试将其插入表中,则需要 2 分钟! !!

查看查询计划,优化器似乎没有考虑到估计的行数应该是 100,而是对 TableB 进行了表扫描。其自身的 select 语句似乎呈现了一个明智的计划,其中考虑了 TOP 100,但插入似乎使优化器采取了一条非常低效的路线。已尝试对此查询进行许多排列但无济于事。表A和B非常大,TOP N是必须的。也试过设置 rowcount 100 和相同的结果。

谁能建议解决这个问题?

谢谢

【问题讨论】:

    标签: sql tsql sap-ase


    【解决方案1】:

    你试过了吗:

    INSERT INTO #temp (Id)
    SELECT * FROM
    (
      SELECT TOP 100 a.Id
      FROM TableA a
      INNER JOIN TableB b ON a.Id = b.Id
      WHERE a.SomeColumn = 'blah' and b.SomeColumn = 'Blah'
      ORDER BY a.Id
    )
    

    它可能会产生一个稍微不同的执行计划。

    【讨论】:

    • 是的,尝试了类似的方法,但并没有真正的区别。另外,您实际上不能在 SYBASE ASE 的派生表中使用 ORDER BY。
    【解决方案2】:

    你为什么不试试这个,看看你是否还有问题。从技术上讲,如果 select 语句本身很快,那么 insert into 也应该很快。

    --INSERT INTO #temp (Id)
    SELECT TOP 100 a.Id
    INTO #temp
    FROM TableA a
    INNER JOIN TableB b ON a.Id = b.Id
    WHERE a.SomeColumn = 'blah' and b.SomeColumn = 'Blah'
    ORDER BY a.Id
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-25
      • 1970-01-01
      • 2021-03-11
      • 1970-01-01
      • 2012-05-06
      • 2014-11-24
      相关资源
      最近更新 更多