当前位置: 首页 > 面试题库 >

选择*与选择列

太叔马鲁
2023-03-14
问题内容

如果我只需要2/3列,而是查询SELECT *而不是在select查询中提供这些列,那么关于更多/更少I / O或内存的性能是否会有所下降?

如果我确实选择了*,则可能会出现网络开销。

但是在选择操作中,数据库引擎是否总是从磁盘中提取原子元组,还是仅提取在选择操作中请求的那些列?

如果它总是拉一个元组,则I / O开销是相同的。

同时,如果它拉出一个元组,从元组中剥离请求的列可能会占用内存。

因此,在这种情况下,select someColumn将比select *具有更多的内存开销。


问题答案:

它总是拉一个元组(表被垂直分割的情况除外-
分成几列),因此,要回答您提出的问题,从性能的角度来看并不重要。但是,由于许多其他原因,(在下面)您应该始终按名称专门选择想要的那些列。

它总是拉出一个元组,因为(在我熟悉的每个供应商RDBMS中),所有内容(包括表数据)的底层磁盘存储结构都基于已定义的 I / O页 (在SQL
Server中,例如,每个Page 8 KB)。每个I / O的读取或写入都是按Page ..即,每个写入或读取都是一个完整的数据页面。

由于这种潜在的结构约束,结果是数据库中的每一行数据必须始终位于一页上。它不能跨越多个数据页(除了blob之类的特殊事物外,其中实际的blob数据存储在单独的分页块中,而实际的表行列则仅获得一个指针…)。但是这些例外只是例外,通常不适用,除非在特殊情况下(对于特殊类型的数据,或针对特殊情况的某些优化),
即使在这些特殊情况下,通常,数据本身的实际表行(包含指向Blob或其他任何内容的实际数据的指针),它必须存储在单个IO页上…

例外。唯一可以确定的位置Select *是在子查询中,位于preExistsNot Existspredicate子句之后,例如:

   Select colA, colB
   From table1 t1
   Where Exists (Select * From Table2
                 Where column = t1.colA)

编辑:要解决@MikeSherer的评论,是的,从技术上讲,这是对的,对您的特殊情况和美学都有一点定义。首先,即使请求的列集是存储在某个索引中的列的子集,出于相同的原因,查询处理器也必须获取存储在该索引中的
每一 列,而不仅是请求的列,出于相同的原因-所有I /O必须在页,索引数据就像表数据一样存储在IO页中。因此,如果您为索引页定义“元组”作为存储在索引中的一组列,则该语句仍然为true。
该语句在美学上是正确的,因为重点是它基于I / O页中存储的内容而不是您要的内容来获取数据,并且无论您是访问基表I / O页还是索引均是如此。 I /
O页面。



 类似资料:
  • 我在xaml中创建了一个树景。 树结构如下图所示。每个家长可以有任意数量的孩子 我有所有级别的复选框。我不知道如何单独访问它的节点,也不知道如何使用树数据。 在我的VM类中,我将TreeView的datacontext设置为3类列表,如下所示: 我的要求是: 选择父项应选择其所有子项和孙子项 如何在代码中标识所选的项目?需要它做进一步的处理 请帮忙。

  • 一个选择就是从当前文档中抽取的一组元素。D3使用[[CSS3|http://www.w3.org/TR/css3-selectors/]]来选择页面元素。例如,你可以使用的选择方式有标签 ("div")、类(“.awesome”)、唯一标识符(“#foo”)、属性(“[color=red]”)、或者包含(“parent child”)。选择器可以是交叉(".this.that" 表示逻辑与)的也可

  • Action is similar to “Go to Edit Point”, but selects important code parts. 这个功能类似于编辑点间移动功能,但是选择重要的代码部分。 In HTML, these are tag name, full attribute and attribute value. For class attribute it also sel

  • 我希望,如果我选择“mammals”,动物选择选项只显示值为1的选项data-animal_class。 我知道如何获得哺乳动物值,但我不知道如何使用过滤器 这是我的代码:

  • 问题内容: 我想设置一个先前选择的要在页面加载时显示的选项。我用以下代码尝试了它: 与 但这是行不通的。有任何想法吗? 问题答案: 这绝对应该工作。确保已将代码放入:

  • 我想调用一个函数时,选择的任何选项。类似于这样: 但不知何故不起作用。有人能帮忙吗。 请注意 我不想捕获更改事件,如果我选择已经选择选项,则不会触发更改事件