您是否遇到过SQL Server无法执行的查询,因为它引用了太多表?

时间:2008-08-05 14:54:03

标签: sql-server database sql-server-2005 sql-server-2000

您是否见过任何错误消息?

  

- SQL Server 2000

     

无法为视图或功能解析分配辅助表   超出了查询中的最大表数(256)。

     

- SQL Server 2005

     

查询中的表名太多。允许的最大值为256。

如果是的话,你做了什么?

放弃?说服客户简化他们的需求?对数据库进行非规范化处理?


@(每个人都希望我发布查询):

  1. 我不确定是否可以在答案编辑窗口中粘贴70千字节的代码。
  2. 即使我能这样做也无济于事,因为这70千字节的代码会引用20或30个我必须发布的视图,否则代码将毫无意义。
  3. 我不想听起来像我在这里吹嘘,但问题不在查询中。查询是最佳的(或至少几乎是最佳的)。我花了无数个小时来优化它们,寻找可以删除的每个列和每个表。想象一下,有200或300列的报告必须用一个SELECT语句填充(因为这是几年前它仍然是一个小报告时的设计方式)。

8 个答案:

答案 0 :(得分:8)

对于SQL Server 2005,我建议您使用表变量并部分构建数据。

为此,请创建一个表变量,表示要发送给用户的最终结果集。

然后找到你的主表(比如上面例子中的订单表)并提取这些数据,加上一些补充数据,只说一个加入(客户名称,产品名称)。您可以执行SELECT INTO直接将其放入表变量中。

从那里,遍历表格并为每一行,做一堆小的SELECT查询,检索结果集所需的所有补充数据。在你去的时候将它们插入每一列。

完成后,您可以从表变量中执行一个简单的SELECT *并将此结果集返回给用户。

我没有这方面的任何硬编号,但是迄今为止我已经有三个不同的实例,其中这些较小的查询实际上比使用一堆连接进行大量选择查询更快。 / p>

答案 1 :(得分:1)

我从未遇到过这种情况,说实话,引用>的想法查询中的256个表格让我感到害怕。

你的第一个问题应该是“为什么这么多?”,紧接着是“我需要哪些信息?”我担心从这样的查询返回的数据量也会开始严重影响应用程序的性能。

答案 2 :(得分:1)

@chopeen您可以更改计算这些统计信息的方式,而是保留所有每个产品统计信息的单独表格。下订单时,循环浏览产品并更新统计信息表格中的相应记录。这会将大量计算负载转移到结帐页面,而不是在运行报表时将所有内容都运行在一个巨大的查询中。当然,有些统计数据不会以这种方式运作,例如在购买特定产品后跟踪客户的下一次购买。

答案 3 :(得分:1)

在为SQL Server 2000上运行的Dynamics CRM安装编写Reporting Services报表时,这种情况会一直发生.CRM具有很好的规范化数据模式,从而导致大量连接。实际上有一个修补程序将从256增加到高达260:http://support.microsoft.com/kb/818406(我们一直认为这是SQL Server团队的一个很好的笑话)。

正如Dillie-O所说,解决方案是识别适当的“子连接”(最好是多次使用的子连接)并将它们分解为临时表变量,然后在主连接中使用它们。这是一个主要的PIA并经常杀死性能。对不起你。

<凯> @Kevin,喜欢那个发球台 - 说明一切: - )。

答案 4 :(得分:0)

我想看看那个查询,但我想这是某种迭代器的问题,虽然我想不出任何可能的情况,但我敢打赌这是来自一个糟糕的/ / case /游标或一大堆执行不力的观点。

答案 5 :(得分:0)

发布查询:D

此外,我觉得可能的问题之一可能是有一个(读取200+)名称/值表,这些表可以压缩成一个查找表。

答案 6 :(得分:0)

我有同样的问题...我的开发框运行SQL Server 2008(视图工作正常)但在生产(使用SQL Server 2005)时视图没有。我最终创建了视图来避免这种限制,在视图中使用新视图作为查询的一部分抛出错误。

考虑到逻辑执行是一样的,有点傻......

答案 7 :(得分:0)

当我想创建一个视图时,在SQL Server 2005(曾在2008年工作)中遇到同样的问题。我通过创建存储过程而不是视图来解决问题。