答案 0 :(得分:12)
这是一个很好的问题,如果相当宽泛(并且没有更糟糕的那样) 如果我了解你,那么你问的是如何从头开始攻击优化问题。
要问的第一个问题是:“是否存在性能问题?” 如果没有问题,那么你就完成了。通常就是这种情况。尼斯。
另一方面......
记录会让您经常查询 如果您正在使用某种数据访问层,那么添加代码来记录所有查询可能很简单 记录执行查询的时间以及每个查询所花费的时间也是一个好主意。这可以让您了解问题所在 此外,询问用户哪些位烦恼他们。如果缓慢的响应不会惹恼用户,那么无关紧要。
(我可能会误解这部分问题) 您正在寻找查询/响应时间中的任何模式 这些通常是对大型表或查询的查询,这些查询在单个查询中连接多个表。 ...但是如果您记录响应时间,则可以遵循这些指导。
您特别询问有关优化表格的信息 以下是您可以寻找的一些内容:
您可能也想my post on this。
答案 1 :(得分:1)
你的问题有点模糊。哪个数据库平台?
如果我们谈论的是SQL Server:
答案 2 :(得分:1)
如果不知道你在谈论哪个系统,那很难回答。
在Oracle中,例如,企业管理器允许您查看哪些查询占用时间最多,让您比较不同的执行配置文件,并允许您在一段时间内分析查询,以便您不添加索引。以牺牲您运行的每一个查询为代价来帮助查询。
答案 3 :(得分:0)
其余的数据取决于您拥有的数据类型以及设置方式。
答案 4 :(得分:0)
在SQL Server中,您可以使用跟踪来查找查询的执行情况。使用ctrl + k或l
例如,如果你看到在具有大量记录的表中发生全表扫描,那么它可能不是一个好的查询。
更具体的问题肯定能为您提供更好的答案。
答案 5 :(得分:0)
如果主要读取您的表,请在表中放置聚簇索引。
答案 6 :(得分:0)
我的经验主要是早期的DB2和一小部分Oracle。
如果你的DBMS有任何好处,它将能够收集特定查询的统计数据并解释它用于提取数据的计划。
例如,如果您有一个包含两列(日期和磁盘)的表(x)并且只有日期索引,则查询:
select diskusage from x where date = '2008-01-01'
将非常高效,因为它可以使用索引。另一方面,查询
select date from x where diskusage > 90
效率不高。在前一种情况下,“解释计划”会告诉您它可以使用索引。在后者中,它会说它必须进行表扫描以获取行(这基本上是查看每一行以查看它是否匹配)。
真正智能的DBMS'也可以解释你应该做些什么来提高性能(在这种情况下在diskusage上添加一个索引)。
至于如何查看正在运行的查询,您可以从DBMS收集它(如果它允许)或强制每个人通过存储过程进行查询,以便DBA控制查询的内容 - 这是他们的工作,保持数据库有效运行。
答案 7 :(得分:0)
答案 8 :(得分:0)
<强> 1。您用来确定频繁查询的模式有哪些?
取决于您处理数据库的级别。如果您是DBA或可以访问这些工具,那么像Oracle这样的db允许您在指定的时间段内运行作业并生成统计信息/报告。如果您是开发人员针对数据库编写应用程序,则可以在应用程序中进行性能分析。
<强> 2。如何选择优化因子?
我尝试了解表格的使用方式及其包含的数据。我回答以下问题。
是否会更新以及更新发生在哪些字段? 它是否有低基数的列?
值得编制索引吗? (如果通过索引访问,可以减慢非常小的表)
让它运行得更快值得多少维护/头痛?
更新/插入与查询的比率?
等
第3。可以做出哪些类型的更改?
- 如果使用Oracle,请保持最新统计信息! =)
- 规范化/反规范化可以根据表的用法改善性能。我几乎总是规范化,然后只有当我能够以其他实际方式使查询更快时才能进行规范化。对查询进行非规范化的一种很好的方法,当你的情况允许时,就是保持真实表的规范化并创建一个带有物化视图的非规范化“表”。
- 明智地指数。在许多层面上,太多可能是坏事。只要您不经常更新列并且该列的基数较低,BitMap索引在Oracle中就很棒。
- 使用索引组织表。
- 分区和子分区表和索引
- 使用存储过程减少应用程序的往返次数,提高安全性并启用查询优化,而不会影响用户。
- 如果合适,在内存中固定表格(访问量很大,相当小)
- 索引和表数据库文件之间的设备分区。
.....这个名单还在继续。 =)
希望这对你有所帮助。