【问题标题】:Fine tune some SQL called multiple times微调一些多次调用的 SQL
【发布时间】:2010-06-11 14:44:54
【问题描述】:

我目前有一个 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 语句,它基本上可以根据两个唯一信息的列表返回特定值的列表,以便可以批量完成处理?一个明显的方法是使用 OR 构建一大段 SQL,但这可能效率很低?

谢谢

卡尔

【问题讨论】:

  • 对 sql-server 进行大量调用然后使用大量 or 构建查询可能效率更低。只需确保索引正确即可。
  • 一口气完成,即使这意味着很多or。尽量不要循环查询。
  • 只是注意到这个问题上的 nhibernate 标签。如果您显示的伪代码实际上使用 HQL 或 ICriteria,您可以简单地让 NHibernate 为您将其汇总为一个批次:nhforge.org/blogs/nhibernate/archive/2008/08/31/…
  • @Jay,谢谢。我实际上是使用 nHibernate 来实现的,所以这可能是一个很好的选择。我会看看这个。谢谢!
  • 考虑键值对是否是一件好事。最好在相关表中正确定义您的字段。键值设计是许多应用程序的失败之路。在你走得太远之前,请阅读simple-talk.com/opinion/opinion-pieces/bad-carma

标签: c# sql nhibernate


【解决方案1】:

将 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...

这样更有效:D

【讨论】:

  • 我在别处看到过这个,但是插入(以及之后的删除)的开销不会超过选择吗?每次大概搜索到 100 kvp 左右?
【解决方案2】:

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

另一种可能性是为您的值插入具有某种唯一连接 ID 的工作表,然后加入。

无论如何,您的目标是通过以某种方式将您的配对输入数据库,从而能够使用基于集合的方法来选择数据。

【讨论】:

    猜你喜欢
    • 2021-07-22
    • 1970-01-01
    • 2018-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多