使用SQLite版本3。
我在这个命令上调用ExecuteScalar
方法:
command.CommandText = "SELECT Val FROM TableName WHERE Id = 2";
问题是,当我使用内存阅读软件访问应用程序的内存空间时,我可以在Val
列中找到此表中存储的所有3个字符串。
鉴于作为主键的Id
列,如何在不访问内存的情况下获取第二个Val
单元格(a60fd4d5-83d0-4665-9250-329ec6d498d4
)Val
wx.ScrolledWindow
细胞
在不访问表中其余行的情况下,只访问一行的正确SQL命令是什么?
注意:我不是在询问如何从表中访问单个记录/行。我知道如何做到这一点,我问如何访问它而不将整个表存储在应用程序的内存空间中。假设我有1000万行,我想只访问一行,我不希望所有1000万行存储在内存中。
答案 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个插槽。
由于您的样本数据很小而且顺序所有行可能在同一页面上。