2011-04-19 45 views
0

我们在其中一个存储XML文件的表中有nText字段。我们能够在nText字段中保存大约40-50 MB的大型XML。但是,当我们尝试像 那样选择从archive_id = 123的存档中选择archive_xml时,超时。在SQL中超时读取大nText列

任何替代或任何建议?

感谢, Ĵ

+1

archive_id索引? – taylonr 2011-04-19 15:18:27

回答

0

当你说这是超时,它是超时在服务器上或者在你的代码?这可能影响不同的解决方案

如果它是一个服务器的问题,确保表中有您所查询的字段(例如archive_id)

,如果它在代码超时“简单”的解决方案是延长用户的连接超时有意义的指标。我会先尝试其他的东西,比如提高服务器性能,因为连接超时通常会隐藏更大的问题。

+0

我使web.config文件中的连接超时为600,但它仍然超时 – jvm 2011-04-19 16:52:51

+0

我使它成为3600,仍然超时执行我的sp。如果我在查询分析器上运行这个sp,它需要将近4分钟才能执行 – jvm 2011-04-19 17:21:57

+1

@jatin,您需要开始查看索引您的表。 40MB并没有太大的回退。我查询了数百万行数据带来了大量数据,并且不需要4分钟。 – taylonr 2011-04-19 18:21:52

0

如果您通过某种语言(如C#)执行此查询,请确保在执行此操作之前关闭不需要的记录集。

通过选择工具/选项,然后选择连接选项卡可以增加查询超时查询分析器。然后增加'Query Timeout'参数的值。

此外,索引此字段将大大缩短执行查询的时间。

+0

你的意思是它应该在archive_xml上有索引吗? – jvm 2011-04-19 17:00:00

+0

我使它成为3600,在执行我的sp时仍然超时。如果我在查询分析器上运行这个sp,它需要将近4分钟才能执行 – jvm 2011-04-19 17:23:42

0

根据MSDN 如果ntext,文本和图像数据值不超过Unicode,则为4,000个字符;字符,8000个字符;或二进制字符串(8,000字节),可以在SELECT,UPDATE和INSERT语句中引用该值,这与更小的数据类型的引用方式大致相同。例如,可以在SELECT语句选择列表中引用具有短值的ntext列,这与引用nvarchar列的方式相同。必须遵守一些限制,例如不能直接引用WHERE子句中的ntext,text或image列。这些列可以包含在WHERE子句中作为返回另一个数据类型(例如ISNULL,SUBSTRING或PATINDEX)的函数的参数,或者包含在IS NULL,IS NOT NULL或LIKE表达式中。

处理大数据值 但是,当ntext,text和image数据值变大时,它们必须逐块处理。 Transact-SQL和数据库API都包含允许应用程序逐块处理ntext,text和image数据的函数。

数据库API按照处理长的ntext,文本和图像列的一种通用的模式:

要读取长列,应用程序只包括NTEXT,文字,或在选择图像列列表,然后将该列绑定到一个足够大的程序变量,以保存合理的数据块。应用程序然后执行该语句,并使用API​​函数或方法一次将数据检索到绑定变量中。

要编写长列,应用程序将执行带有参数标记(?)的INSERT或UPDATE语句,以替换放置在ntext,text或image列中的值的位置。参数标记(或ADO情况下的参数)绑定到足够大的程序变量以容纳数据块。应用程序进入一个循环,首先将下一组数据移动到绑定变量中,然后调用API函数或方法来写入该数据块。重复此操作直到整个数据值被发送完毕。