请问有什么方法可以提升使用 sql 语句查询笔记的效率嘛

请教一下,对于像这样比较大的 sql 语句,有什么方法可以提升一下运行的效率吗?这个查询语句是用 AI 生成的,但是 AI 给出的优化好像也不明显,感觉还是好慢

WITH RECURSIVE TitleBlocks AS (
    -- 第一层,找到所有超级块 B 里的标题块(一级标题)
    SELECT b2.id, b2.content
    FROM blocks AS b2
    WHERE b2.type = 'h'  -- 标题块


        -------!!!!!【在这里修改需要汇总的书籍名字】!!!!!---------
    AND b2.markdown LIKE '%# 《亲密关系》-米勒-目录%'-- 超级块 B 的条件


    UNION ALL
    -- 后续层级,找到所有子标题块(递归查找每个标题块的 parent_id)
    SELECT b2.id, b2.content
    FROM blocks AS b2
    JOIN TitleBlocks AS tb ON b2.parent_id = tb.id  -- 递归查找 parent_id
    WHERE b2.type = 'h'  -- 继续筛选标题块
),
-- 定义 CTE FilteredBlocks 用于筛选 type 为 'i' 且包含标题块内容的记录
FilteredBlocks AS (
    SELECT b1.markdown
    FROM blocks AS b1
    JOIN TitleBlocks AS tb
        ON b1.markdown LIKE '%' || tb.content || '%'  -- 只匹配包含标题块内容的记录
    WHERE b1.type = 'i'  -- 筛选出 type 为 'i' 的块
    AND b1.markdown NOT LIKE '%00-功能测试%' 
),
-- 生成包含所有要统计类型的辅助表
Types AS (
    SELECT '精彩文案' AS type
    UNION ALL
    SELECT '重要观点' AS type
    UNION ALL
    SELECT '内容讨论' AS type
    UNION ALL
    SELECT '内容有感' AS type
),
-- 统计精彩文案数量
GreatCopywritingCount AS (
    SELECT 
        COUNT(*) AS count
    FROM blocks AS bb
    WHERE
        bb.type = 'i'
        AND bb.fcontent LIKE '%精彩文案%'
        AND bb.markdown LIKE '%精彩文案%>%'
        AND EXISTS (
            -- 通过 EXISTS 查找 FilteredBlocks 中的匹配记录
            SELECT 1
            FROM FilteredBlocks fb
            WHERE REPLACE(REPLACE(fb.markdown, '\n', ''), ' ', '') LIKE '%' || REPLACE(REPLACE(bb.markdown, '\n', ''), ' ', '') || '%'
        )
),
-- 统计重要观点数量
ImportantOpinionCount AS (
    SELECT 
        COUNT(*) AS count
    FROM blocks AS bb
    WHERE
        bb.type = 'i'
        AND bb.fcontent LIKE '%重要观点%'
        AND bb.markdown LIKE '%重要观点%>%'
        AND EXISTS (
            -- 通过 EXISTS 查找 FilteredBlocks 中的匹配记录
            SELECT 1
            FROM FilteredBlocks fb
            WHERE REPLACE(REPLACE(fb.markdown, '\n', ''), ' ', '') LIKE '%' || REPLACE(REPLACE(bb.markdown, '\n', ''), ' ', '') || '%'
        )
),
-- 统计内容讨论数量
ContentDiscussionCount AS (
    SELECT 
        COUNT(*) AS count
    FROM blocks AS bb
    WHERE
        bb.type = 'i'
        AND bb.fcontent LIKE '%内容讨论%'
        AND bb.markdown LIKE '%内容讨论%>%'
        AND EXISTS (
            -- 通过 EXISTS 查找 FilteredBlocks 中的匹配记录
            SELECT 1
            FROM FilteredBlocks fb
            WHERE REPLACE(REPLACE(fb.markdown, '\n', ''), ' ', '') LIKE '%' || REPLACE(REPLACE(bb.markdown, '\n', ''), ' ', '') || '%'
        )
),
-- 统计内容有感数量
ContentReflectionCount AS (
    SELECT 
        COUNT(*) AS count
    FROM blocks AS bb
    WHERE
        bb.type = 'i'
        AND bb.fcontent LIKE '%内容有感%'
        AND bb.markdown LIKE '%内容有感%>%'
        AND EXISTS (
            -- 通过 EXISTS 查找 FilteredBlocks 中的匹配记录
            SELECT 1
            FROM FilteredBlocks fb
            WHERE REPLACE(REPLACE(fb.markdown, '\n', ''), ' ', '') LIKE '%' || REPLACE(REPLACE(bb.markdown, '\n', ''), ' ', '') || '%'
        )
)
SELECT
    t.type AS 笔记类型,
    COALESCE(
        CASE 
            WHEN t.type = '精彩文案' THEN gcc.count
            WHEN t.type = '重要观点' THEN ioc.count
            WHEN t.type = '内容讨论' THEN cdc.count
            WHEN t.type = '内容有感' THEN crc.count
            ELSE 0
        END,
        0
    ) AS 笔记数量
