1

我在一次采访中被问到Select * from TableA如果需要大量时间来执行查询,可以使用哪些方法来优化查询。(TableA) 可以是任何具有大量数据的表。面试官没有给我留下任何选择,比如选择几列或使用“WHERE”子句,而是希望我为主题查询提供解决方案。

4

2 回答 2

10

很难知道面试官在找什么。

他们可能是相对缺乏经验和预期的答案,例如:

  • "列出所有列而不是 *,因为这样更快!"; 或者,
  • “添加一个 ORDER BY 因为这总是会加快它的速度!”

有经验的人可能正在寻找的东西是:

  • 检查查询计划,是否有计算列或其他类似的东西占用额外的资源?
  • 重新审视需求——用户真的需要以任意顺序排列整个表格吗?
  • 表上是否有聚集索引;如果不是,堆中是否充满了转发指针?
  • 基础表(和/或用于满足查询的索引)上是否存在过多的碎片?
  • 查询是否被阻止?
  • 查询在等待什么?
  • 查询是否在等待外部资源(例如糟糕的 I/O 子系统、内存授予、tempdb 自动增长)?
  • 由于统计信息已过时,查询是否并行且遭受数据包等待?

有很多潜在的事情可能会使查询变慢,或者可能使查询成为一个糟糕的选择。

于 2012-06-25T17:49:23.507 回答
0

实际上,一些数据库将具有优化命令,这些命令将重建数据库表以减少碎片 - 这种方式实际上提高了此类查询的性能。

PostgreSQL 和 SQLite 有命令

VACUUM;

MySQL 和 ORACLE 有一个命令

OPTIMIZE TABLE table;

它很昂贵,因为它会移动大量数据。但是这样做会使页面更加平衡,并且这种方式通常会缩小数据库的总大小(但是,某些数据库可能会决定在此时添加索引,因此它也可能会增长)。

由于数据是分页存储的,因此通过重建数据库减少页数可以提高SELECT * FROM table;语句的性能。

于 2013-05-23T14:55:08.830 回答