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

是否总是首选varchar(MAX)?

华誉
2023-03-14
问题内容

关于SQL Server,我了解:

  • var 表示内存是延迟分配的,这意味着它完全适合(插入时)数据。

  • MAX 表示没有大小限制\限制。

那么,在使用MAX时,是否总是最好使用varchar,因为我们无论如何都不会分配整个大小?

我们是否应该仅在要在此数据库列上强制执行约束的情况下才使用恒定大小?


问题答案:

SOhtml" target="_blank">用户@Remus Rusanu在此主题上有一篇很好的文章。这是我窃取的摘要,但我建议您阅读全文:

处理MAX类型(varchar,nvarchar和varbinary)的代码路径不同于处理其等效非最大长度类型的代码路径。非最大类型可以在内部表示为普通的指针和长度结构。但是max类型不能在内部存储为连续的内存区域,因为它们可能会增长到2Gb。因此,它们必须由类似于COM
IStream的流接口表示。这会延续到涉及最大类型的每个操作,包括简单的赋值和比较,因为这些操作在流接口上更加复杂。在分配和分配max-
type变量的代码中(我的第一个测试),最大的影响是可见的,但是在每个操作上都可以看到影响。

在文章中,他展示了几个示例,这些示例说明使用varchar(n)通常可以提高性能。

您可以在此处找到整篇文章。



 类似资料:
  • 问题内容: 我已经在MSDN论坛上对此进行了阅读,但我仍然不清楚。我认为这是正确的:Varchar(max)将存储为文本数据类型,因此存在缺点。因此,可以说您的字段可靠地在8000个字符以内。就像我的数据库表中的BusinessName字段一样。实际上,一个公司名称可能总是少于500个字符(将数字拉出帽子)。在8k字符数以下,我遇到的许多varchar字段似乎都很好。 那么我应该将该字段设置为va

  • 问题内容: 请清除我对此的疑问,在SQL Server(2000及更高版本)中,主键是自动对群集索引的吗?还是我们可以选择在主键上使用非群集索引? 问题答案: 不,它可以是非集群的。但是,如果您没有明确将其定义为非聚集索引,并且表上没有聚集索引,则会将其创建为聚集索引。

  • 问题内容: 关于在Java中使用Readers和Streams总是困扰我的一件事是该方法可能引发异常。由于将close方法放在finally块中是个好主意,因此这需要一些尴尬的情况。我通常使用这种构造: 但是我也看到了这种构造: 我更喜欢第一种结构,因为只有一个捕获块,而且看起来更优雅。是否有理由真正喜欢第二种或另一种结构? 更新:将有所作为,如果我指出,无论与只引发IOException?因此,

  • 问题内容: 如果我运行查询,例如: 即使查询与任何记录都不匹配,它也会始终返回结果吗?还是我需要验证并确保结果返回一行? 问题答案: 是的,因为它是一个聚合并且返回零。除非您添加GROUP BY,否则由于没有组,因此没有结果… 除非您添加GROUP BY,然后没有任何行,否则MAX / SUM等将返回NULL。只有COUNT传回没有结果的数字 编辑,有点晚:SUM会像MAX一样返回NULL 编辑,

  • 问题内容: 考虑到此代码,我是否可以绝对确定该块始终执行,无论它是什么? 问题答案: 是的,将在执行或代码块后调用。 唯一不会被调用的时间是: 如果您调用 System.exit() 如果您调用 Runtime.getRuntime().halt(exitStatus) 如果JVM首先崩溃 如果JVM在try或catch块中达到了无限循环(或其他不间断,不终止的语句) 操作系统是否强行终止了JVM

  • 问题内容: 是否有任何条件最终可能无法在Java中运行?谢谢。 问题答案: 注意:如果在执行try或catch代码时JVM退出,则finally块可能不会执行。同样,如果执行try或catch代码的线程被中断或杀死,即使整个应用程序继续运行,finally块也可能不会执行。 我不知道finally块无法执行任何其他方式…