SQL 数据类型和连接问题
SQL datatype and joins issue
如果连接的字段的数据类型为 nvarchar(255),与将它们声明为 nvarchar(50) 相比,使用连接的更新查询是否会花费更多时间?
如果上述问题的答案是肯定的,那么为什么会发生这种情况,因为字段中的数据最多只有 5 个字符,所以 SQL 应该只分配 space 5 个字符。
TL/DR;
简单的答案是性能应该具有可比性。
也就是说,一些数据库(例如 SQLLite)不能很好地处理这个问题,因为它们使用基于树的文本索引,对更深的树需要更大的内存。
这个问题有类似的答案:
nvarchar column size impact on performance
更长的答案
有两种基本的搜索类型。
- 索引搜索
- Table扫描
索引搜索
如果正在扫描的table上有索引,那么数据库会先搜索索引。这本质上就像使用街道目录,你去乡村,然后去郊区,然后按字母顺序到街道开头的字母,然后扫描它们以找到街道。这样可以节省您阅读目录中的每条街道的时间。正如我所说,我意识到根据您的年龄,您可能从未见过街道目录...
Table扫描
Table扫描是没有索引的情况。数据库引擎将逐行检查每一行(通常按插入顺序)并将每一行与预期结果进行比较。当它找到正确的时,它会 return 它。
它进行比较的方式是从左到右,一个字母一个字母地比较,所以对于相同的数据,它会花费相同的时间。如果 nvarchar(255)
字段中的数据具有相同的 row count
但不相同的 length
(即行数相同,但内容更长),则搜索将花费更长的时间因为它需要扫描更多字母。
如果连接的字段的数据类型为 nvarchar(255),与将它们声明为 nvarchar(50) 相比,使用连接的更新查询是否会花费更多时间? 如果上述问题的答案是肯定的,那么为什么会发生这种情况,因为字段中的数据最多只有 5 个字符,所以 SQL 应该只分配 space 5 个字符。
TL/DR; 简单的答案是性能应该具有可比性。
也就是说,一些数据库(例如 SQLLite)不能很好地处理这个问题,因为它们使用基于树的文本索引,对更深的树需要更大的内存。
这个问题有类似的答案: nvarchar column size impact on performance
更长的答案
有两种基本的搜索类型。
- 索引搜索
- Table扫描
索引搜索
如果正在扫描的table上有索引,那么数据库会先搜索索引。这本质上就像使用街道目录,你去乡村,然后去郊区,然后按字母顺序到街道开头的字母,然后扫描它们以找到街道。这样可以节省您阅读目录中的每条街道的时间。正如我所说,我意识到根据您的年龄,您可能从未见过街道目录...
Table扫描
Table扫描是没有索引的情况。数据库引擎将逐行检查每一行(通常按插入顺序)并将每一行与预期结果进行比较。当它找到正确的时,它会 return 它。
它进行比较的方式是从左到右,一个字母一个字母地比较,所以对于相同的数据,它会花费相同的时间。如果 nvarchar(255)
字段中的数据具有相同的 row count
但不相同的 length
(即行数相同,但内容更长),则搜索将花费更长的时间因为它需要扫描更多字母。