开发者社区> 问答> 正文

您是否曾经遇到过由于SQL Server引用太多表而无法执行的查询?

您是否看到过任何错误消息?

-SQL Server 2000

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

-SQL Server 2005

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

如果是,您做了什么?

放弃了?说服客户简化需求?对数据库进行非规范化?

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

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

展开
收起
心有灵_夕 2019-12-24 21:57:06 985 0
1 条回答
写回答
取消 提交回答
  • 对于SQL Server 2005,我建议您使用表变量,并在构建过程中部分构建数据。

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

    然后找到您的主表(例如上面示例中的orders表)并提取该数据,以及一些补充数据,这些补充数据仅表示一个联接(客户名称,产品名称)。您可以执行SELECT INTO将其直接放入表变量中。

    从那里开始,遍历表,并针对每一行,执行一堆小的SELECT查询,以检索结果集所需的所有补充数据。将它们插入到每一列中。

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

    我对此没有任何确切的数字,但是到目前为止,我已经研究了三个不同的实例,在这些实例中,执行这些较小的查询实际上比执行带有大量联接的大规模选择查询要快。

    2019-12-24 21:57:24
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
SQL Server 2017 立即下载
GeoMesa on Spark SQL 立即下载
原生SQL on Hadoop引擎- Apache HAWQ 2.x最新技术解密malili 立即下载