2009-09-14 72 views
0

为我的项目的一个托管共享托管服务器上 和asp.Net/C#与访问开发数据库的几个不同的原因(不是一种选择所以在这个限制不笑,这是不是来自我)。Access数据库性能

我的大部分查询都是查询数据库的最后几条记录。

我的问题是两个部分:

1是记录在数据库中的顺序唯一的视觉或者是有一个实际的差异在内部。更具体地说,我问的原因是,它目前设计的所有记录(对于此项目中的所有数据库)的方式是按行识别键(这是一个自动编号字段)排序,但由于超过80%的查询将如果我将表设置为在顶部而不是在最后显示最近的记录,是否会增加查询性能?

2-是否有任何其他性能调整可以帮助访问表?

“访问”和“性能”是一个委婉但数据库类型是不是一种选择 ,到目前为止还没有被证明是一个大问题,但如果我能帮助的性能 我确实希望尽我所能。

谢谢。

编辑:

  • 不,我目前没有遇到我目前的设置问题,只是想期待和优化的一切。

  • 是的,我确实有索引,并且每个表的唯一记录标识符上都有一个主键(自动索引)。我绝对应该提到这一点。

  • 你们都说同样的事情,我已经在为访问性能做所有事情。我会给那个答案最快的答案提供“接受答案”的问题。 谢谢大家。

回答

3

据我知道...

1 - 这种变化也只是视觉。没有影响。

2 - 确保您的字段已编入索引。如果您要查询的字段是唯一的,那么请确保您将字段设置为唯一键。

0

该命令很可能不是问题。另外,我不认为你可以在Access中真正改变它。

重要的是您如何访问这些记录。你是否通过记录ID直接访问它们?无论您使用哪种标准来查找所需的数据,都应该定义适当的索引。

默认情况下,主键列上只有一个索引,所以如果您使用的是其他列(或列的组合),则应该创建一个或多个索引。

不要只是在每一列上创建一个索引。更多索引意味着当插入或更新新记录时,Access需要保持全部记录,这使得它更慢。

Here's one article关于Access中的索引。

0

查看您用来查询数据的字段或字段,并确保您在这些字段上有索引。如果它与SQL服务器相同,则不需要在索引中包含主键(假设它是集群化的),因为它默认包含在内。

如果您在一小部分字段上运行查询,您可以通过包含所有需要的字段来使索引成为'覆盖'索引,这里有一个空间折衷因素,所以我只是推荐它适用于5个领域或更少,取决于您的要求。

1

是的,存在数据库中记录的实际顺序。设置表格首选项的默认值不会改变这一点。

我会确保所有的where子句列有索引。这是一条经验法则。这很少是最佳的,但是您必须针对不同的数据库设置进行工作负载测试,以证明最佳的解决方案。

我每天工作的传统访问系统可以与并发用户合理快速地访问,但仅适用于少数用户。

+0

在某些情况下,仅在Where子句中使用的布尔字段上的索引可能会使性能惊人地增加。这些可以在“主”或“查找”表上,例如乔布斯或客户。 – 2009-09-14 18:57:25

0

您是否确实遇到性能问题,或者这只是一个普遍的优化问题?同样从你的帖子听起来你正在谈论一个带有1个表的数据库,这是否准确?如果您已经遇到了问题,你正在处理的并发访问,一些答案可能是:在使用

1)建立索引的字段where子句(已经提到)

2)拆分表。例如,如果只有80%的表行未被访问(如问题中所暗示的那样),则为较旧的记录创建一个归档表。或者,如果大部分效果点击来自读取(复杂报表),并且您不想影响添加记录的人的效果,请创建单独的报表结构并从中进行查询。 3)如果这是一个报告场景,所有查询都是相似或相同的,并发性有些高(给定Access的相对数量很大),并且数据不是非常不稳定的,可以考虑将数据保存到一个可以是定期更新,从而从Access引擎中卸载查询工作负载。

0

关于表格顺序,Jet/ACE以PK顺序编写实际表格日期。如果你想要一个不同的订单,改变PK。

但是,这不应该是一个重要的问题。

除了排序的PK之外的字段上的索引应该使排序非常快。我有几百个数据记录的应用程序,这些记录或多或少地立即返回非PK排序顺序的数据子集。

我认为你在进行“不成熟的优化”,在你真正遇到问题之前担心某些事情。

我认为你会遇到性能问题的唯一情况是,如果你有一张包含数千个记录的100个表格,并且你试图将整个事件呈现给最终用户。这将是一个非常用户敌对的事情,所以我不认为这是你应该担心的事情。

如果确实是一个问题,那么您应该考虑将您的PK从自动编号更改为自然键(尽管由于真实世界的数据以及禁止复合唯一索引中的非空字段,可能会产生问题) 。

0

我有几件事情要补充一点,我在这里被提及并没有注意到,至少没有明确:

  • 字段长度,创建领域一样大,你需要他们但不要超过 - 例如,如果你有一个数字字段,并且该数值永远不会超过1000(为了参数),那么不要将它输入为长整数,像Integer这样的小整数会更合适,或者对十进制数使用单个而不是双精度等等。同样,如果你有一个不超过50个字符的文本字段,不要将它设置为255等。声音显而易见的,但它已经完成,常常带着“我将来可能需要这个空间”的想法d您的应用程序在此期间遭受损失。

  • 不要击败索引的东西去死...... 但是,你在查询中加入的表应该建立关系,这将在外键上创建索引,这会极大地提高表的性能连接(注意:仔细检查任何外键以确保它们确实得到索引,我已经看到它们没有被搜索到的情况 - 显然这种关系并不明确表示已经创建了正确的索引)

  • 显然,经常压缩数据库可以帮助提高性能,这样可以减少文件的内部碎片,并且可以加速这种情况。

  • 访问实际上有一个性能分析器,在工具分析>性能,它可能是值得运行它放在你的桌子至少&查询,看看它有出现。 表分析仪(可从同一菜单中获得)可以帮助您分割出包含大量冗余数据的表格,显然,请谨慎使用 - 但这可能会有所帮助。

此链接在数据库,表格,查询,表单等几乎所有方面的访问性能优化方面有一堆东西 - 值得肯定的检查。

http://office.microsoft.com/en-us/access/hp051874531033.aspx

0

要了解这里的答案,考虑如何获得工作,在未索引的表有不太可能在如此最近访问的记录是在年底组织数据的价值是有用的。事实上,由于Access/JET引擎是ISAM数据库,这是相反的。 (http://en.wikipedia.org/wiki/ISAM)这是相当有意义的,但我从不建议将经常访问的值放在表的顶部,最好像其他人所说的那样依赖于有用的索引。