实现 TSQL 功能"value in a custom set of values"的最有效方法



在我的使用SQL服务器的项目中Microsoft有很多实例,其中有各种SQL查询的形式为WHERE fieldValue IN (value1, value2, value3)fieldValue NOT IN (<set of values>)。为了在代码中管理这些实例,值集在单独的配置文件中定义,其中为集分配了一个名称,类似于valueSet['setName'] = [value1, value2, value3],然后可以在需要时按名称检索这些集,并将其提供给 ORM 查询。

我现在想将这些集合定义移动到数据库:两个表,一个用于集合(id、名称、描述(,另一个用于集合内容(集合 id、值(。并且,实现可在 SQL 查询中使用的自定义函数。

我可以想到两种方法:

1( 标量功能

WHERE dbo.isValueInSet(fieldValue, 'setName') = 1

2( 表值函数

a(WHERE fieldValue IN (SELECT * FROM dbo.valueSet('setName'))

或 b(INNER JOIN dbo.valueSet('setName') ON fieldValue = idFieldFromSet,我认为它不比 (a( 变体有效或更有效。

我不确定也许有更好的方法。我还担心性能:如果我实现标量值函数,这是否意味着将为表中的每一行调用它?这感觉就像是一件非常无效的事情。在这方面,表值函数感觉是更好的选择。但也许还有另一种方法可以实现这一点,它比我描述的两种选择中的任何一种都更有效?

不要做标量。

不要执行表函数。 优化器假定返回 1 行,这种情况很少发生,并且偶尔会导致不适当的查询计划。

我会继续你正在做的事情或嵌入完整的查询,删除函数:

WHERE fieldValue IN (SELECT VAL FROM VALUE_TABLE where VAL_SET_NAME='setName')

相关内容

  • 没有找到相关文章

最新更新