首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SQL性能(替换)

SQL性能(替换)
EN

Stack Overflow用户
提问于 2010-09-02 23:46:06
回答 5查看 5.5K关注 0票数 1

我有一个表,其中包含大约400,000+行。我正在编写一些模式匹配代码,但在此之前需要清理一列。这可以归结为做一个类似替换的操作。

我试着一次列出一个……

代码语言:javascript
复制
 Update T_ADDRESS set ADDR_LINEONE = REPLACE(ADDR_LINEONE,' southeast ',' se ')
 Update T_ADDRESS set ADDR_LINEONE = REPLACE(ADDR_LINEONE,' southwest ',' sw ')

因为我有超过500的these...it花了太长的时间。

现在我正试着嵌套它们。

代码语言:javascript
复制
 Update T_ADDRESS set ADDR_LINEONE = REPLACE(REPLACE(ADDR_LINEONE,' southwest ',' sw '),' southeast ',' se ')

但这仍然缓慢得令人痛苦。我需要让这个代码在所有大小的表上工作(1条记录到500万条记录)。

有人有什么建议吗?顺便说一下,我正在使用SQL Server。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2010-09-02 23:51:36

不管你做什么替换,你都必须端到端地扫描表。这就是扼杀性能的原因,而且它不能改变,因为您必须以任何合理的方式对ADDR_LINEONE字段进行索引。

由于这应该是一次性的操作,因此长时间应该无关紧要。

如果这是一个重复的操作,那么您的问题不在这里,而是在于如何将数据加载到表中:在保存数据之前进行转换,否则您没有机会。

票数 7
EN

Stack Overflow用户

发布于 2010-09-02 23:49:00

编写一个CLR过程。TSQL不擅长(或设计用于)处理大量的字符串操作。

Regular Expressions Make Pattern Matching And Data Extraction Easier

票数 2
EN

Stack Overflow用户

发布于 2010-09-02 23:49:15

使用新值创建#TEMP表,然后进行内部连接,如下所示

代码语言:javascript
复制
create table #TempValues
(oldAres varchar(12),newadres varchar(2))

insert into #TempValues
select 'southeast','se'
union all 
select 'southwest','sw'

update T_ADDRESS
set addr_lineone=t.newadres
from T_ADDRESS inner join #TempValues t on T_ADDRESS.addr_lineone=t.oldAdres
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3628764

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档