我应该在设计表格时使用varchar(255)或varchar(256)吗?我听说一个字节用于列的长度,或用于存储元数据。
在这一点上它不再重要了吗?
我在互联网上看到了一些帖子,但是它们适用于 Oracle 和 MySQL。
我们有 Microsoft SQL Server 2016 企业版,它如何应用于这种环境?
现在举个例子,如果我告诉我的客户保留例如 255 个字符而不是 256 个字符的文本描述,有什么区别吗?我读到的内容“最大长度为 255 个字符,DBMS 可以选择使用单个字节来指示字段中数据的长度。如果限制为 256 或更大,则需要两个字节。” 这是真的?
database-design sql-server varchar sql-server-2016 enterprise-edition
有人正在审查我用于创建表的 DDL 代码并建议,当他们看到我看到使用VARCHAR(256)文本字段时,我希望它非常小,比如名字或其他什么,我应该总是只使用VARCHAR(MAX)和链接为什么使用 varchar(max )。我读过它,但它似乎过时了,因为它专注于 2005 年,并且似乎没有提供任何真正的理由来在所有文本字段上每行分配最多 2 GB。
从性能、存储等角度来看,应该如何决定是使用VARCHAR(MAX)SQL Server 的现代版本还是使用更小更具体的类型?(例如,2008、2012、2014)
由于 varchar 占用的磁盘空间与字段的大小成正比,有什么理由我们不应该总是将 varchar 定义为最大值,例如varchar(8000)在 SQL Server 上?
在创建表上,如果我看到有人在做varchar(100)我应该告诉他们不你错了你应该做什么varchar(8000)?
在这个答案(/sf/ask/36230561/)中,一个评论引起了我的注意:
还要记住,在进行索引比较时,CHAR 和 VARCHAR 之间通常存在很大差异
这是否适用/仍然适用于 Postgres?
我发现 Oracle 上的页面声称这CHAR或多或少是 for 的别名VARCHAR,因此索引性能是相同的,但我在 Postgres 上没有发现任何明确的内容。
搜索VARCHAR2Oracle 中列的大小是否会影响性能的报告似乎不一。
我想VARCHAR稍微解释一下大小的问题,并希望对此有所了解:
给定(多行)自由文本字段(不是名称之类的简短内容)要存储在(Oracle)数据库中,是否有任何意义(性能或其他)不最大化VARCHAR容量(VARCHAR2(4000)在 Oracle 上)而是选择较小的值,例如 1024 或 512,因为无论如何这在 98% 的情况下可能就足够了。
我一直在一个表中记录昂贵的运行查询及其查询计划,以便我们监控性能趋势并确定需要优化的区域。
然而,现在已经到了查询计划占用太多空间的地步(因为我们针对每个查询存储整个计划)。
因此,我试图通过将 QueryPlanHash 和 QueryPlan 提取到另一个表来规范化现有数据。
CREATE TABLE QueryPlans
(
QueryPlanHash VARBINARY(25),
QueryPlan XML,
CONSTRAINT PK_QueryPlans PRIMARY KEY
(
QueryPlanHash
)
);
Run Code Online (Sandbox Code Playgroud)
由于query_plan_hashin的定义sys.dm_exec_query_stats是一个二进制字段(并且我会定期插入新数据),因此我使用VARBINARY了新表中的数据类型。
但是,下面的插入失败了...
INSERT INTO QueryPlans
( QueryPlanHash, QueryPlan )
SELECT queryplanhash, queryplan
FROM
(
SELECT
p.value('(./@QueryPlanHash)[1]', 'varchar(20)') queryplanhash,
QueryPlan,
ROW_NUMBER() OVER (PARTITION BY p.value('(./@QueryPlanHash)[1]', 'varchar(20)') ORDER BY DateRecorded) rownum
FROM table
CROSS APPLY QueryPlan.nodes('/ShowPlanXML/BatchSequence/Batch/Statements/StmtSimple[@QueryPlanHash]') t(p)
) data
WHERE rownum = 1
Run Code Online (Sandbox Code Playgroud)
....有错误
Implicit conversion from data type varchar to varbinary is …Run Code Online (Sandbox Code Playgroud) 我想从Postgres 文档中询问这个片段关于varchar(n)类型的含义:
短字符串(最多 126 个字节)的存储要求是 1 个字节加上实际字符串,其中包括字符情况下的空格填充。较长的字符串有 4 个字节的开销而不是 1 个字节。
假设我有一个varchar(255)字段。现在,以下声明:
我们的数据库中有许多表,VARCHAR(MAX)其中包含 a VARCHAR(500)(或远小于 max 的值)就足够的列。当然,我想清理这些,并将尺寸缩小到更合理的水平。我明白如何做到这一点:我的问题是改变这些列会对磁盘上的页面和现存内容产生什么影响?(有很多关于当你增加一个列时会发生什么的信息,但是很难找到当你缩小一个时会发生什么的信息。)
有些表的行数非常少,所以我不担心更改的成本,但有些表非常大,我担心它们可能会被重组并导致大量阻塞/停机。实际上,我只是想要一种估计维护窗口的方法。一般来说,我想更好地了解数据库引擎在这种情况下的行为。
提前致谢!
编辑:
我正在查看 20 个表,但其中只有一半的行数大于 1,000。最大的有近一百万行。最糟糕的是一张有 350,000 行和 4VARCHAR(MAX)列的表格,可以缩小到一个VARCHAR(500)水平。
我正在与其他人一起创建 SQL Server 数据库。其中一个表很小(6 行),其中的数据可能会保持不变。添加新行的可能性很小。该表看起来像这样:
CREATE TABLE someTable (
id int primary key identity(1,1) not null,
name varchar(128) not null unique
);
INSERT INTO someTable values ('alice', 'bob something', 'charles can dance', 'dugan was here');
Run Code Online (Sandbox Code Playgroud)
我正在查看该name列的字符长度,我认为它的值可能永远不会大于 32 个字符,甚至可能不会大于 24。我将此列更改为,有什么好处,例如,varchar(32)?
另外,将默认列大小保持为 4、8、32 等的倍数有什么好处吗?
基于选择,我可以像这样返回 x 行:
1 2019-07-23 10:14:04.000
1 2019-07-23 10:14:11.000
2 2019-07-23 10:45:32.000
1 2019-07-23 10:45:33.000
Run Code Online (Sandbox Code Playgroud)
我们所有的毫秒都是 0。
有没有办法将 1 x 1 毫秒加起来,所以选择看起来像这样:
1 2019-07-23 10:14:04.001
1 2019-07-23 10:14:11.002
2 2019-07-23 10:45:32.003
1 2019-07-23 10:45:33.004
Run Code Online (Sandbox Code Playgroud)
我正在尝试创建一个游标甚至一个没有成功的更新。
这是获得我想要的结果的查询:
select top 10 ModifiedOn
from [SCHEMA].[dbo].[TABLE]
where FIELD between '2019-07-23 00:00' and '2019-07-23 23:59'
Run Code Online (Sandbox Code Playgroud)
有 81k 个值。该字段是DATETIME。
varchar ×10
sql-server ×7
performance ×3
postgresql ×2
datatypes ×1
datetime ×1
disk-space ×1
oracle ×1
varbinary ×1
xml ×1