SQL Server错误:无法对大小为x的行进行排序,这大于允许的最大值8094.但我没有排序

时间:2009-10-15 13:16:06

标签: sql-server database sql-server-7

据我所知,“无法排序大小为9754的行,大于允许的最大值8094”。来自SQL Server的是由一行中有超过9k个字符的行引起的,这个行大于SQL Server 7中的页面大小限制。但是我没有通过下面的数据调用一个命令,所以为什么错误说它不能排序?

SELECT <a number of columns...>
FROM Category10Master c10
JOIN Category20Master c20 ON c10.Cat10ID = c20.ParentCatID 
JOIN Category25Master c25 ON c20.Cat20ID = c25.ParentCatID 
JOIN Category30Master c30 ON c25.Cat25ID = c30 .ParentCatID 
JOIN Item i ON c30.Cat30ID = i.ParentCatID

编辑:是的,我知道我可以调用更少的列来解决这个问题 - 实际的查询会显式调用所需的列,但仍超出行大小限制。这实际上是在一个被称为站点范围的视图中,因此更改视图以缩回更少的列不是一个有吸引力的选项 - 需要修改数十个页面以从视图以外的其他位置获取数据。我不幸的是已经把一个丑陋的设计搞砸了,我希望有人能提供比吸引更少数据更有吸引力的解决方案。

5 个答案:

答案 0 :(得分:5)

检查排序的估计查询计划,例如,执行其中一个连接可能是选择合并连接,为了实现这一点,它需要在合并之前先对数据进行排序 - 此时你要'已整理好。

答案 1 :(得分:2)

我知道你不想听到这个但是如果你的视图与SQL服务器的实际限制有关,那么你需要重新设计。这是一个不会因某种黑客而消失的问题。每当有人想要执行太大的行查询时,您将遇到同样的问题。现在,您可能在行太大的行中存在错误数据。但我打赌只是简单的糟糕设计。是的,重构糟糕的数据库设计需要做很多工作,但这只会随着时间的推移而变得更糟。

如果直接查询表而不是使用视图,是否会出现相同的错误?我怀疑您正在尝试从类似的表中转移信息(基于表名)。你可以改为使用联合并让应用程序进行转动吗?这样查询至少会有更少的列。

我知道我在这里向合唱团讲道,但现在是时候让你的组织升级到更新版本的SQl服务器了。即使现在你也无法直接升级到2008,所以如果你无法获得SQL Server 2005,你真的有可能失去任何升级路径。如果这是业务关键数据,你就不能再等待升级了。

答案 2 :(得分:0)

嗯,重点是:你的行太大了。您没有进行明确的排序,但是查询引擎可能会出于性能目的决定排序吗?

无论哪种方式,您都必须对行大小做一些事情,例如不选择“*”,而只选择您真正需要的数据。

答案 3 :(得分:0)

我的猜测是,SQL Server需要在临时表中的某处对数据进行排序,以使join更高效。显然不能这样做,因为你从4个表中选择了每一列。

考虑用更合适的内容替换select *

答案 4 :(得分:0)

您可以使用CTE,派生表和/或#temp表来分解查询以解决您的问题,但我对您的表,返回的列或索引知之甚少以进行任何具体的操作建议。

如果没有更多信息,就无法为您解决此问题。表定义是什么?你在加入INTs或varchar(1000)类型的列吗?你有覆盖索引吗?你是从每个表中选择列,还是只选择一些?

可能使用覆盖索引来获取CTE,派生表和/或#temp表中的所有主键,然后联接回常规表以获取您感兴趣的列。