【问题标题】:Does size of a VARCHAR column matter when used in queries [duplicate]在查询中使用时,VARCHAR 列的大小是否重要[重复]
【发布时间】:2012-12-03 09:21:41
【问题描述】:

可能重复:
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。

【问题讨论】:

  • 在等待答案时,您可以随时尝试看看会发生什么。

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


【解决方案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/

【讨论】:

  • 包含 10 个字符串的 varchar(200) 列不会比包含相同数据的 varchar(20) 列使用更多的网络流量。
【解决方案2】:

是的,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 成本有很大不同:

【讨论】:

    【解决方案3】:

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

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

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

    【讨论】:

      【解决方案4】:

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

      Advanced TSQL Tuning: Why Internals Knowledge Matters

      【讨论】:

      猜你喜欢
      • 2011-05-18
      • 2011-06-02
      • 1970-01-01
      • 2016-08-26
      • 2013-06-22
      • 1970-01-01
      • 1970-01-01
      • 2018-02-10
      • 1970-01-01
      相关资源
      最近更新 更多