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