0

我们有一个包含大约 200,000 条记录的数据库表。其中包括 3 个 ntext 列,其中包含长度为 4000-70000 的字符串数据。但是仅仅在表格上进行选择需要超过 1 分钟才能返回数据。甚至使用 where 条件和索引来为一个条件选择 12000 条记录需要 40 秒。

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

4

6 回答 6

7

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

  • 你的表有索引吗?你在使用它们吗?
  • 你有足够的可用带宽吗?
  • 您的 NIC 卡是否使用最新的驱动程序?
  • 你分析过你的查询执行计划吗?
  • 您的 SQL 服务器是否处于压力之下(CPU/内存/磁盘)?你的网络服务器/桌面呢?
  • 您的数据是否正确标准化?
于 2010-01-22T08:22:16.220 回答
2

您应该将列设为 nvarchar 而不是 ntext,并且可以将它们作为非键列包含在索引中。但是...您要获取的数据很多。如果您需要如此频繁地执行查询,以至于 1 分钟的执行时间成为问题,那么也许您应该重新考虑您的方法。

于 2010-01-22T12:08:30.790 回答
1

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

于 2010-01-22T08:42:06.880 回答
1

我同意凯文。任何扫描(聚集索引或其他)都是不好的,并且包含数据并不是一个实际的选择。

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

我做了一些与此非常相似的事情来存储医疗索赔的文本数据,它很有效。

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

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

于 2010-01-22T12:21:49.480 回答
1

如果您不想将 ntext 列移动到另一个表,请确保直到最后一次通过时才检索这些列。所以代替这个:

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

尝试这样的事情:

SELECT * FROM tbl WHERE id IN (SELECT id FROM tbl WHERE /* your code here */)
于 2010-01-22T23:12:55.293 回答
0

对于您的第二个查询,它可以传输超过 4.6 GB,所以我可以看到它可能需要很长时间......

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

IE。第 1 部分 nchar(2000),第 2 部分 nchar(4000),第 3 部分 nchar(8000),第 4 部分 nchar(16000)...

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

如果您在查询分析中“显示执行计划”,会显示任何有用的信息...?

于 2010-01-22T08:22:07.053 回答