【问题标题】:How to boost speed of my query for a large table in SQL Server如何提高 SQL Server 中大型表的查询速度
【发布时间】:2017-10-16 18:59:48
【问题描述】:

(我会简化...)

一个包含 4500 万条记录且逐日增加的表。

每天晚上,我都必须替换一个表格,在该表格中我必须从 nvarchar(max) 字段中删除 HTML、CSS 标记

并且还将 GMT 从日期时间字段转换为 UTC (8)。

我用标量函数进行了测试,但它真的很慢,需要好几个小时......

什么是最好的方法(就性能而言)? 我不需要SQL查询,只是为了解释方式/方法......

谢谢!

精度: 我必须在一夜之间从商业产品中提取 4500 万条记录(我无法控制软件),并将数据重定向到另一个 SQL Server 上的“主”数据库......

我尝试了很多方法,例如... SQL - Remove all HTML tags in a string

Convert Datetime column from UTC to local time in select statement

但它真的很慢......

【问题讨论】:

  • 就性能而言,最好的方法是在插入数据之前对其进行清理,这样您就不必每晚擦洗它。
  • 那么你期待什么?这非常模糊,我们无法提供答案。可以说你还没有真正问过问题。您似乎需要一些帮助,但没有详细信息,我们无法为您提供任何指导。
  • 使用 CLR 处理字符串而不是 TSQL。
  • 每天添加多少行?您可以跟踪添加了哪些行并只清理那些行吗?这样你就可以边走边打扫了。
  • 来自Wikipedia:“对于最常见和合法的贸易目的,UTC 和 UT (GMT) 之间的小数秒差异微不足道。格林威治标准时间是英国冬季的法律标准,并且这种符号为人们所熟悉和使用。”不超过 +/-0.9 秒的误差对您的应用程序来说真的是个问题吗?你如何得到更正?

标签: sql sql-server tsql boost


【解决方案1】:

标量函数会害死你。尤其是在处理数百万条记录时。请注意这篇文章:https://www.sqlservercentral.com/Forums/Topic1338291-203-1.aspx 尝试改用内联表值函数(注意同一篇文章)。

您还可以从并行化查询中受益。这是一个documented method 这样做。如果您在查询中不使用标量 udf,则只能使查询并行。

去除标签和 CSS(假设它在 html 标头中定义)的最简单方法是使用 SQLXML 方法。这是一个可以帮助您入门的示例。

declare @somehtml nvarchar(max) =
'<html>
  <head>
    <title>A Web Page</title>

    <style>
    body {background-color: powderblue;}
    h1   {color: blue;}
    p    {color: red;}
    </style>

  </head>

  <body>
    <h1>News Flash</h1>
    <p>We lulled LA into a false sense of security.</p>
    <p>0-2 means nothing. The Cubs will win. </p>
  </body>
</html>'

declare @cleaned nvarchar(max) ='';

select @cleaned  += z.xx.value('.', 'nvarchar(max)')+char(10)
from (values (cast(@somehtml as xml))) x(xx)
cross apply xx.nodes('/html/body/node()') z(xx);

print @cleaned;

返回:

快讯

我们让洛杉矶产生了一种虚假的安全感。

0-2 没有任何意义。

小熊队会赢。

【讨论】:

  • 真的非常感谢!这就是我所希望的——我的名声太低,无法投票给你的答案……又是 tanx!
猜你喜欢
  • 2022-01-22
  • 1970-01-01
  • 2021-04-24
  • 2013-07-06
  • 2012-04-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多