关于索引的SQL server面试查询?

时间:2013-04-08 09:15:09

标签: sql sql-server sql-server-2008

我从NET收到一个面试问题,但没有找到任何人都能说出的正确解决方案 我这个查询有什么问题?

鉴于此表结构和索引,后续查询有什么问题?

CREATE TABLE dbo.IndexQ (
ID int IDENTITY(1, 1) NOT NULL,
TestBit bit NOT NULL
)
GO

CREATE NONCLUSTERED INEX IX_IndexQ_TestBit ON dbo.IndexQ (TestBit)
GO

* Insert some rows where some bits are 0 and some are 1...

SELECT *
FROM dbo.IndexQ
WHERE TestBit = 1
* What's the problem with this query?

2 个答案:

答案 0 :(得分:3)

我认为你的NONCLUSTERED索引在bit字段中存在问题。如果你有一个大表,你不应该在位字段上构建索引,因为它有更多的记录,它们的索引效果会降低,但你会在它上面使用更多的日期。

请参阅https://dba.stackexchange.com/questions/12888/should-i-index-a-bit-field-in-sql-server

答案 1 :(得分:1)

1)创建索引的常见做法是第一个索引列应该是具有更高选择性/更低密度的列(密度显示一列或一组列中有多少个唯一值)。较低的密度(意味着许多唯一值)更好,因为这有利Index Seek超过Index Scan。在这种情况下,BIT列上的索引意味着更高的密度,这有利于Index Scan

2)但是,SELECT *强制服务器返回所有列,而不仅仅是TestBit的值(TestBit)。这意味着,对于此SELECT查询,索引是非覆盖的(不包括此查询所需的所有列)。

3)更高的密度(1)加上非覆盖索引(2)意味着,该索引的"tipping point"很可能会迫使服务器不使用此索引,而是选择(非常可能)表扫描。

这意味着,此索引无效。