Sql server “优化查询”;从表格A中选择*;

Sql server “优化查询”;从表格A中选择*;,sql-server,tsql,query-optimization,Sql Server,Tsql,Query Optimization,在一次采访中,我被要求了解如何优化查询Select*from TableA,如果查询需要花费大量时间执行。(TableA)可以是包含大量数据的任何表格。面试官没有给我留下任何选择,比如选择几个栏目或使用“WHERE”从句,而是希望我给出主题查询的解决方案。真的很难知道面试官在找什么 他们可能相对缺乏经验,期望得到如下答案: “列出所有列,而不是*因为这样更快!”;或者 “通过添加订单,因为这将始终加快速度!” 一个有经验的人可能要寻找的东西有: 检查查询计划,是否有计算列或其他类似内容占用

在一次采访中,我被要求了解如何优化查询
Select*from TableA
,如果查询需要花费大量时间执行。(TableA)可以是包含大量数据的任何表格。面试官没有给我留下任何选择,比如选择几个栏目或使用“WHERE”从句,而是希望我给出主题查询的解决方案。

真的很难知道面试官在找什么

他们可能相对缺乏经验,期望得到如下答案:

  • “列出所有列,而不是*因为这样更快!”;或者
  • “通过添加订单,因为这将始终加快速度!”
一个有经验的人可能要寻找的东西有:

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

有很多潜在的因素可能会使这个问题变得缓慢,或者可能使这个问题成为一个糟糕的选择。

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

他们可能相对缺乏经验,期望得到如下答案:

  • “列出所有列,而不是*因为这样更快!”;或者
  • “通过添加订单,因为这将始终加快速度!”
一个有经验的人可能要寻找的东西有:

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

有很多潜在因素可能会使查询速度变慢,或者使查询成为一个错误的选择。

事实上,有些数据库会使用optimize命令来重建数据库表以减少碎片,这样实际上可以提高此类查询的性能

PostgreSQL和SQLite拥有该命令

VACUUM;
MySQL和ORACLE有一个命令

OPTIMIZE TABLE table;
这是昂贵的,因为它将移动大量数据。但这样做会使页面更加平衡,这样通常会缩小数据库的总大小(但有些数据库此时可能会决定添加索引,因此也可能会增加)


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

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

PostgreSQL和SQLite拥有该命令

VACUUM;
MySQL和ORACLE有一个命令

OPTIMIZE TABLE table;
这是昂贵的,因为它将移动大量数据。但这样做会使页面更加平衡,这样通常会缩小数据库的总大小(但有些数据库此时可能会决定添加索引,因此也可能会增加)


由于数据存储在页面中,通过重建数据库来减少页面数量可以提高性能,即使对于
SELECT*FROM表声明。

你想过面试官说的话吗?索引、过滤器和键哦,天哪!在某种程度上,我认为他可能在嘲笑我,我无法得出任何解决方案,这就是为什么我在这里。真的很难知道他在寻找什么。他可能相对缺乏经验,并期望得到类似“列出所有列而不是*因为那样会更快”或“添加订单,因为这样会加快速度”的答案。一个有经验的人可能会寻找这样的答案:检查查询计划,看看是否有计算列或其他类似的东西占用额外的资源;重新审视需求——用户真的需要以任意顺序排列整个表吗?;表上是否有聚集索引;如果没有,它是否充满了前进的指针?这似乎是一个糟糕的、真正开放的问题,因为有太多的离题答案完全取决于你不知道的实际情况;答案包括向服务器添加内存以增加缓存、安装更快的网卡、使用分页查询(跳过/执行),因为这是用户感觉的缓慢等。你有没有想过面试官说的话?索引、过滤器和键哦,天哪!在某种程度上,我认为他可能在嘲笑我,我无法得出任何解决方案,这就是为什么我在这里。真的很难知道他在寻找什么。他可能相对缺乏经验,并期望得到类似“列出所有列而不是*因为那样会更快”或“添加订单,因为这样会加快速度”的答案。一个有经验的人可能会寻找这样的答案:检查查询计划,看看是否有计算列或其他类似的东西占用额外的资源;