【问题标题】:Query hangs using parameter in WHERE clause使用 WHERE 子句中的参数查询挂起
【发布时间】:2016-04-19 15:19:32
【问题描述】:

我很难理解这里的查询。 我的查询最终会在报告中返回一个结果集,您可以在其中在参数中指定一个 Person 来查看他们的数据。 我将 Dimension 表加入到 Employee 表中,以从 Employee 表中返回 Name。它看起来像这样

Declare @PM varchar(30)
Set @PM = 'John Smith'

SELECT....FullName, EmployeeID, .... 
FROM...
Inner Join EmployeesT on emp.EmployeeNumber = DimP.PersonID
WHERE FullName in (@PM)

注意:我的 Employee 表在 nvarchar 中,Dimension 是 varchar,但我认为这并不重要,因为连接仍然有效。

现在,我在顶部设置了一个参数进行测试。

这是我的问题:如果我将 WHERE 子句切换为 WHERE DimP.PersonID IN ('12345'),我的查询需要 3 秒才能运行。当我将查询更改为WHERE FullName in (@PM) 时,查询将永远运行;它挂起并运行了 5 个以上的小步舞曲。有没有人遇到过类似的问题?

结果集生成了包含多个“人”的正确数据,我想通过指定一个人而不是 id 来测试这一点,但是当我将参数更改为 Name 时,查询挂起..

【问题讨论】:

  • 性能问题更多与表结构和索引有关。另外,如果您只传递一个名字,为什么不简单地输入“WHERE FullName = @PM”?
  • 我试过这个并且遇到了同样的问题。通过在下面添加以下 CASE 语句解决了该问题。我不知道为什么
  • 我不确定 case 语句是否正确,因为它似乎没有返回任何内容。您可能应该在问题中发布完整的查询。此外,性能问题可能是由错误的执行计划造成的。请参阅此处的讨论:brentozar.com/archive/2014/06/…

标签: sql-server tsql reporting-services


【解决方案1】:

可能是参数嗅探。它挂在另一个参数值的优化执行计划上。 尝试在查询结束时使用 OPTION (OPTIMIZE FOR (@parm UNKNOWN))。

Declare @PM varchar(30)
Set @PM = 'John Smith'

SELECT....FullName, EmployeeID, .... 
FROM...
Inner Join EmployeesT on emp.EmployeeNumber = DimP.PersonID
WHERE FullName in (@PM)

OPTION (OPTIMIZE FOR (@PM UNKNOWN))

【讨论】:

    【解决方案2】:

    我的同事能够解决这个问题:她使用了 `WHERE emp.empNumber = (CASE WHEN emp.FullName IN (@PM))

    :)

    【讨论】:

    • 那是她使用的确切语法吗,因为很确定如果你添加它就会出错......除非那是你想要的结果?查看this blog 帖子,了解减速的潜在原因。
    • @Shaneis 查询应该在不到 5 秒的时间内运行。使用 IN PM 或 emp.empNumber = PM 将挂起并占用 5 分钟以上。使用这个 case 语句似乎已经解决了这个问题。
    • 解决运行时间超过 5 分钟的问题?毫无疑问,当我最后一次检查时,错误会立即返回。如果这解决了您的时间问题,那就太好了!但是完整的 CASE 语法是这样的,而不是你所拥有的。 CASE input_expression WHEN when_expression THEN result_expression [ ...n ] [ ELSE else_result_expression ] END
    • 其他几个AND之后的语法如下:Declare @PM varchar(50); Set @PM = 'John Smith'; ....WHERE....AND (emp.EmpNumber = (CASE WHEN emp.FullName IN(@PM) THEN emp.empNumber ELSE 0 END))
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-16
    • 2018-08-14
    • 2011-05-30
    • 1970-01-01
    相关资源
    最近更新 更多