对这个SQL查询使用这个暴力方法是否可行?

时间:2012-07-10 15:26:03

标签: sql sql-server-2008 csv

我有一个6700个ID的列表,存储在Excel文件中,我想在数据库中搜索。我有这样的查询:

select distinct RespondentID,  QuestionID,Condition
from RespondentProfiles (nolock) 
where RespondentID in (10286334,13988335, 18834444,26134155, 8658775)
and QuestionID in (113) 

我的ID是上面的RespondentID,它们看起来像这样:

10286334,
13988335, 
18834444,
26134155,
 8658775,
 1616806,
 3470656,
30981782,
29302573,
29043779,
12899462,
 7420528,
17040183,
26129711,
19542507

Excel表示它可以保存为以逗号分隔的值。但我无法做到这一点(即我想要一个包含所有值的文本文件,以逗号分隔)然后我会剪切&粘贴到查询中。哪个看起来有点难看,毫无疑问,但我认为这是可行的,还是太慢了?

谢谢!

2 个答案:

答案 0 :(得分:1)

嗯 - 对于ID列表,没有其他方法可以选择加载它们

如果问题是速度 - 那么它将与索引允许的速度一样快。 RespondentID是群集密钥/索引吗?

如果是这样,它应该不会太糟糕,因为它只是一个索引搜索的负载 - 聚集索引(如果是一个)应该覆盖此查询

答案 1 :(得分:1)

在上面的查询中,如果您将QuestionID编入索引,则服务器将使用索引查找QuestionID为113的行。然后,它将扫描QuestionID为113的所有行,并使用二进制搜索查看RespondentID是否在ID列表中。

因此,如果有100行,其中QuestionID为113,它将扫描所有100行,但不扫描整个数据集。

您可以使用覆盖索引加快速度,以便服务器使用索引扫描而不是表扫描。只需按顺序在QuestionID,RespondentID和Condition上创建一个复合“覆盖”索引。

覆盖索引的大小可能会有一些限制,具体取决于列的大小。如果您发布架构,我们可以提供更详细的答案。