情况1:我有一个包含30列的表,我在where子句中使用4列进行查询.
情况2:我有一个包含6列的表,我在where子句中使用4列进行查询.
两种情况下的表现有何不同?
例如我有桌子
table A
{
b varchar(10),
c varchar(10),
d varchar(10),
e varchar(10),
f varchar(10),
g varchar(10),
h varchar(10)
}
SELECT b,c,d
FROM A
WHERE f='foo'
create table B
{
b varchar(10),
c varchar(10),
d varchar(10),
e varchar(10),
f varchar(10)
}
SELECT b,c,d
FROM B
WHERE f='foo'
Run Code Online (Sandbox Code Playgroud)
A和B表具有相同的结构意味着在条件也相同且列中的列也相同时使用的列数和列数的差异.不同之处在于表B只有一些未使用的列,这些列未在select中使用,在这种情况下,两种查询的性能有何不同?
SQL Server 2005包括"覆盖索引"功能,该功能允许我们选择多个非密钥列包含在现有的非聚簇索引中.
例如,我有以下列:
EmployeeID, DepartmentID, DesignationID, BranchID
Run Code Online (Sandbox Code Playgroud)
以下是两种情况:
EmployeeID是聚簇索引和剩余的列主键(DepartmentID,DesignationID,
BranchID)被作为非聚集索引(复合索引).
EmployeeID是聚簇索引的主键和DepartmentID是与非聚集索引
DesignationID,BranchID属于"包括列"非聚集的索引.
上面两个有什么区别?如果两者都是相同的新引入"覆盖指数"概念?
我试图找出处理SQL Server中的表索引的最佳方法.
我有一张桌子,只需要阅读.没有真正的写入表(初始设置后).
我在表中有大约5-6列需要索引.为整个表设置一个非聚簇索引并将我需要索引的所有列添加到该索引是否更有意义,还是应该为每个列设置多个非聚簇索引?
我想知道哪种设置会有更好的读取性能.
对此的任何帮助都会很棒.
更新:
已经有一些好的答案,但我想详细说明我的需求.
有一个主表有自动记录.我需要能够对超过100MM的记录执行非常快速的计数.where语句会有所不同,但我试图索引where语句中的所有可能列.所以我会有这样的疑问:
SELECT COUNT(recordID)
FROM tableName
WHERE zip IN (32801, 32802, 32803, 32809)
AND makeID = '32'
AND modelID IN (22, 332, 402, 504, 620)
Run Code Online (Sandbox Code Playgroud)
或类似的东西:
SELECT COUNT(recordID)
FROM tableName
WHERE stateID = '9'
AND classCode IN (3,5,9)
AND makeID NOT IN (55, 56, 60, 80, 99)
Run Code Online (Sandbox Code Playgroud)
因此,大约有5-6列可以在where子句中,但它会在哪些列上有很大不同.