0

我有一个需要优化的巨大查询。在我编码之前就像

SELECT [...] WHERE foo = 'var' [...]

对 2000 个不同的值执行 2000 次foo。我们都知道它有多慢。我设法加入了所有不同的查询

SELECT [...] WHERE foo = 'var' OR foo = 'var2' OR [...]

当然,有 2000 个链式比较。结果是一个巨大的查询,执行速度比以前快了几秒钟,但还不够。我想StringBuilder我正在使用的构建查询需要一段时间,因此保存 1999 年查询所获得的时间被浪费在了:

StringBuilder query = new StringBuilder();
foreach (string var in vars)
   query.Append("foo = '").Append(var).Append("' OR ");
query.Remove(query.Length - 4) // for removing the last " OR "

所以我想知道我是否可以使用一些解决方法来优化该字符串的构建,也许在与一些 SQL 技巧的比较中加入不同的值,比如

SELECT [...] WHERE foo = ('var' OR 'var2' OR [...])

所以我可以节省一些Append操作。当然,任何试图完全避免这种巨大查询的不同想法都将受到欢迎。

4

3 回答 3

1

@阿玛格顿,

对于任何像样的 DBMS,IN ()操作符都应该对应多个x OR y对应的比较。关于您对 的关注StringBuild.Append,它的实现非常有效,如果您有几 MB 用于其临时内部缓冲区,您不应该注意到有关此数据量的任何延迟。也就是说,我认为您的性能问题与这些问题无关。

对于数据库调优,提出没有“全貌”的解决方案总是遥不可及,但我认为您的问题可能与编译如此庞大的动态 SQL 语句有关。-- 解析和优化 SQL 语句会消耗大量的处理器时间,应该避免。

也许您可以通过将您的域移动到辅助索引表中来改善响应时间。或者通过使用INSTR函数 将同一 char 列上的各种检查移动到文本搜索 :

-- 1. using domain table
SELECT myColumn FROM myTable WHERE foo IN (SELECT myValue FROM myDomain);

-- 2. using INSTR function
SELECT myColumn FROM myTable WHERE INSTR('allValues', foo, 1, 1) > 0;
于 2013-09-30T16:30:16.543 回答
0

为什么不在W3school 上使用 IN-operator 和 IN-operator 一样?它可以让你以更短的方式组合你的价值观。您还可以将值存储在本文中提到的临时表中,以绕过 Oracle 上 1000 行的限制

于 2013-09-30T13:15:06.750 回答
0

自从我跳 Oracle 舞以来已经有一段时间了,但我似乎记得“绑定变量”的概念 - 通常用于批量插入......我想知道你是否可以将值列表表示为一个数组,并使用那与 IN...

不得不说 - 这只是一个想法 - 我没有时间为你进一步研究它......

于 2013-09-30T15:39:54.213 回答