1

当您尝试将以下代码插入表或临时表时,我在使用 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 和相同的结果。

任何人都可以建议解决这个问题吗?

谢谢

4

2 回答 2

0

你为什么不试试这个,看看你是否还有问题。从技术上讲,如果 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
于 2013-01-17T05:10:04.903 回答
0

你有没有尝试过:

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
)

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

于 2013-01-04T01:35:51.570 回答