1
|
Cory House · 技术社区 · 15 年前 |
![]() |
1
5
检查排序的估计查询计划,例如,要执行一个联接,它可能选择一个合并联接,为了实现这一点,它需要在合并之前首先对数据进行排序-此时您已经排序。 |
![]() |
2
2
我知道您不想听到这个消息,但是如果您的视图与SQL Server的实际限制不符,那么您需要重新设计。这是一个无法通过某种黑客手段解决的问题。每当有人想查询那些太大的行时,您都会遇到同样的问题。现在,您可能在太大的行中有坏数据。但我赌的只是简单的坏设计。是的,重构一个糟糕的数据库设计是很多工作,但这只会随着时间的推移而变得更糟,而不是更好。 如果直接查询表而不是使用视图,会得到同样的错误吗?我怀疑您试图从相似的表(基于表名)中透视信息。您可以改为执行union all并让应用程序执行数据透视吗?这样查询的列至少会更少。 我知道,我在这里向唱诗班宣讲,但现在真的是让您的组织升级到新版本的SQL Server的时候了。即使现在您还不能直接升级到2008,所以如果您不能获得SQL Server 2005,那么您就有可能丢失任何升级路径。如果这是业务关键数据,您就不能再等待升级了。 |
![]() |
3
0
好吧,关键是:你的争吵太大了。您没有进行显式排序,但查询引擎可能出于性能目的决定了排序? 无论哪种方法,您都必须对行大小做一些调整,例如不选择“*”,而只选择您真正需要的数据。 |
![]() |
4
0
我猜想SQL Server需要在临时表中对数据进行排序
考虑更换
|
![]() |
5
0
您可以使用CTE、派生表和/或临时表拆分查询,以解决您的问题,但我对您的表、返回列或索引的了解不够,无法给出任何具体的建议。 如果没有更多的信息,就不可能为您解决这个问题。表定义是什么?您是在连接ints或varchar(1000)类型的列吗?你有覆盖索引吗?您是从每个表中选择列,还是只选择一些列? 可能使用覆盖索引来获取CTE、派生表和或临时表中的所有主键,然后重新连接到常规表以获取您感兴趣的列。 |