如何只访问一行而不将整个表存储在内存中?

时间:2017-08-08 07:04:06

标签: c# sql sqlite

使用SQLite版本3。

enter image description here

我在这个命令上调用ExecuteScalar方法: command.CommandText = "SELECT Val FROM TableName WHERE Id = 2";

问题是,当我使用内存阅读软件访问应用程序的内存空间时,我可以在Val列中找到此表中存储的所有3个字符串。

鉴于作为主键的Id列,如何在不访问内存的情况下获取第二个Val单元格(a60fd4d5-83d0-4665-9250-329ec6d498d4Val wx.ScrolledWindow细胞

在不访问表中其余行的情况下,只访问一行的正确SQL命令是什么?

注意:我不是在询问如何从表中访问单个记录/行。我知道如何做到这一点,我问如何访问它而不将整个表存储在应用程序的内存空间中。假设我有1000万行,我想只访问一行,我不希望所有1000万行存储在内存中。

2 个答案:

答案 0 :(得分:2)

数据库文件被组织成页面,默认大小为4 KB。 尝试从磁盘读取较小的部分是没有意义的(因为这是文件系统现在使用的默认块大小),并且在许多情况下increasing the page size会提高性能。

如果要检查数据库是否访问的行数多于所需行数,请查看EXPLAIN QUERY PLAN的输出。 如果您真的想使用该内存读取软件,请确保您的表格大于一页;确保它至少有几兆字节。 (对于不到几兆字节,任何类型的优化都是毫无意义的。)

答案 1 :(得分:1)

如果Id是表的键,它是聚簇索引或唯一的非聚集索引,则使用正确的语法。

除非您遇到严重的性能问题,否则尝试配置SQL Server是没有意义的。

这是不成熟的优化。

SQL Server针对性能进行了大量优化,编写它的团队知道他们在做什么。

如果我不得不猜测你所看到的内容,我会说SQL Server已经遵循索引b-tree&已到达叶页。然后将整个页面读入内存。在8KB,这不是很多数据。每页8KB的值经过精心选择,以平衡性能与存储成本等其他考虑因素。 然后它返回该页面上所需插槽中的数据。

在你的情况下,这只是页面的1个插槽。

由于您的样本数据很小而且顺序所有行可能在同一页面上。