在查询中使用时,VARCHAR列的大小是否重要

时间:2012-12-15 17:36:27

标签: sql sql-server performance sql-server-2000 query-optimization

  

可能重复:
  is there an advantage to varchar(500) over varchar(8000)?

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

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

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

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

4 个答案:

答案 0 :(得分:10)

是的,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。使用“include actual execution plan”执行以下查询:

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

如果您检查这些查询的执行计划,您可以看到估计的IO成本和估计的CPU成本是非常不同的: enter image description here

答案 1 :(得分:2)

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

Advanced TSQL Tuning: Why Internals Knowledge Matters

答案 2 :(得分:2)

查询优化器何时评估执行查询的最佳查询路径,这一点很重要。当有多个路径可用时,它将根据您的查询计算I / O成本和其他各种参数,并从中选择一个对他而言成本最低的路径。

这不是绝对计算,它只是一个近似过程。因此,如果从内存中的一个表操作记录所需的表观平均大小比实际需要的大得多,并且优化器可能会根据它认为必要的路径选择性能较差的路径,则可以轻松地将其抛弃。对于其他路径。

拥有真实的最大大小对于任何其他程序员来说也很有用。如果我有一个我想要在GUI中显示的变量,如果我看到如果它的大小是nvarchar(200)或nvarchar(2000)而不是nvarchar(20),那么我可能会分配比所需更多的空间。永远不会超过那个。

答案 3 :(得分:0)

  

尺寸重要

     

始终使用容纳最大数据的最小数据大小   可能的价值。如果列要存储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/