2011-08-10 18 views
1

如果一个sql server列是一个字符串而不是guid,那么连接将如何受影响(假设没有索引)。这很重要吗?了解sql连接和数据类型的影响

另外,当你把一个索引放在一个字符串列上时,它是否会变得和具有索引的整数列一样高效?

即当你把字符串或者整数列的索引,是将得到的索引建立的相同的方式,并因此同样执行?

+2

正确的索引与任何索引之间的影响比任何影响该列的数据类型有显著更大....停止担心这一点 - 确保你有**正确的指数! –

+0

这是一个多为宏,马克 – JNK

+0

@marc_s我想了解 – codecompleting

回答

4

所有其他事情相同,数据越少越好。而通过data我的意思是字节

对于几乎所有的SQL Server应用程序,最严格的瓶颈是磁盘I/O,并从磁盘(或高速缓存)拉动更少的数据做任何事情更快。

这取决于您声明的字符串长度而变化。请记住,GUID s是16个字节,而varchar是每个字符1个字节。 nvarchar是每个字符2个字节。 (n)varchar也有一个每行2个字节开销来定义字符串长度。

空间/字节明智,String大于GUID大于int

您的字段定义越小/越紧密,因此int比​​要快,这比string要快。

+0

而且这是最重要的,如果你有**指数**这是实际数据上的额外结构。你不想在那里浪费太多空间! –

+0

@marc - true true true – JNK

+0

并非所有的字符串都比GUID长!任何varchar(15)或更少或nvarchar(7)或更少,都将小于GUID。 –

0

字符串列总是比int列的开销高。索引通常是某种散列,并且一个字符串(特别是长整数)总是需要比简单的16/32/64位整数更长的散列时间。

扫描两种指数将最有可能采取相同的时间,但生产/维护索引总会让INT列赢得的开销。

+0

是的 - 但是如果他使用**没有索引**,那么...... –

+0

然后每个字符串必须按字符进行比较。大型数据库的速度非常缓慢。 –

+0

当你这样做的时候,比较一个INT或者一个字符串的区别实际上与通过整个表扫描的一般缓慢相差无几 - 特别是在大桌子上! –

1

没有索引,该列的大小真的没有一个巨大的差异,因为SQL Server将不得不基本上看表扫描,无论如何,这两个值连接起来。无论是4字节的INT还是60字节的VARCHAR都不会有什么大的改变 - 无论如何,这些数据都存在于数据页面中。

但是,如果你开始使用指数,较小固定长度数据(4字节固定长度INT)大于固定宽度结构显著更好(如16字节GUID/UNIQUEIDENTIFIER),和比可变宽度列好得多像VARCHAR - 但是:只指数...