SQL Server - 更好的数据类型来存储大字符串值

时间:2010-01-22 08:15:53

标签: sql sql-server query-optimization varchar nvarchar

我们有一个数据库表,它有大约200,000条记录。其中包括3个ntext列,其中包含长度为4000-70000的字符串数据。但桌面上的一个选择只需要1分钟以上的时间来返回数据。甚至使用where条件和索引为条件选择12000条记录需要40秒。

因此我们决定将这些数据类型更改为nvarchar(max),但仍然没有注意到主要区别,因为它会将数据存储在行之外,因为它太长了。有什么更好的方法可以改善我的桌子的表现吗?

6 个答案:

答案 0 :(得分:7)

是什么让您认为您的问题是您的现场数据类型?在其他任何事情之前还有几点需要考虑:

  • 你的表有索引吗?你在用它们吗?
  • 你有足够的可用带宽吗?
  • 您的NIC卡是否使用了最新的驱动程序?
  • 您是否分析了查询执行计划?
  • 您的SQL服务器是否处于压力之下(CPU /内存/磁盘)?还有你的网络服务器/桌面?
  • 您的数据是否正确规范化了?

答案 1 :(得分:2)

您应该使列nvarchar而不是ntext,并且可以将它们作为非键列包含在索引中。但是......那是你要获取的大量数据。如果您需要经常执行查询,以至于1分钟的执行时间是个问题,那么您可能应该重新考虑您的方法。

答案 2 :(得分:1)

您是否可以将大文本字段移动到单独的表中,并以1-1关系将它们链接到主表。这可能有助于加快速度

答案 3 :(得分:1)

我同意凯文。任何扫描(聚集索引或其他)都很糟糕,包括数据在内并不是一个实际的选择。

使用自己的主键将文本移动到单独的表中,并将这三个用作原始表中的外键。

我做了一些非常类似的事情,用于存储医疗索赔的文本数据,并且它可以用来治疗。

(作为旁注)另一个优点是,赔率是,你不必一次在屏幕上显示整个返回结果集的所有这些文本 - 所以你最终只能获取您需要的特定文本数据。

这使您可以使用与摘要视图相同的表结构(如在stackoverflow上显示问题列表)和详细视图(显示单个标题记录的所有文本数据)。

答案 4 :(得分:1)

如果您不想将ntext列移动到另一个表,请确保在最后一次传递之前不检索这些列。所以不要这样:

SELECT * FROM tbl WHERE (/* your code here*/)

尝试这样的事情:

SELECT * FROM tbl WHERE id IN (SELECT id FROM tbl WHERE /* your code here */)

答案 5 :(得分:0)

对于你的第二个查询,它可以传输超过4.6千兆字节,所以我可以看到它花了那么长的时间......

对于单个记录查询,您可以尝试将其拆分为固定长度列:

即。 part1 nchar(2000),part2 nchar(4000),part3 nchar(8000),part4 nchar(16000)...

如果所有cols都是不变的,当cols都是固定长度时,它更容易计算行边界。

如果您在“查询分析”中“显示执行计划”,那么有用的东西会出现......?