为SQL Server中的常用查询创建适当的索引

前端之家收集整理的这篇文章主要介绍了为SQL Server中的常用查询创建适当的索引前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
在我的应用程序中,我有两个经常使用的查询.这些查询的Where子句如下:
  1. WHERE FieldA = @P1 AND (FieldB = @P2 OR FieldC = @P2)@H_301_3@
  2. WHERE FieldA = @P1 AND FieldB = @P2@H_301_3@ 
  3.  

    P1P2是在UI中输入或来自外部数据源的参数.

  4.  

    > FieldA是一个int并且非常独特,意味着:表中只有两个,三个,四个不同的值,比方说20000
    > FieldB是一个varchar(20)并且“几乎”是唯一的,只有很少的行,其中FieldB可能具有相同的值
    > FieldC是一个varchar(15),也是高度不同的,但不如FieldB
    > FieldAFieldB一起是唯一的(但不构成我的主键,这是一个带有聚簇索引的简单自动递增标识列)

  5.  

    我现在想知道定义索引以最好地加速这两个查询的最佳方法是什么.我应该用…定义一个索引

  6.   
  7.  
    FieldB (or better FieldC here?)
  8. FieldC (or better FieldB here?)
  9. FieldA@H_301_3@ 
  10.  

    …或更好的两个指数:

  11.   
  12.  
    FieldB
  13. FieldA@H_301_3@ 
  14.  

  15.   
  16.  
    FieldC
  17. FieldA@H_301_3@ 
  18.  

    还是有其他更好的选择吗?什么是最好的方式和原因?

  19.  

    提前感谢您的建议!

  20.  

    编辑:

  21.  

    就像其他读者的信息一样:这是另一个已被删除的答案.实际上答案对我来说似乎非常有用.建议是创建两个索引(根据我上面的第二个选项)并使用两个select语句的UNION重新构造第一个查询(一个使用WHERE FieldA = @ P1 AND FieldB = @ P2,另一个使用WHERE FieldA = @ P1 AND FieldC = @ P2)而不是OR从两个索引中受益(OR运算符不是这种情况).

  22.  

    EDIT2

  23.  

    使用OR并且未使用索引并且UNION更可取的声明似乎是错误 至少根据我自己的测试(参见下面我自己的答案).

解决方法

扩展Remus'(编辑:现已删除)答案……

>如果@ p2是varchar(15),那么你无法可靠地与FieldB进行比较,它是varchar(20)
>如果@ p2是varchar(20),则FieldC将转换为varchar(20)并且不使用索引(或者最好扫描它)
>如果@ p1只有2,3,4值那么为什么不使用tinyint并减少表/索引大小?

解决此数据类型优先级问题之前,我不打算使用索引:这是在OR子句问题之上.

最后,列是唯一的或非唯一的:两者之间没有.统计数据在这里有助于选择性,但它无关紧要.

由于FieldA的选择性,我会将Remus回答的索引反转为FieldB,FieldA(和唯一)和FieldC,FieldA

注释后编辑:你无法比较使用@ p2和使用常量字符串.

猜你在找的MsSQL相关文章