you notice that a particular set of parameter values the following qury sometimes executes quickly and 
other times executes slowly. you also notice that 90 percent of the rows in the address table contain
the same value for the city. 
select addressid,addressline1,city,postalcode from person.address
where city=@city_name and postalcode=@postal_code
you need to use a query hint that,for the particular set of parameter values,will result in a more
consistent query execution time. which query hint should you use?A. FAST
B. MAXDOP
C. OPTIMIZE FOR
D. PARAMETERIZATION FORCED我决定答案应该是c或者d,但是原理不是很清楚,希望高手不吝赐教,谢谢。。

解决方案 »

  1.   

    应该是C,速度不一应该是因为缓存了不合理的计划,用OPTIMIZE FOR可以优化一下
      

  2.   

    联机帮助里对OPTIMIZE FOR和PARAMETERIZATION FORCED的原理说的比较详细了,你可以仔细看一下
      

  3.   

    当 PARAMETERIZATION 数据库选项设置为 SIMPLE 时,SQL Server 查询优化器可以选择参数化查询。这意味着查询中包含的任何文字值都用参数来替换。此过程称为简单参数化。SIMPLE 参数化生效后,将无法控制参数化哪些查询,不参数化哪些查询。不过,您可以通过将 PARAMETERIZATION 数据库选项设置为 FORCED 来指定参数化数据库中的所有查询。此过程称为强制参数化。可以通过下列方式使用计划指南来覆盖数据库的参数化行为:当 PARAMETERIZATION 数据库选项设置为 SIMPLE 时,您可以指定对某一类查询尝试执行强制参数化。可以通过在查询的参数化表单上创建 TEMPLATE 计划指南并在 sp_create_plan_guide 存储过程中指定 PARAMETERIZATION FORCED 查询提示来完成此操作。您可以将此种计划指南看作只对某一类查询(而不是所有查询)启用强制参数化的方法。
    当 PARAMETERIZATION 数据库选项设置为 FORCED 时,您可以指定对某一类查询仅尝试执行简单参数化而非强制参数化。通过在查询的强制参数化表单上创建 TEMPLATE 计划指南,并在 sp_create_plan_guide 中指定 PARAMETERIZATION SIMPLE 查询提示,可以执行此操作。
      

  4.   

    OPTIMIZE FOR ( @variable_name { UNKNOWN | = literal_constant } [ , ...n] )
    在编译和优化查询时提示查询优化器对本地变量使用特定值。仅在查询优化期间使用该值,在查询执行期间不使用该值。
    看起来应该是C
      

  5.   

    那原理是什么吗?为什么90%相同的情况下,要用OPTIMIZE FOR 这个参数呢?
      

  6.   

    B. 使用 OPTIMIZE FOR
    下面的示例指示查询优化器对局部变量 @city_name 使用值 'Seattle',并在优化查询时使用统计数据来确定局部变量 @postal_code 的值。 复制代码 
    USE AdventureWorks;
    GO
    DECLARE @city_name nvarchar(30);
    DECLARE @postal_code nvarchar(15);
    SET @city_name = 'Ascheim';
    SET @postal_code = 86171;
    SELECT * FROM Person.Address
    WHERE City = @city_name AND PostalCode = @postal_code
    OPTION ( OPTIMIZE FOR (@city_name = 'Seattle', @postal_code UNKNOWN) );
    GO 
      

  7.   

    由于 select 语句涉及变量,因此查询优化器在优化阶段只能凭“猜测”对语句进行优化,这样可能会生成“糟糕”的执行计划。而本语句中 city 列值几乎可以确定,因此可以使用 optimize for 提示强制查询优化器使用指定的 @city 值来优化,从而可以生成“精确”的执行计划。
      

  8.   

    如果查询优化器在优化阶段只能凭“猜测”对语句进行优化,那么就无法准确的估计 where 子句中谓词的选择性,从而不能准确地选择索引,也不能选择如何操作(index scan 或 index seek)。