我们有一个数据库表,它有大约200,000条记录。其中包括3个ntext列,其中包含长度为4000-70000的字符串数据。但桌面上的一个选择只需要1分钟以上的时间来返回数据。甚至使用where条件和索引为条件选择12000条记录需要40秒。
因此我们决定将这些数据类型更改为nvarchar(max),但仍然没有注意到主要区别,因为它会将数据存储在行之外,因为它太长了。有什么更好的方法可以改善我的桌子的表现吗?
答案 0 :(得分:7)
是什么让您认为您的问题是您的现场数据类型?在其他任何事情之前还有几点需要考虑:
答案 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都是固定长度时,它更容易计算行边界。
如果您在“查询分析”中“显示执行计划”,那么有用的东西会出现......?