1

我了解“无法对大小为 9754 的行进行排序,该行大于允许的最大值 8094”。from SQL Server 是由其中包含超过 9k 个字符的行引起的,这大于 SQL Server 7 中的页面大小限制。但是我没有在下面的数据上调用 order by,那么为什么错误会这样说不能排序?

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

编辑:是的,我知道我可以调用更少的列来解决这个问题 - 实际查询显式调用所需的列并且仍然超过行大小限制。这实际上是在一个称为站点范围的视图中,因此更改视图以拉回更少的列并不是一个有吸引力的选择 - 需要修改数十个页面才能从视图以外的其他地方获取数据。我很不幸地插入了一个丑陋的设计,并希望有人有一个比提取更少数据更有吸引力的解决方案。

4

5 回答 5

5

检查排序的估计查询计划,执行其中一个可能选择合并连接的连接,为了实现这一点,它需要在合并之前首先对数据进行排序——此时您已经排序。

于 2009-10-15T13:20:40.767 回答
2

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

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

我知道我在这里向合唱团布道,但现在是时候让您的组织升级到更新版本的 SQl 服务器了。即使现在您也无法直接升级到 2008,因此如果您无法获得 SQL Server 2005,您将面临失去任何升级路径的真正危险。如果这是业务关键数据,您不能再等待升级.

于 2009-10-15T14:30:52.797 回答
0

好吧,关键是:你的行太大了。您没有进行显式排序,但也许查询引擎出于性能目的决定了排序?

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

于 2009-10-15T13:19:47.693 回答
0

我的疯狂猜测是 SQL Server 需要对临时表中某处的数据进行排序以join提高性能。它显然不能这样做,因为您要从 4 个表中选择每一列。

考虑换成select *​​更合适的东西。

于 2009-10-15T13:20:45.697 回答
0

您可能可以使用 CTE、派生表和/或 #temp 表拆分查询以解决您的问题,但我对您的表、返回的列或索引知之甚少,无法提出任何具体建议。

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

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

于 2009-10-15T13:32:26.920 回答