在SQL Server中按多个列进行筛选是否更快?

在SQL Server中按多个列进行筛选是否更快?,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,我有一个包含以下列的表 Id (int) UniqueId (string) CategoryId (int) Id和UniqueId对于每个记录都是唯一的 我想根据UniqueId值查找记录,并且我还有CategoryId值 在SELECT语句中指定两个过滤器是否更快,例如: SELECT * FROM [Products] Where [UniqueId] = 'product' AND [CategoryId] = 4 或者我应该只使用[UniqueId]过滤器吗

我有一个包含以下列的表

Id         (int)
UniqueId   (string)
CategoryId (int)
Id和UniqueId对于每个记录都是唯一的

我想根据
UniqueId
值查找记录,并且我还有
CategoryId

SELECT
语句中指定两个过滤器是否更快,例如:

SELECT * FROM [Products] Where [UniqueId] = 'product' AND [CategoryId] = 4
或者我应该只使用
[UniqueId]
过滤器吗

这张桌子有很多记录

编辑:


我没有产品的
[Id]

我认为过滤索引列的速度更快


如果它们都被编入索引,我认为只对一列进行筛选会更快,因为对于每个列筛选,服务器都必须进行处理,这需要时间

我认为过滤索引列的速度更快


如果它们都被编入索引,我认为只对一列进行筛选会更快,因为对于每个列筛选,服务器都必须进行处理,这需要时间

我建议,只需在uniqueid上创建一个非聚集索引,并将该字段用作筛选器

我建议,只需在uniqueid上创建一个非聚集索引,并将该字段用作筛选器

如果您没有任何索引,则

SELECT * 
FROM [Products] 
WHERE [UniqueId] = 'product' 
如果在任何列上都有索引,则在
where
子句中使用该列

如果您在
UniqueId
CategoryId
上都有索引,那么您的查询

SELECT * 
FROM [Products] 
WHERE [UniqueId] = 'product' AND [CategoryId] = 4

如果没有任何索引,则

SELECT * 
FROM [Products] 
WHERE [UniqueId] = 'product' 
如果在任何列上都有索引,则在
where
子句中使用该列

如果您在
UniqueId
CategoryId
上都有索引,那么您的查询

SELECT * 
FROM [Products] 
WHERE [UniqueId] = 'product' AND [CategoryId] = 4

很好

我认为最好使用唯一的id过滤器来完成这项工作,也不要忘记在UniqueId上添加索引以加快过滤速度


我更喜欢将索引放在我想要筛选的列上(在where子句中使用)。

我认为最好使用唯一的id筛选器来完成这项工作,也不要忘记将索引放在UniqueId上以加快筛选速度


我更喜欢将索引放在我要筛选的列上(用于where子句)。

只需在
Uniqueid
上筛选即可。SQL server甚至不会查看其他列,因为唯一索引提供了最快的排序(O=log2N)

只需在
Uniqueid上进行筛选即可。SQL server甚至不会查看其他列,因为唯一索引提供最快的排序(O=log2N)

,这取决于表上是否有索引、索引包括哪些列以及索引的实际顺序

如果索引中的列
(UniqueId,CategoryId)
,并设置了相应的包含列,则查询应该可以

在包含的列中添加其他必需的列将避免在select中检索列时进行键查找

这也是为什么您几乎不应该使用
SELECT*

最好的选择是查看执行计划,并尝试避免任何表扫描/键查找


看看类似于

的内容,这取决于表上是否有索引,索引包括哪些列,以及索引的实际顺序

如果索引中的列
(UniqueId,CategoryId)
,并设置了相应的包含列,则查询应该可以

在包含的列中添加其他必需的列将避免在select中检索列时进行键查找

这也是为什么您几乎不应该使用
SELECT*

最好的选择是查看执行计划,并尝试避免任何表扫描/键查找

首先看一看类似的东西

只拉要拉的列

我相信你有[CategoryId]有聚类索引。所以您应该使用filter[CategoryId]来提取记录。不要使用产品过滤器

你的疑问是

SELECT * FROM [Products] Where  [CategoryId] = 4
首先

只拉要拉的列

我相信你有[CategoryId]有聚类索引。所以您应该使用filter[CategoryId]来提取记录。不要使用产品过滤器

你的疑问是

SELECT * FROM [Products] Where  [CategoryId] = 4

-1索引应位于
UniqueId
CategoryId
上,过滤器应位于这两个位置。我们不能假设在
Id
UniqueId
上都有
UNIQUE
键,OP已经提到Id和UniqueId都是唯一的,那么为什么你认为他应该将两者都用作过滤器,这将对性能产生更大的负载?正如你所建议的那样,使用选择性较低的
WHERE
子句,导致开销。-1索引应位于
UniqueId
CategoryId
上,筛选器应位于这两个位置。我们不能假设在
Id
UniqueId
上都有
UNIQUE
键,OP已经提到Id和UniqueId都是唯一的,那么为什么你认为他应该将两者都用作过滤器,这将对性能产生更大的负载?正如你所建议的那样,使用选择性较低的
WHERE
子句,造成开销。