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

SQL nvarchar性能

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

    我使用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 回复  |  直到 12 年前
        1
  •  3
  •   Cade Roux    15 年前

    视情况而定。可能是过早的优化。

    此外,它将一个逻辑上是一个空间的空间进行分区,并且不再作为一个空间进行管理(即在两个位置添加索引,等等)

    我不确定,但也许可以 字面上

        2
  •  2
  •   Remus Rusanu    15 年前

    不,没有真正的收获。要看到由于字符串大小的交错而导致的瓶颈,特别是基于int-PK的瓶颈,这将是一个真正的极端。
    另一方面,使用这种存储模式的混乱是非常清楚和现实的:您必须根据字符串的长度来决定 看哪张桌子!您可能会通过反复试验(先尝试一个表,然后再尝试另一个表)来查找,这比任何表nvarchar存储结构问题都要浪费得多。

        3
  •  1
  •   Andrew    15 年前

    在SQL 2005和我相信2008中,您不会创建NVarChar(5000),因为您使用这样的数据类型超出了页面大小,NVarChar(Max)将在这一点上起作用。当为nVarChar指定数字N时,您最多有4000个限制。

        4
  •  1
  •   Community CDub    7 年前

    还是否定

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

    • 决定将其添加到哪个表中
    • 更正打字错误意味着它在错误的表格中(忽略转发PTR等)
    • 处理两个表的键唯一性(如果它们有一个公共父表)

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