2013-03-25 36 views
2

假设有与非主键列(A,B,C,d),其中存在于(A,B,C,d)部分键查找

将查询涉及的索引表中的(A,B,C,D)的子集利用索引?所描述的部分密钥查找存在哪些特质?

我特别感兴趣的是如何在SQL Server,Sqlite,Firebird中工作。

回答

3

是,如果搜索键在相同的顺序的索引字段。其他不,假设你有指示去图书馆,请看第三章第三页“伟大的盖茨比”。这就像使用多字段索引一样。

现在说,你被告知得到第3章,第三页......没有书名。你必须看每本书。

+0

那么为了支持这种情况,我将不得不分别在A,B,C,D上声明4个单独的索引?例如。 “以'The%'开头的第3章获得所有书籍” – 2013-03-25 01:54:05

+1

是的。缺点是插入和更新变得更加昂贵。 – 2013-03-25 04:13:20

4

使用索引初始子集的查询应使用索引。 (A),(A)和(B)以及(A)和(B)和(C)上的同等连接应该使用该索引。

其实,你可以添加一个不平等一样,所以,指数应该支持所有的以下内容:

  • XA =雅
  • XA = YA和XB> YB
  • XA =雅和的xB = YB
  • XA = YA和XB = Yb和XC> YC
  • XA = YA和XB = Yb和XC = YC
  • XA = YA和XB = Yb和XC = YC并且x。 d> y.D
  • x.A = y.A和x.B = y.B和x.C = y.C和x.D = y.D
+0

x.C = y.C?这会导致全表扫描吗? – 2013-03-25 01:34:48

+1

这应该导致索引扫描而不是表扫描。它比表扫描要快,但不像索引寻找像Gordon上面列出的场景那么快。有更多的信息[这里](http://stackoverflow.com/questions/1136524/sql-server-plans-difference-between-index-scan-index-seek)。 – 2013-03-25 02:05:35