【问题标题】:Slow query execution in an empty table. (after deleting a large amount of inserts)在空表中执行缓慢的查询。 (删除大量插入后)
【发布时间】:2010-12-10 11:11:19
【问题描述】:

我在 oracle 数据库中有一个包含 15 个字段的表。 该表有 3500000 次插入。我都删了。

delete
from table

之后,每当我执行一个选择语句
即使桌子是空的,我的反应也很慢(7 秒)。 只有在我搜索的情况下我才会得到正常响应 根据索引字段。

为什么?

【问题讨论】:

    标签: oracle indexing performance response


    【解决方案1】:

    正如 Gritem 所说,您需要了解高水位标记等

    如果您现在不想truncate 表(因为已插入新数据),请使用alter table xyz shrink space 记录的here 10g

    【讨论】:

      【解决方案2】:

      Tom Kyte 对这个问题有很好的解释:

      http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:492636200346818072

      它应该可以帮助您了解删除、截断和高水印等。

      【讨论】:

        【解决方案3】:

        在sql中,当你想彻底清除一个表时,你应该使用truncate而不是delete。假设您的表中有 350 万行,并且 bigint 列上有一个索引(唯一标识符),每行递增。截断表将完全清除表并将索引重置为 0。删除不会清除索引,并会在插入下一条记录时在 3,500,001 处继续。截断也比删除快得多。阅读以下文章以了解差异。

        阅读这篇文章Read this article,它解释了截断和删除之间的区别。有时间使用每一个。 Here 是另一篇 Oracle 观点的文章。

        【讨论】:

        • -1 用于将索引称为“唯一标识符”,当问题没有时完全提及索引,在 Oracle 问题中谈论 bigint,并以某种方式让您的答案被接受
        • 三个答案都让我满意。我接受了这个答案,因为它让我更清楚地理解了我的要求,并给了我 2 个文章链接以更详细地查看它。我检查了所有这些,发现答案比其他的更完整。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-07-30
        • 2017-09-29
        • 2017-05-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-09-10
        相关资源
        最近更新 更多