0

我有一个包含以下列的表

Id         (int)
UniqueId   (string)
CategoryId (int)

Id 和 UniqueId 对于每条记录都是唯一的。

我想根据UniqueId价值找到记录,我也CategoryId有价值。

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

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

还是我应该只使用[UniqueId]过滤器?

该表有很多记录

编辑 :

我没有[Id]商品的栏目

4

7 回答 7

2

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

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

于 2012-09-07T06:21:46.943 回答
2

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

如果您有一个索引,(UniqueId, CategoryId)其中的列设置了适当的包含列,那么您的查询应该没问题。

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

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

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

看看像执行计划基础这样的东西

于 2012-09-07T06:23:36.767 回答
0

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

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

于 2012-09-07T06:17:29.937 回答
0

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

于 2012-09-07T06:18:39.397 回答
0

如果您没有任何索引,则

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

如果您对任何列都有索引,则在where子句中使用该列。

如果您对两者都有索引UniqueIdCategoryId那么您的查询

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

很好

于 2012-09-07T06:19:51.283 回答
0

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

于 2012-09-07T06:22:05.853 回答
0

首先

仅拉出要拉出的列

我相信,你有 [CategoryId] 有集群索引。因此,您应该使用过滤器 [CategoryId] 提取记录。不要使用产品过滤器

你的查询是

SELECT * FROM [Products] Where  [CategoryId] = 4
于 2012-09-07T06:26:29.687 回答