代码之家  ›  专栏  ›  技术社区  ›  Paul

SQL nvarchar性能

  •  0
  • Paul  · 技术社区  · 17 年前

    我使用MS Sql(2008或其他)将本地化字符串存储在单个数据表中。大多数字符串都很短,可以用varchar(200)表示,而大约10%的字符串更长,需要像varchar(5000)这样的东西。我的问题是,如果我把它分成两个这样的表,在检索较短的字符串时是否有性能优势:

    CREATE TABLE ShortTextTable(ID bigint IDENTITY(1,1) NOT NULL, TextValue nvarchar(200))
    CREATE TABLE LongTextTable(ID bigint IDENTITY(1,1) NOT NULL, TextValue nvarchar(4000))
    

    CREATE TABLE TextTable(ID bigint IDENTITY(1,1) NOT NULL, TextValue nvarchar(4000))
    

    这些数据很少更新,我只关心阅读。

    4 回复  |  直到 14 年前
        1
  •  3
  •   Cade Roux    17 年前

    这取决于。可能是过早的优化。

    我不确定,但有可能 字面上

        2
  •  2
  •   Remus Rusanu    17 年前

    不,没有真正的收获。要看到由于字符串大小交织造成的瓶颈,特别是基于整数PK的瓶颈,这将是一个真正的极端。
    另一方面,使用这种存储模式的混乱是显而易见的:你必须根据字符串的长度来决定 看哪张桌子!您可能最终会通过试错法进行查找(先尝试一个表,然后再尝试另一个表),这比任何表nvarchar存储结构问题都浪费得多。

        3
  •  1
  •   Andrew    17 年前

    在SQL 2005和我相信2008中,你不会创建NVarChar(5000),因为你超过了这种数据类型的页面大小,此时NVarChar会起作用。为nVarChar指定数字N时,最大限制为4000。

    我相信,在这一点上,将内联存储值读取到页面与读取页面以获取指向LOB页面的16字节指针并从那里读取数据之间会有性能差异。

        4
  •  1
  •   Community Mohan Dere    9 年前

    或阴性

    储存方式: 可变长度字符串存储为字符数+长度为2个字节。所以:数据的长度是相同的,但你会有第二个表的索引和键开销。

    处理方式:

    • 决定将其添加到哪个表中
    • 纠正拼写错误意味着它在错误的表中(忽略正向ptrs等)
    • 处理2个表的键唯一性(如果它们有一个共同的父表)

    现在,更重要的是,我看到你提到了本地化,但你需要nvarchar吗?另一个SO问题: varchar vs nvarchar performance

    推荐文章