You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何优化SQL性能以快速筛选未注册的.com英文单词域名?

优化大规模.com域名表的查询性能,找出未注册的单词域名

Alright,咱们直接针对你遇到的性能瓶颈来拆解问题——3.52亿行的原始zone数据确实是个大挑战,但只要从数据清理、索引优化、查询逻辑这几个核心点入手,就能把查询速度从分钟级拉到秒级。以下是具体的分步方案:

1. 先清理Com表,提取纯净的域名

Verisign的zone文件每条记录包含了域名、TTL、DNS类型等冗余信息(比如github.com. 3600 IN A 140.82.113.3),你的RawData列存的是整行内容,这不仅会导致查询匹配不准,还会严重拖累索引效率。

操作步骤:

  • 给Com表新增一个Domain列,类型设为nvarchar(255)(完全能容纳所有合法的.com域名):
    ALTER TABLE Com ADD Domain nvarchar(255) NOT NULL DEFAULT '';
    
  • 批量更新Domain列,提取纯域名(去掉末尾的点和后面的DNS信息):
    UPDATE Com
    SET Domain = CASE 
                  WHEN RIGHT(LEFT(RawData, CHARINDEX(' ', RawData)-1),1) = '.' 
                  THEN LEFT(LEFT(RawData, CHARINDEX(' ', RawData)-1), LEN(LEFT(RawData, CHARINDEX(' ', RawData)-1))-1)
                  ELSE LEFT(RawData, CHARINDEX(' ', RawData)-1)
                END
    -- 过滤掉格式异常的记录,避免更新失败
    WHERE CHARINDEX(' ', RawData) > 0;
    
  • 清理完成后,如果你不需要原始数据,可以删除RawData列,节省存储空间。

2. 给关键列创建索引,彻底告别全表扫描

没有索引的情况下,任何查询都要遍历3.52亿行,这速度肯定快不起来。咱们针对你的查询场景创建精准的索引:

  • 给Com表的Domain列创建非聚集索引(如果服务器内存充足,也可以考虑聚集索引——聚集索引的等值查询效率会更高):
    CREATE NONCLUSTERED INDEX IX_Com_Domain ON Com (Domain);
    
  • 给Words表的Word列也创建非聚集索引,加速后续的单词匹配:
    CREATE NONCLUSTERED INDEX IX_Words_Word ON Words (Word);
    

注意:创建3.52亿行的索引需要一定时间(可能几十分钟),建议在服务器空闲时执行,同时确保磁盘有足够的临时空间。

3. 优化查询语句,高效找出未注册域名

不要再用SELECT * FROM Com WHERE RawData = '%xxx%'这种低效写法,改用基于纯净Domain列的精确匹配,同时用NOT EXISTS或LEFT JOIN批量查询未注册单词——这两种方式比NOT IN性能好太多(NOT IN会处理NULL值,且执行逻辑更冗余)。

推荐方案一:NOT EXISTS(性能最优)

SELECT w.Word + '.com' AS UnregisteredDomain
FROM Words w
WHERE NOT EXISTS (
    SELECT 1
    FROM Com c
    WHERE c.Domain = w.Word + '.com'
)

这个逻辑是:对每个单词,检查对应的.com域名是否不在Com表中,一旦找到匹配就停止查找,效率极高。

推荐方案二:LEFT JOIN(适合需要关联更多数据的场景)

SELECT w.Word + '.com' AS UnregisteredDomain
FROM Words w
LEFT JOIN Com c ON c.Domain = w.Word + '.com'
WHERE c.Domain IS NULL

4. 数据库配置优化,榨干硬件潜力

你的硬件配置(i9-9880H、32GB内存、NVMe SSD)完全能支撑这个任务,但要确保SQL Server充分利用资源:

  • 内存配置:打开SQL Server管理工具,把最大服务器内存设置为24GB左右(留8GB给系统),让SQL Server把更多数据缓存到内存中,减少磁盘IO。
  • TempDB优化:把TempDB的多个数据文件放在NVMe SSD上,每个文件大小设置一致,避免TempDB成为瓶颈。
  • 分区表(可选):如果Com表实在太大,可以按域名的首字母或哈希值分区,查询时只扫描相关分区,进一步提升性能。

5. 批量处理(可选)

如果一次性查询37.2万条单词压力较大,可以分成批量处理,每次处理1万条,避免占用过多资源:

DECLARE @BatchSize INT = 10000;
DECLARE @StartRow INT = 1;
DECLARE @EndRow INT = @BatchSize;

WHILE @StartRow <= (SELECT COUNT(*) FROM Words)
BEGIN
    SELECT w.Word + '.com' AS UnregisteredDomain
    FROM (
        SELECT Word, ROW_NUMBER() OVER (ORDER BY Word) AS RowNum
        FROM Words
    ) w
    LEFT JOIN Com c ON c.Domain = w.Word + '.com'
    WHERE w.RowNum BETWEEN @StartRow AND @EndRow
      AND c.Domain IS NULL;

    SET @StartRow = @EndRow + 1;
    SET @EndRow = @EndRow + @BatchSize;
END

测试建议

先取1000条单词做小批量测试,确认优化后的查询速度(应该能秒级返回结果),再处理全量数据,避免浪费时间。

内容的提问来源于stack exchange,提问作者Anon Ymous

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 12:42:36