【问题标题】:SQL Server - joining 4 fast queries gives me one slow querySQL Server - 加入 4 个快速查询给了我一个慢查询
【发布时间】:2012-07-28 06:55:06
【问题描述】:

我的 MS Sql Server 数据库中有 4 个视图,它们都非常快(不到 2 秒)并且返回的行数都少于 50 行。

但是,当我创建一个加入这 4 个视图(左外连接)的查询时,我得到一个查询,需要将近一分钟才能完成。

我认为查询优化器在这里做得不好,有什么办法可以加快速度。我很想将 4 个视图中的每一个复制到一个表中并将它们连接在一起,但这对我来说似乎是一种太多的解决方法。

(旁注:我无法在任何表上设置任何索引,因为视图来自不同的数据库,并且我不允许在那里更改任何内容,所以这不是一个选项)

编辑:很抱歉,但我认为发布 sql 查询不会有帮助。它们非常复杂,使用大约 50 个不同的表。我也无法发布执行计划,因为我没有足够的访问权限在某些数据库上生成执行计划。

我想我现在最好的解决方案是生成临时表来存储每个查询的结果。

【问题讨论】:

  • 如果不共享视图中的 SQL 或查询计划的结果,您不可能得到任何有意义的答案。
  • 大多数 DBA 都愿意授予“标准”开发人员权限:GRANT SHOWPLAN TO YourUser; GRANT ALTER TRACE TO YourUser; GRANT VIEW SERVER STATE TO YourUser; 拥有这些权限将使您的工作更轻松。
  • @Andomar:谢谢,我会将这些信息转发给我的数据库管理员

标签: sql sql-server performance sql-server-2008


【解决方案1】:

您可以在加入时拥有派生的视图表。

示例:不使用此查询

     SELECT V1.* FROM dbo.View1 AS V1 INNER JOIN dbo.View2 as V2
     ON V1.Column1=V2.Column1;

您可以进行以下查询

     SELECT V1.* FROM (SELECT * FROM dbo.View1) AS V1 INNER JOIN (SELECT * FROM dbo.View2) AS V2
     ON V1.Column1=V2.Column1;

我希望这可以提高性能。

【讨论】:

    【解决方案2】:

    如果您有很多列,请仅包含您需要的列。特别是,如果您对列有许多数学运算,则数据库在返回结果时必须转换所有数字。

    还有一点是,有时执行 3 个查询比执行一个巨大的连接并执行 1 个查询更好。

    然而,如果没有具体细节,就很难给出超出一般性的正确建议。

    【讨论】:

    • 我已经只选择了我需要的列并且我需要在一个视图中拥有所有信息
    【解决方案3】:

    如果你不能触摸索引,为了加快速度,你可以把你 4 个查询的结果放在 4 个临时表中,然后加入它们。

    您可以在存储过程中执行此操作。

    【讨论】:

    • 临时表很好用。我使用 4 个语句 'SELECT * INTO #table1 from view1' 然后加入表。结果不到 2 秒,而不是 54 秒。谢谢。
    猜你喜欢
    • 2011-07-30
    • 1970-01-01
    • 2015-09-23
    • 1970-01-01
    • 2022-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多