【问题标题】:Sql optimization TechniquesSql优化技巧
【发布时间】:2010-11-10 15:10:01
【问题描述】:

我想了解拥有近 80,000 条记录的数据库的优化技术, 优化的可能性列表

我在 android 平台上用于我的移动项目 我使用 sqlite,我需要很多时间来检索数据

谢谢

【问题讨论】:

  • 您使用什么类型的数据库,您想要优化什么(速度、存储,两者兼而有之?)
  • 对于那些说“不是一个真正的问题”的人,我认为这是一个真正的问题,只是措辞不是很好。 Rakesh,你能说说你认为什么是慢的,以及为什么你需要优化。
  • 问一个一般的主题领域是合理的;此人只是要一份清单。
  • 我在 android 平台上用于我的移动项目,我需要花费大量时间来检索数据

标签: sql android sqlite


【解决方案1】:

好吧,只有 80,000 条记录,并且假设您的数据库设计良好且规范化,只需在 WHERE 或 ORDER BY 子句中经常使用的列上添加索引就足够了。

您可以使用其他更复杂的技术(例如对某些表进行非规范化、分区等),但这些技术通常只有在您处理数百万条记录时才会开始发挥作用。

预计到达时间:

我看到您更新了问题,提到这是在移动平台上 - 这可能会有所改变。

假设您根本无法削减数据集,您可以做的一件事是尝试对数据库进行一点分区。这里的想法是将您的一个大表拆分为几个较小的相同表,每个表都包含数据的子集。

给定行将进入哪些表取决于您选择如何对其进行分区。例如,如果您有一个范围为 0 到 10,000 的“customer_id”字段,您可能会将客户 0 - 2500 放在 table1 中,将 2,500 - 5,000 放在 table2 中,等等,将一个大表分成 4 个较小的表。然后,您的应用程序中有逻辑可以确定要查询哪个表(或多个表)以检索给定记录。

您可能希望以这样一种方式对数据进行分区,即您通常一次只需要查询一个分区。具体如何对数据进行分区取决于您拥有哪些字段以及如何使用它们,但总体思路是相同的。

【讨论】:

  • +1 - 好答案。与我的类似,但您对如何确定用于索引的列的建议更好。
【解决方案2】:
  • 创建索引
  • 删除索引

  • 标准化

  • 去规范化

【讨论】:

    【解决方案3】:

    如今,80k 行并不多。巧妙的索引以及利用这些索引的查询将为您提供正确的服务。

    【讨论】:

      【解决方案4】:

      了解如何显示查询执行图,然后了解它们的含义,然后相应地优化您的索引、表和查询。

      【讨论】:

        【解决方案5】:

        如此广泛的主题,这取决于您要优化的内容。但基础:

        • 索引。一个好的索引策略很重要,索引经常查询/排序的正确列很重要。但是,添加的索引越多,INSERT 和 UPDATE 的速度就越慢,因此需要权衡取舍。
        • 维护。保持索引碎片整理和最新统计信息
        • 优化查询。识别速度慢的查询(使用 SQL 2005 及更高版本提供的分析器/内置信息)并查看它们是否可以更有效地编写(例如,避免使用 CURSOR,尽可能使用基于集合的操作
        • 参数化/SP。使用参数化 SQL 来查询数据库,而不是使用硬编码搜索值的临时 SQL。这将允许更好的执行计划缓存和重用。
        • 从规范化的数据库架构开始,然后在适当的情况下取消规范化以提高性能

        80,000 条记录并不多,所以我会停在那里(大型数据库,有数百万数据行,我建议对数据进行分区)

        【讨论】:

        • SP 位颇有争议,对我来说是一件悬而未决的事情,但剩下的就是我要说的了。我认为很多人错过了那里的第三个选项,或者没有意识到他们的查询实际上有多不理想。
        • 出于这个原因,我更喜欢说“参数化 SQL”而不是 SP,因为它可能会引起长时间的争论,我们会整天都在这里:D
        【解决方案6】:

        您确实必须更具体地说明您想要做什么。您的业​​务组合是什么?你的表结构是什么? generic 建议是酌情使用索引,但对于这样一个通用问题,您不会得到太多帮助。

        此外,80,000 条记录也不算什么。这是一个中等大小的表,不应该让任何体面的数据库出汗。

        【讨论】:

          【解决方案7】:

          首先,如果您想要一个性能良好的数据库,索引确实是必不可少的。

          不过,除此之外,这些技术取决于您需要优化的内容:大小、速度、内存等?

          【讨论】:

            【解决方案8】:

            值得了解的一点是,在索引字段的where语句中使用函数会导致索引不被使用。

            示例(甲骨文):

            SELECT indexed_text FROM your_table WHERE upper(indexed_text) = 'UPPERCASE TEXT';
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2010-12-24
              • 1970-01-01
              • 1970-01-01
              • 2011-04-30
              • 2012-08-30
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多