1

首先,我为这里的糟糕格式道歉。

其次,我应该预先说更改表模式不是一种选择。

所以我有一个表定义如下:

Pin varchar
OfferCode varchar

Pin 将包含以下数据:
abc、
abc123

OfferCode 将包含以下数据:
123
123~124~125

我需要一个查询来检查 Pin/OfferCode 组合的计数,当我说 OfferCode 时,我的意思是由波浪号分隔的单个项目。

例如,如果有一行看起来像abc, 123,另一行看起来像abc,123~124,并且我搜索Pin=abc,OfferCode=123我的魔杖的计数以获得计数 = 2。

显然我可以做一个类似的查询:
SELECT count(1) from MyTable (nolock) where OfferCode like '%' + @OfferCode + '%' and Pin = @Pin

在这里使用like非常昂贵,我希望可能有更有效的方法。

我也在研究使用拆分字符串解决方案。我有一个SplitString(string,delim)将返回 table的表值函数OutParam,但我不太确定如何将它应用于表列和字符串。这甚至值得追求吗?看起来它会贵得多,但我无法获得一个可行的解决方案来与该like解决方案进行比较。

4

4 回答 4

1

像这里一样使用非常昂贵,我希望可能有更有效的方法

有效的方法是规范化模式并将每个模式放在OfferCode自己的行中。

然后您的查询更像是(尽管您可能需要根据您的架构使用交集表):

select count(*)
from MyTable 
where OfferCode = @OfferCode 
    and Pin = @Pin
于 2012-10-01T17:23:37.270 回答
1

如果您的报价代码不是 3 位数,则您的 like/% 解决方案可能会出现错误(如果有报价代码 123 和 1234,则搜索 like '%123%' 将返回两者,这是错误的)。您可以通过这种方式使用您的字符串函数:

SELECT Pin, count(1) 
FROM MyTable (nolock) 
CROSS APPLY SplitString(OfferCode,'~') OutParam 
WHERE OutParam.Value = @OfferCode and Pin = @Pin
GROUP BY Pin

如果你有一张相对较小的桌子,你可能会摆脱这个。如果您正在处理大量行或遇到性能问题,则按照 RedFilter 的建议对其进行规范化会更有效。

于 2012-10-01T17:44:25.907 回答
1

这是解决like此问题的一种方法,这是在搜索分隔字符串同时避免该问题时获得精确匹配的标准'%123%' matches '123' and '1234'

-- Create some test data
declare @table table (
      Pin varchar(10) not null
    , OfferCode varchar(100) not null
)
insert into @table select 'abc', '123'
insert into @table select 'abc', '123~124'

-- Mock some proc params
declare @Pin varchar(10) = 'abc'
declare @OfferCode varchar(10) = '123'

-- Run the actual query
select count(*) as Matches
from @table
where Pin = @Pin
    -- Append delimiters to find exact matches
    and '~' + OfferCode + '~' like '%~' + @OfferCode + '~%'

如您所见,我们将分隔符添加到搜索字符串以及搜索字符串以查找匹配项,从而避免其他答案提到的错误。

我非常怀疑字符串拆分功能是否会产生更好的性能,但使用一些最近建议like的方法可能值得一两次测试。如果您仍然有不可接受的性能,您有几个选择:

更新:

  • 尝试在OfferCode(或计算的持久列)上的索引'~' + OfferCode + '~'。与 SQL Server 不会将索引与like通配符一起使用的神话相反,这实际上可能会有所帮助
  • 查看全文搜索
  • 使用字符串拆分器创建此表的规范化版本。使用此表计算您的计数。根据一些时间表或事件(触发器等)更新此表。
  • 如果您有一些标准搜索词,请预先计算这些词的计数并定期存储它们。
于 2012-10-01T19:33:40.573 回答
0

实际上,LIKE 条件比进行任何类型的字符串操作和比较的成本要低得多。

http://www.simple-talk.com/sql/performance/the-seven-sins-against-tsql-performance/

于 2012-10-01T17:52:09.800 回答