它可能会被使用。这取决于许多因素,主要是您的数据(以及有关您的数据的统计信息)和您的查询。
TL/DR;您需要根据自己的数据和自己的查询对此进行测试。可能会使用索引。
您应该对您拥有或期望拥有的数据进行尝试。创建一些测试数据非常容易,您可以在这些数据上测试查询并尝试不同的索引。您可能还需要重新考虑索引中列的顺序,col_1 真的是索引中最好的列吗?
以下是一个非常具体的场景,我们只能从中得出结论,有时可以在与您的类似场景中使用索引。
考虑下面的这种情况;该表包含 1M 行,并且在 (a, b, c) 上只有一个非聚集索引。请注意,D 列中的值非常大。
下面的前 4 个查询使用了索引,只有第五个查询没有。
为什么?
Sql Server 需要弄清楚如何在读取最少数据的同时完成查询。有时,即使查询过滤器与索引不完全匹配,SQL Server 也更容易读取索引而不是表。
在查询 1 和 2 中,查询实际上会在索引上执行搜索,这非常好。它知道 A 列是执行 Seek 的好候选。
在查询 3 和 4 中,它需要扫描整个索引以找到匹配的行。它仍然使用索引。
在查询 5 中,SQL Server 意识到扫描实际表而不是索引更容易。
IF OBJECT_ID('tempdb..#peter') IS NOT NULL DROP TABLE #peter;
CREATE TABLE #peter(a INT, b INT, c VARCHAR(100), d VARCHAR(MAX));
WITH baserows AS (
SELECT * FROM master..spt_values WHERE type = 'P'
),
numbered AS (
SELECT TOP 1000000
a.*, rn = ROW_NUMBER() OVER(ORDER BY (SELECT null))
FROM baserows a, baserows b, baserows c
)
INSERT #peter
( a, b, c, d )
SELECT
rn % 100, rn % 10, CHAR(65 + (rn % 60)), REPLICATE(CHAR(65 + (rn % 60)), rn)
FROM numbered
CREATE INDEX ix_peter ON #peter(a, b, c);
-- First query does Seek on the index + RID Lookup.
SELECT * FROM #peter WHERE a = 55 AND c = 'P'
-- Second Query does Seek on the index.
SELECT a, b, c FROM #peter WHERE a = 55 AND c = 'P'
-- Third query does Scan on the index because the index is smaller to scan than the full table.
SELECT a, b, c FROM #peter WHERE c = 'P'
-- Fourth query does a scan on the index
SELECT a, b, c FROM #peter WHERE b = 22
-- Fifth query scans the table and not the index
SELECT MAX(d) FROM #peter
在 SQL Server 2014 上测试。