7

可能重复:
varchar(500) 是否比 varchar(8000) 有优势?

我了解包含 10 个字符的列与包含相同数据VARCHAR(200)的列占用相同的空间。VARCHAR(20)

我想知道将VARCHAR(200)特定表的十几个列更改为VARCHAR(20)是否会使查询运行得更快,尤其是在以下情况下:

  • 这些列永远不会包含超过 20 个字符
  • 这些列经常在ORDER BY子句中使用
  • 这些列经常在WHERE子句 中使用
    • 其中一些列已编入索引,以便它们可以在WHERE子句中使用

PS:我使用的是 SQL Server 2000,但很快就会升级到更高版本的 SQL。

4

4 回答 4

13

是的,varchar 的长度会影响查询的估计、将为内部操作(例如排序)分配的内存以及 CPU 资源。您可以使用以下简单示例重现它。

1.创建两个表:

create table varLenTest1
(
    a varchar(100)
)

create table varLenTest2
(
    a varchar(8000)
)

2. 用一些数据填充它们:

declare @i int
set @i = 20000

while (@i > 0)
begin 
    insert into varLenTest1 (a) values (cast(NEWID() as varchar(36)))
    set @i = @i - 1
end 

3. 使用“包括实际执行计划”执行以下查询:

select a from varLenTest1 order by a OPTION (MAXDOP 1) ;
select a from varLenTest2 order by a OPTION (MAXDOP 1) ;

如果您检查这些查询的执行计划,您会发现估计的 IO 成本和估计的 CPU 成本有很大不同: 在此处输入图像描述

于 2012-12-15T20:44:48.767 回答
2

这是一篇博客文章,解释了在什么情况下以及为什么在使用不同的列大小时会出现性能差异(带有测试和技术细节):

高级 TSQL 调优:为什么内部知识很重要

于 2012-12-15T17:45:39.570 回答
2

当查询优化器评估最佳查询路径以执行查询时,它确实很重要。当有多个路径可用时,它会根据您的查询计算 I/O 成本和其他各种参数,并从中选择在他看来成本最低的一个。

这不是一个绝对的计算,它只是一个近似过程。因此,如果从内存中的一个表中操作记录所需的表观平均大小比真正需要的要大得多,并且优化器可能会根据它认为必要的情况选择性能较差的路径,那么它很容易被抛弃对于其他路径。

拥有一个实际的最大尺寸对于任何其他将要查看您的代码的程序员也很有用。如果我有一个想要在 GUI 中显示的变量,我可能会分配比需要更多的空间,如果我看到它由 nvarchar(200) 或 nvarchar(2000) 之类的东西支持,而不是 nvarchar(20) 如果它的大小是从来没有比这更大。

于 2012-12-15T18:11:25.673 回答
1

大小事项

始终使用可容纳最大可能值的最小数据大小。如果一列要存储 1 到 5 之间的值,请使用 tinyint 而不是 int。

此规则也适用于字符列。数据大小越小,读取的内容就越少,因此总体而言,性能会受益。此外,较小的尺寸减少了网络流量。使用更新的技术,这个技巧似乎不太相关,但不要忽视它。您不会后悔从一开始就保持高效。

欲了解更多信息,请访问http://www.techrepublic.com/blog/10-things/10-plus-tips-for-getting-the-best-performance-out-of-your-sql-server-data-types/

于 2012-12-15T17:46:44.410 回答