你有没有遇到SQL Server无法执行的查询,因为它引用了太多的表?

你有没有看到有任何错误消息?

- SQL Server 2000

     

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

     

- SQL Server 2005

     

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

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

放弃了?确信客户能够简化他们的需求?非规范化数据库?


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

  1. 我不确定我是否可以在答案编辑窗口中粘贴70千字节的代码。
  2. 即使我能做到这一点,这也无济于事,因为这70千字节的代码会引用20或30个视图,因此我不得不发布这些代码,否则代码将毫无意义。

我不想听起来像我在这里吹嘘,但问题不在于查询。查询是最优的(或者至少几乎是最优的)。我花了无数小时来优化它们,寻找每一个可以移除的列和每个表。想象一下有200或300列的报告必须用单个SELECT语句填充(因为这是几年前它还是一个小报告时的设计)。

0
额外 编辑
意见: 3
意见不会帮助。视图中使用的表格也计入极限。
额外 作者 Marek Grzenkowicz,
你在使用SQL Server 2000 SP3吗?
额外 作者 Stu,
你可能会创建一些意见?
额外 作者 Calvin Allen,

8 答案

我希望看到这个查询,但我想这是某种迭代器的问题,虽然我不能想到任何可能的情况,但我敢打赌,这是来自一个糟糕的while / case / cursor或一吨执行不力的意见。

0
额外
没有任何类型的迭代器。只需一个SELECT语句。
额外 作者 Marek Grzenkowicz,

发布查询:D

此外,我觉得可能存在的问题之一可能是有一吨(可以读取超过200个)的名称/值表,这些表可能会压缩成一个查询表。

0
额外

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

0
额外

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

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

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

从那里,遍历表和每一行,做一堆小的SELECT查询,它们检索结果集所需的所有补充数据。随时将这些插入每列。

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

我没有任何硬编码,但是迄今为止我一直在研究三个截然不同的实例,在这些实现这些较小查询的实际操作中,比使用一堆连接执行一个大规模选择查询的速度更快。

0
额外

I have never come across this kind of situation, and to be honest the idea of referencing > 256 tables in a query fils me with a mortal dread.

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

0
额外
试想一下,谁愿意跟真的很多信息相关部件的沿看到在他们的商店项目的列表(网格)客户(例如,大约每一个项目的第一份订单,大约去年订单时,先发货,关于最后交货,关于买谁,关于发货的成本,...)的客户。相信我,这是可能的,我已经看到了。我不得不应付它。 :)是的,对性能的影响可能是在这种情况下严重。
额外 作者 Marek Grzenkowicz,

在为SQL Server 2000上运行的Dynamics CRM安装编写报告服务报告时,这种情况会一直发生.CRM有一个很好的规范化数据模式,导致了很多连接。实际上有一个修补程序可以将256的限制提高到260: http://support.microsoft .com / kb / 818406 (我们一直认为这是SQL Server团队的一个伟大的笑话)。

Dillie-O提出的解决方案是识别适当的“子连接”(最好是多次使用),并将它们分解为临时表变量,然后将其用于主连接。这是一个主要的PIA,经常会导致性能下降。我为你感到难过。

@凯文,喜欢那个T恤 - 说这一切:-)。

0
额外

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

考虑逻辑执行的那种愚蠢是相同的...

0
额外
奇怪的是,它有所帮助 - 据我所知,视图中使用的表格计入极限。你在使用索引视图吗?
额外 作者 Marek Grzenkowicz,

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

0
额外