优化查询“从表A中选择*”

时间:2012-06-25 17:28:47

标签: sql-server tsql query-optimization

我在接受采访时被问到,如果需要花费大量时间来执行,我可以使用这些方法来优化查询Select * from TableA。 (TableA)可以是具有大量数据的任何表。面试官没有给我任何选择,如选择几列或使用“WHERE”条款而不是他希望我为主题查询提供解决方案。

2 个答案:

答案 0 :(得分:10)

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

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

  • “列出所有列而不是*,因为这样更快!”;或者,
  • “添加ORDER BY,因为这样可以加快速度!”

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

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

有许多潜在的事情可能会使查询变慢,这可能会使该查询成为错误的选择。

答案 1 :(得分:0)

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

PostgreSQL和SQLite有命令

VACUUM;

MySQL和ORACLE有一个命令

OPTIMIZE TABLE table;

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

由于数据存储在页面中,通过重建数据库来减少页数可以提高性能,即使对于SELECT * FROM table;语句也是如此。