相关疑难解决方法(0)

使用带参数的DISTINCT时选择性能性能下降

赏金注意事项 - START:

参数SNIFFING(这是在赏金前问题中报告的唯一"想法")不是问题,因为您可以在问题末尾的"更新"部分阅读.问题实际上与sql server如何在使用distinct时为参数化查询创建执行计划有关.我上传了一个非常简单的数据库备份(它的工作原理与SQL Server 2008 R2)这里(您必须下载前先等待20秒).对于此数据库,您可以尝试运行以下查询:

-- PARAMETRIZED QUERY

declare @IS_ADMINISTRATOR int
declare @User_ID int
set @IS_ADMINISTRATOR = 1 -- 1 for administrator 0 for normal
set @User_ID = 50

SELECT DISTINCT -- PLEASE REMEMBER DISTINCT MAKES THE DIFFERENCE!!!
  DOC.DOCUMENT_ID
FROM
  DOCUMENTS DOC LEFT OUTER JOIN
  FOLDERS FOL ON FOL.FOLDER_ID = DOC.FOLDER_ID LEFT OUTER JOIN
  ROLES ROL ON (FOL.FOLDER_ID = ROL.FOLDER_ID)   
WHERE
  1 = @IS_ADMINISTRATOR OR  ROL.USER_ID = @USER_ID

-- NON PARAMETRIZED QUERY

SELECT DISTINCT -- …
Run Code Online (Sandbox Code Playgroud)

sql-server performance distinct sql-server-2008

5
推荐指数
1
解决办法
3285
查看次数