FROM Types t
LEFT JOIN GreatCopywritingCount gcc ON t.type = '精彩文案'
LEFT JOIN ImportantOpinionCount ioc ON t.type = '重要观点'
LEFT JOIN ContentDiscussionCount cdc ON t.type = '内容讨论'
LEFT JOIN ContentReflectionCount crc ON t.type = '内容有感'
GROUP BY t.type;
  • 思源笔记

    思源笔记是一款隐私优先的个人知识管理系统,支持完全离线使用,同时也支持端到端加密同步。

    融合块、大纲和双向链接,重构你的思维。

    25248 引用 • 104158 回帖
  • SQL
    128 引用 • 390 回帖 • 3 关注
  • Q&A

    提问之前请先看《提问的智慧》,好的问题比好的答案更有价值。

    9649 引用 • 43885 回帖 • 93 关注

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...
  • 为什么要搞这么复杂,你的实际需求是什么?

    1 回复
  • 其他回帖
  • SyTlr

    这是查询单个标签笔记的 sql

    WITH RECURSIVE TargetBook AS (
        -- 这里定义目标书籍名称
        SELECT '《我们纯真的青春》' AS book_name
    ),
    
    TargetExclusion AS (
        -- 这里定义需要排除的内容
        SELECT '%((%00-功能测试文档%))%' AS exclusion_pattern
    ),
    
    FilteredBlocks AS (
        -- 只保留 hpath 符合条件的内容块
        SELECT * FROM blocks 
        WHERE hpath LIKE '%/DailyNote-时间索引/%'
        AND content NOT LIKE (SELECT exclusion_pattern FROM TargetExclusion)  -- 排除内容块中的不相关内容
    ),
    
    BookChapters AS (
        -- 选取目录超级块(确保是指定书籍的目录)
        SELECT b.id, b.content, b.markdown
        FROM FilteredBlocks AS b
        JOIN TargetBook tb ON b.fcontent LIKE tb.book_name || '-%'
        WHERE b.type = 's'  
        AND b.markdown NOT LIKE '{{{col%' 
        AND b.markdown NOT LIKE (SELECT exclusion_pattern FROM TargetExclusion)  -- 排除不相关内容块
    
        UNION ALL
    
        -- 递归查找属于该书籍目录的 **所有章节块(标题 h)**
        SELECT b2.id, b2.content, b2.markdown
        FROM FilteredBlocks AS b2
        JOIN BookChapters AS bc ON b2.parent_id = bc.id
        WHERE b2.type = 'h'  -- 只递归查找标题块
        AND b2.markdown NOT LIKE (SELECT exclusion_pattern FROM TargetExclusion)  -- 排除不相关内容块
    ),
    
    RelatedNotes AS (
        -- 直接包含对该书籍的反链引用的内容块
        SELECT b.id, b.content, b.markdown, b.type, b.hpath
        FROM FilteredBlocks AS b
        JOIN TargetBook tb ON b.markdown LIKE '%((%' || tb.book_name || '%))%'
        AND b.markdown NOT LIKE (SELECT exclusion_pattern FROM TargetExclusion)  -- 排除不相关内容块
    
        UNION
    
        -- 通过 refs 表反链引用书籍章节的内容块
        SELECT b.id, b.content, b.markdown, b.type, b.hpath
        FROM FilteredBlocks AS b
        JOIN refs AS r ON b.id = r.def_block_id
        WHERE r.def_block_id IN (SELECT id FROM BookChapters)
        AND b.markdown NOT LIKE (SELECT exclusion_pattern FROM TargetExclusion)  -- 排除不相关内容块
    ),
    
    -- 递归查找 `RelatedNotes` 的所有子块
    RecursiveChildren AS (
        SELECT b.*
        FROM FilteredBlocks b
        WHERE b.parent_id IN (SELECT id FROM RelatedNotes)
    
        UNION
    
        SELECT b.*
        FROM FilteredBlocks b
        JOIN RecursiveChildren rc ON b.parent_id = rc.id
        WHERE b.content NOT LIKE (SELECT exclusion_pattern FROM TargetExclusion)  -- 排除子块中的不相关内容
    ),
    
    ImportantPoints AS (
        -- 筛选出 “#功能标签#” 的内容块
        SELECT b.*
        FROM RecursiveChildren b
        WHERE 
            b.tag LIKE '%精彩文案%#%'  -- 确保包含 #功能标签#
            AND b.tag NOT LIKE '%#【专辑】%读书笔记#%'  -- 确保不包含 #【专辑】%读书笔记#
            AND b.type = 'i'
    )
    
    SELECT * FROM ImportantPoints
    ORDER BY CREATED;
    
    
  • SyTlr

    emmm,用 gpt 重新写了一个查询语句,性能高了很多很多,贴在这里记录一下吧

    WITH RECURSIVE TargetBook AS (
        -- 目标书籍
        SELECT '《最好的我们》' AS book_name
    ),
    
    TargetExclusion AS (
        -- 需要排除的内容
        SELECT '%((%00-功能测试文档%))%' AS exclusion_pattern
    ),
    
    FilteredBlocks AS (
        -- 只保留符合条件的内容块
        SELECT * FROM blocks 
        WHERE hpath LIKE '%/DailyNote-时间索引/%'
        AND content NOT LIKE (SELECT exclusion_pattern FROM TargetExclusion)
    ),
    
    BookChapters AS (
        -- 选取目录超级块(确保是指定书籍的目录)
        SELECT b.id, b.content, b.markdown
        FROM FilteredBlocks AS b
        JOIN TargetBook tb ON b.fcontent LIKE tb.book_name || '-%'
        WHERE b.type = 's'  
        AND b.markdown NOT LIKE '{{{col%' 
        AND b.markdown NOT LIKE (SELECT exclusion_pattern FROM TargetExclusion)
    
        UNION ALL
    
        -- 递归查找属于该书籍目录的所有章节块(标题 h)
        SELECT b2.id, b2.content, b2.markdown
        FROM FilteredBlocks AS b2
        JOIN BookChapters AS bc ON b2.parent_id = bc.id
        WHERE b2.type = 'h'  
        AND b2.markdown NOT LIKE (SELECT exclusion_pattern FROM TargetExclusion)
    ),
    
    RelatedNotes AS (
        -- 直接包含对该书籍的反链引用的内容块
        SELECT b.id, b.content, b.markdown, b.type, b.hpath
        FROM FilteredBlocks AS b
        JOIN TargetBook tb ON b.markdown LIKE '%((%' || tb.book_name || '%))%'
        AND b.markdown NOT LIKE (SELECT exclusion_pattern FROM TargetExclusion)
    
        UNION
    
        -- 通过 refs 表反链引用书籍章节的内容块
        SELECT b.id, b.content, b.markdown, b.type, b.hpath
        FROM FilteredBlocks AS b
        JOIN refs AS r ON b.id = r.def_block_id
        WHERE r.def_block_id IN (SELECT id FROM BookChapters)
        AND b.markdown NOT LIKE (SELECT exclusion_pattern FROM TargetExclusion)
    ),
    
    -- 递归查找 RelatedNotes 的所有子块
    RecursiveChildren AS (
        SELECT b.*
        FROM FilteredBlocks b
        WHERE b.parent_id IN (SELECT id FROM RelatedNotes)
    
        UNION
    
        SELECT b.*
        FROM FilteredBlocks b
        JOIN RecursiveChildren rc ON b.parent_id = rc.id
        WHERE b.content NOT LIKE (SELECT exclusion_pattern FROM TargetExclusion)
    ),
    
    TagList AS (
        -- 统一管理所有要统计的标签
        SELECT '内容有感' AS 笔记类型, '%内容有感%#%' AS tag_pattern
        UNION ALL
        SELECT '内容讨论', '%内容讨论%#%'
        UNION ALL
        SELECT '精彩文案', '%精彩文案%#%'
        UNION ALL
        SELECT '重要观点', '%重要观点%#%'
    ),
    
    DesiredTags AS (
        -- 筛选出符合 TagList 里定义标签的内容块
        SELECT b.*, t.笔记类型
        FROM RecursiveChildren b
        JOIN TagList t ON b.tag LIKE t.tag_pattern
        WHERE b.tag NOT LIKE '%#【专辑】%读书笔记#%'
        AND b.type = 'i'
    ),
    
    TagCounts AS (
        -- 统计每个标签的笔记数量
        SELECT t.笔记类型, COUNT(b.id) AS 数量
        FROM TagList t
        LEFT JOIN DesiredTags b ON t.笔记类型 = b.笔记类型
        GROUP BY t.笔记类型
    )
    
    -- 最终统计结果,保证所有标签都显示,即使没有笔记
    SELECT t.笔记类型, COALESCE(tc.数量, 0) AS 数量
    FROM TagList t
    LEFT JOIN TagCounts tc ON t.笔记类型 = tc.笔记类型
    ORDER BY t.笔记类型;
    
    
  • SyTlr

    我的使用场景是,想把把阅读书本时产生的笔记 按不同的功能标签 汇总起来,另外统计不同的功能标签的笔记数量。

    所以设计了一个类似下面的结构:

    - [[书本名字反链]],#读书笔记标签#
    
        ## 书本章节1
    
        ### [[主题反链]]
    
        - #功能标签1#
    	笔记内容
    

    因为 功能标签的父级块不是书本名字,所以就想到 多嵌套一层查询条件,通过匹配查找书本目录这个超级块里的章节名称(标题块)来找到对应的笔记内容 ,实现曲线救国

    帖子里的语句 是 汇总统计了 在这个结构下 4 个不同功能标签 对应的笔记数量

    3 操作
    SyTlr 在 2025-03-26 20:30:04 更新了该回帖
    SyTlr 在 2025-03-26 20:24:17 更新了该回帖
    SyTlr 在 2025-03-26 20:21:22 更新了该回帖

