2010-06-11 35 views
1

我现在有这是目前被称为多次这样的(伪代码)的SQL查询:微调一些SQL调用多次

foreach(KeyValuePair kvp in someMapList) 
{ 
    select col1 from table where col2 = kvp.key and col3 = kvp.value; 
    //do some processing on the returned value 
} 

以上能明显调用数据库的大量时间,如果它是一大串双。

谁能想到一个更有效的一块SQL的这基本上可以返回基于两个独特的信息列表上的特定值的列表中,这样的处理可以批量完成的?一个明显的例子是用ORs构建一大块SQL,但这可能效率很低?

由于

卡尔

+1

它可能更低效,使大量调用SQL服务器的再建了很多或公司的查询。只要确保索引是正确的。 – 2010-06-11 14:51:16

+0

一举成功,即使它意味着很多'或'。尽量不要在循环中查询。 – Jay 2010-06-11 14:54:56

+0

我*只是*注意到这个问题上的nhibernate标签。如果您显示的伪代码实际上使用HQL或ICriteria,那么您可以简单地让NHibernate为您制作一个批次:http://nhforge.org/blogs/nhibernate/archive/2008/08/31/the- query-batcher.aspx – Jay 2010-06-11 15:29:41

回答

0

插入KeyValuePair到表和使用JOIN人 或(如果c#)

from record in table 
join key in someMap on record.col2 equals key.key && record.col3 equals key.keyvalue 
select col1 //or some anonymous type or a DTO I do not know... 

即WAY更efficeint:d

+0

我已经看到这在其他地方提到,但插入(和删除之后)的开销不会超过选择?每次可能搜索大约100 kvp? – Carl 2010-06-11 15:04:46

0

假设你坚持使用实体 - 值对模式​​,你最好的办法是创建一个存储过程并传入一对分隔符的字符串,你可以然后转换为临时表并使用连接选择出来,或者如果可以传入更好的表参数。

另一种可能性是插入到工作表以某种对你的价值观唯一连接ID,然后加入对抗。

在任何情况下,你的目标是能够通过让你对进入以某种方式数据库中选择使用基于集合的方法中的数据。