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

时间:2012-09-07 06:15:48

标签: 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]

7 个答案:

答案 0 :(得分:2)

我认为最好使用唯一的ID过滤器来做这件事,也不要忘记在UniqueId上放一个索引,以便更快地过滤。

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

答案 1 :(得分:2)

这将取决于您是否在表上有索引,索引包含哪些列以及索引的实际顺序。

如果你有一个列(UniqueId, CategoryId)的索引,并且设置了相应的列,那么你的查询应该没问题。

在包含的列中添加其他必需列将避免使用键查找来检索选择中的列。

这也是你几乎不应该使用SELECT *

的原因

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

查看Execution Plan Basics

之类的内容

答案 2 :(得分:0)

我认为过滤哪个列的索引会更快。

如果它们都被编入索引,我认为仅对一列进行过滤会更快,因为对于每个列过滤器,服务器必须进行需要花费时间的处理。

答案 3 :(得分:0)

我建议,只需在uniqueid上创建一个非聚集索引,然后只使用该字段作为过滤器

答案 4 :(得分:0)

如果您没有任何索引,那么

SELECT * 
FROM [Products] 
WHERE [UniqueId] = 'product' 

如果您有任何列的索引,请在where子句中使用该列。

如果您在UniqueIdCategoryId都有索引,那么您的查询

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

很好

答案 5 :(得分:0)

只需过滤Uniqueid即可。 SQL服务器甚至不会查看其他列,因为唯一索引提供最快的排序(O = log2N)

答案 6 :(得分:0)

首先

仅拉您想要提取的

我相信,你有[CategoryId]有集群索引。所以你应该使用filter [CategoryId]来记录。不要使用产品过滤器

你的查询将是

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