推荐标签 标签

  • 工具

    子曰:“工欲善其事,必先利其器。”

    298 引用 • 763 回帖
  • Postman

    Postman 是一款简单好用的 HTTP API 调试工具。

    4 引用 • 3 回帖 • 2 关注
  • SEO

    发布对别人有帮助的原创内容是最好的 SEO 方式。

    35 引用 • 200 回帖 • 32 关注
  • 资讯

    资讯是用户因为及时地获得它并利用它而能够在相对短的时间内给自己带来价值的信息,资讯有时效性和地域性。

    56 引用 • 85 回帖
  • B3log

    B3log 是一个开源组织,名字来源于“Bulletin Board Blog”缩写,目标是将独立博客与论坛结合,形成一种新的网络社区体验,详细请看 B3log 构思。目前 B3log 已经开源了多款产品:SymSoloVditor思源笔记

    1063 引用 • 3455 回帖 • 161 关注
  • PostgreSQL

    PostgreSQL 是一款功能强大的企业级数据库系统,在 BSD 开源许可证下发布。

    22 引用 • 22 回帖 • 1 关注
  • BND

    BND(Baidu Netdisk Downloader)是一款图形界面的百度网盘不限速下载器,支持 Windows、Linux 和 Mac,详细介绍请看这里

    107 引用 • 1281 回帖 • 34 关注
  • 反馈

    Communication channel for makers and users.

    121 引用 • 907 回帖 • 271 关注
  • Docker

    Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的操作系统上。容器完全使用沙箱机制,几乎没有性能开销,可以很容易地在机器和数据中心中运行。

    494 引用 • 930 回帖
  • 宕机

    宕机,多指一些网站、游戏、网络应用等服务器一种区别于正常运行的状态,也叫“Down 机”、“当机”或“死机”。宕机状态不仅仅是指服务器“挂掉了”、“死机了”状态,也包括服务器假死、停用、关闭等一些原因而导致出现的不能够正常运行的状态。

    13 引用 • 82 回帖 • 76 关注
  • Caddy

    Caddy 是一款默认自动启用 HTTPS 的 HTTP/2 Web 服务器。

    12 引用 • 54 回帖 • 171 关注
  • Ubuntu

    Ubuntu(友帮拓、优般图、乌班图)是一个以桌面应用为主的 Linux 操作系统,其名称来自非洲南部祖鲁语或豪萨语的“ubuntu”一词,意思是“人性”、“我的存在是因为大家的存在”,是非洲传统的一种价值观,类似华人社会的“仁爱”思想。Ubuntu 的目标在于为一般用户提供一个最新的、同时又相当稳定的主要由自由软件构建而成的操作系统。

    127 引用 • 169 回帖 • 2 关注
  • Eclipse

    Eclipse 是一个开放源代码的、基于 Java 的可扩展开发平台。就其本身而言,它只是一个框架和一组服务,用于通过插件组件构建开发环境。

    76 引用 • 258 回帖 • 628 关注
  • 导航

    各种网址链接、内容导航。

    43 引用 • 177 回帖
  • IDEA

    IDEA 全称 IntelliJ IDEA,是一款 Java 语言开发的集成环境,在业界被公认为最好的 Java 开发工具之一。IDEA 是 JetBrains 公司的产品,这家公司总部位于捷克共和国的首都布拉格,开发人员以严谨著称的东欧程序员为主。

    181 引用 • 400 回帖
  • 思源笔记

    思源笔记是一款隐私优先的个人知识管理系统,支持完全离线使用,同时也支持端到端加密同步。

    融合块、大纲和双向链接,重构你的思维。

    25248 引用 • 104158 回帖
  • 域名

    域名(Domain Name),简称域名、网域,是由一串用点分隔的名字组成的 Internet 上某一台计算机或计算机组的名称,用于在数据传输时标识计算机的电子方位(有时也指地理位置)。

    44 引用 • 208 回帖 • 3 关注
  • 知乎

    知乎是网络问答社区,连接各行各业的用户。用户分享着彼此的知识、经验和见解,为中文互联网源源不断地提供多种多样的信息。

    10 引用 • 66 回帖
  • 心情

    心是产生任何想法的源泉,心本体会陷入到对自己本体不能理解的状态中,因为心能产生任何想法,不能分出对错,不能分出自己。

    59 引用 • 369 回帖 • 3 关注
  • 开源中国

    开源中国是目前中国最大的开源技术社区。传播开源的理念,推广开源项目,为 IT 开发者提供了一个发现、使用、并交流开源技术的平台。目前开源中国社区已收录超过两万款开源软件。

    7 引用 • 86 回帖
  • Kubernetes

    Kubernetes 是 Google 开源的一个容器编排引擎,它支持自动化部署、大规模可伸缩、应用容器化管理。

    116 引用 • 54 回帖
  • 钉钉

    钉钉,专为中国企业打造的免费沟通协同多端平台, 阿里巴巴出品。

    15 引用 • 67 回帖 • 286 关注
  • Flume

    Flume 是一套分布式的、可靠的,可用于有效地收集、聚合和搬运大量日志数据的服务架构。

    9 引用 • 6 回帖 • 652 关注
  • 百度

    百度(Nasdaq:BIDU)是全球最大的中文搜索引擎、最大的中文网站。2000 年 1 月由李彦宏创立于北京中关村,致力于向人们提供“简单,可依赖”的信息获取方式。“百度”二字源于中国宋朝词人辛弃疾的《青玉案·元夕》词句“众里寻他千百度”,象征着百度对中文信息检索技术的执著追求。

    63 引用 • 785 回帖 • 96 关注
  • 深度学习

    深度学习(Deep Learning)是机器学习的分支,是一种试图使用包含复杂结构或由多重非线性变换构成的多个处理层对数据进行高层抽象的算法。

    54 引用 • 41 回帖
  • MyBatis

    MyBatis 本是 Apache 软件基金会 的一个开源项目 iBatis,2010 年这个项目由 Apache 软件基金会迁移到了 google code,并且改名为 MyBatis ,2013 年 11 月再次迁移到了 GitHub。

    173 引用 • 414 回帖 • 368 关注
  • 脑图

    脑图又叫思维导图,是表达发散性思维的有效图形思维工具 ,它简单却又很有效,是一种实用性的思维工具。

    32 引用 • 99 回帖