代码之家  ›  专栏  ›  技术社区  ›  Cory House

SQL Server错误:无法对大小为X的行进行排序,X大于允许的最大值8094。但我没有整理

  •  1
  • Cory House  · 技术社区  · 15 年前

    据我所知,“无法对大小为9754的行进行排序,该行大于允许的最大值8094”。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
    

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

    5 回复  |  直到 15 年前
        1
  •  5
  •   Andrew    15 年前

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

        2
  •  2
  •   HLGEM    15 年前

    我知道您不想听到这个消息,但是如果您的视图与SQL Server的实际限制不符,那么您需要重新设计。这是一个无法通过某种黑客手段解决的问题。每当有人想查询那些太大的行时,您都会遇到同样的问题。现在,您可能在太大的行中有坏数据。但我赌的只是简单的坏设计。是的,重构一个糟糕的数据库设计是很多工作,但这只会随着时间的推移而变得更糟,而不是更好。

    如果直接查询表而不是使用视图,会得到同样的错误吗?我怀疑您试图从相似的表(基于表名)中透视信息。您可以改为执行union all并让应用程序执行数据透视吗?这样查询的列至少会更少。

    我知道,我在这里向唱诗班宣讲,但现在真的是让您的组织升级到新版本的SQL Server的时候了。即使现在您还不能直接升级到2008,所以如果您不能获得SQL Server 2005,那么您就有可能丢失任何升级路径。如果这是业务关键数据,您就不能再等待升级了。

        3
  •  0
  •   Maximilian Mayerl    15 年前

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

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

        4
  •  0
  •   Anton Gogolev    15 年前

    我猜想SQL Server需要在临时表中对数据进行排序 join 更具表现力。显然不能这样做,因为您要从4个表中选择每一列。

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

        5
  •  0
  •   KM.    15 年前

    您可以使用CTE、派生表和/或临时表拆分查询,以解决您的问题,但我对您的表、返回列或索引的了解不够,无法给出任何具体的建议。

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

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

    推荐文章