SQL:非聚簇索引组多列与单列

时间:2014-08-25 07:43:23

标签: sql sql-server

我有表GLTrans,它有一个非聚集索引:

enter image description here

我的查询:

SELECT 
   _glAccount.[Code] as [AccountCode]
   ,_glTrans.[CommentBooking] as [CommentBooking]
FROM 
   [GLTransHeader] _this 
INNER JOIN 
   [GLTrans] _glTrans ON _glTrans.[GLTransHeader_Id] = _this.[Id] 
LEFT INNER JOIN 
   [GLAccount] _glAccount ON _glAccount.[Id] = _glTrans.[GLAccount_Id]
WHERE 
   _glTrans.Folder_Id = '3AFE5BC5-1CC7-4198-9D89-B65591624C6E'

如果我在Folder_Id表中添加GLTrans,则会显示查询。另一方面,查询是超时。

我的问题:

  1. 如果我将密钥分组为多列,我必须在where关键字中使用它们吗?
  2. 如果我为每个单独的列取消组合并创建非聚集索引,它是否与上面的不同?

1 个答案:

答案 0 :(得分:1)

Index ON (Col1, Col2)与'Index ON(Col2,Col1)`

不同

索引ON(Col1,Col2)对以下查询非常有用:

Select * 
from YourTable
Where Col1 = ? and Col2 = ?

以及以下查询:

Select *
From YourTable
Where col1 = ?

但对此查询无效:

Select *
from YourTable
Where Col2 = ?

索引中列的优先级非常重要。

如果在select语句中选择列,如果你的索引中没有使用include,则可以使用include for index,sql server使用key lockup来获取数据。

例如,以下查询需要Index on (Col1, Col2) include(Col3)

Select Col3
from your table
where col1 = ? and col2 = ?