请问有什么方法可以提升使用 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;
  • 思源笔记

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

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

    25914 引用 • 107392 回帖 • 2 关注
  • SQL
    129 引用 • 396 回帖 • 3 关注
  • Q&A

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

    9950 引用 • 45192 回帖 • 77 关注

相关帖子

欢迎来到这里!

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

注册 关于
请输入回帖内容 ...
  • 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.笔记类型;
  • 其他回帖
  • 为什么要搞这么复杂,你的实际需求是什么?

    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

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

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

    - [[书本名字反链]],#读书笔记标签# ## 书本章节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 更新了该回帖

推荐标签 标签

  • 房星科技

    房星网,我们不和没有钱的程序员谈理想,我们要让程序员又有理想又有钱。我们有雄厚的房地产行业线下资源,遍布昆明全城的 100 家门店、四千地产经纪人是我们坚实的后盾。

    6 引用 • 141 回帖 • 602 关注
  • jQuery

    jQuery 是一套跨浏览器的 JavaScript 库,强化 HTML 与 JavaScript 之间的操作。由 John Resig 在 2006 年 1 月的 BarCamp NYC 上释出第一个版本。全球约有 28% 的网站使用 jQuery,是非常受欢迎的 JavaScript 库。

    63 引用 • 134 回帖 • 734 关注
  • Vim

    Vim 是类 UNIX 系统文本编辑器 Vi 的加强版本,加入了更多特性来帮助编辑源代码。Vim 的部分增强功能包括文件比较(vimdiff)、语法高亮、全面的帮助系统、本地脚本(Vimscript)和便于选择的可视化模式。

    29 引用 • 66 回帖 • 3 关注
  • abitmean

    有点意思就行了

    31 关注
  • 深度学习

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

    43 引用 • 44 回帖 • 2 关注
  • Anytype
    3 引用 • 31 回帖 • 25 关注
  • 持续集成

    持续集成(Continuous Integration)是一种软件开发实践,即团队开发成员经常集成他们的工作,通过每个成员每天至少集成一次,也就意味着每天可能会发生多次集成。每次集成都通过自动化的构建(包括编译,发布,自动化测试)来验证,从而尽早地发现集成错误。

    15 引用 • 7 回帖
  • 职场

    找到自己的位置,萌新烦恼少。

    127 引用 • 1708 回帖
  • OpenStack

    OpenStack 是一个云操作系统,通过数据中心可控制大型的计算、存储、网络等资源池。所有的管理通过前端界面管理员就可以完成,同样也可以通过 Web 接口让最终用户部署资源。

    10 引用 • 1 关注
  • 友情链接

    确认过眼神后的灵魂连接,站在链在!

    24 引用 • 373 回帖 • 1 关注
  • 资讯

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

    56 引用 • 85 回帖 • 1 关注
  • HBase

    HBase 是一个分布式的、面向列的开源数据库,该技术来源于 Fay Chang 所撰写的 Google 论文 “Bigtable:一个结构化数据的分布式存储系统”。就像 Bigtable 利用了 Google 文件系统所提供的分布式数据存储一样,HBase 在 Hadoop 之上提供了类似于 Bigtable 的能力。

    17 引用 • 6 回帖 • 65 关注
  • FlowUs

    FlowUs.息流 个人及团队的新一代生产力工具。

    让复杂的信息管理更轻松、自由、充满创意。

    1 引用 • 7 关注
  • Kubernetes

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

    118 引用 • 54 回帖 • 2 关注
  • Ngui

    Ngui 是一个 GUI 的排版显示引擎和跨平台的 GUI 应用程序开发框架,基于
    Node.js / OpenGL。目标是在此基础上开发 GUI 应用程序可拥有开发 WEB 应用般简单与速度同时兼顾 Native 应用程序的性能与体验。

    7 引用 • 9 回帖 • 402 关注
  • 心情

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

    59 引用 • 369 回帖
  • QQ

    1999 年 2 月腾讯正式推出“腾讯 QQ”,在线用户由 1999 年的 2 人(马化腾和张志东)到现在已经发展到上亿用户了,在线人数超过一亿,是目前使用最广泛的聊天软件之一。

    45 引用 • 557 回帖
  • JWT

    JWT(JSON Web Token)是一种用于双方之间传递信息的简洁的、安全的表述性声明规范。JWT 作为一个开放的标准(RFC 7519),定义了一种简洁的,自包含的方法用于通信双方之间以 JSON 的形式安全的传递信息。

    20 引用 • 15 回帖 • 25 关注
  • App

    App(应用程序,Application 的缩写)一般指手机软件。

    91 引用 • 384 回帖
  • 酷鸟浏览器

    安全 · 稳定 · 快速
    为跨境从业人员提供专业的跨境浏览器

    3 引用 • 59 回帖 • 48 关注
  • sts
    2 引用 • 2 回帖 • 239 关注
  • Access
    1 引用 • 3 回帖 • 3 关注
  • DevOps

    DevOps(Development 和 Operations 的组合词)是一组过程、方法与系统的统称,用于促进开发(应用程序/软件工程)、技术运营和质量保障(QA)部门之间的沟通、协作与整合。

    59 引用 • 25 回帖 • 4 关注
  • 微软

    微软是一家美国跨国科技公司,也是世界 PC 软件开发的先导,由比尔·盖茨与保罗·艾伦创办于 1975 年,公司总部设立在华盛顿州的雷德蒙德(Redmond,邻近西雅图)。以研发、制造、授权和提供广泛的电脑软件服务业务为主。

    8 引用 • 44 回帖
  • V2EX

    V2EX 是创意工作者们的社区。这里目前汇聚了超过 400,000 名主要来自互联网行业、游戏行业和媒体行业的创意工作者。V2EX 希望能够成为创意工作者们的生活和事业的一部分。

    16 引用 • 236 回帖 • 254 关注
  • golang

    Go 语言是 Google 推出的一种全新的编程语言,可以在不损失应用程序性能的情况下降低代码的复杂性。谷歌首席软件工程师罗布派克(Rob Pike)说:我们之所以开发 Go,是因为过去 10 多年间软件开发的难度令人沮丧。Go 是谷歌 2009 发布的第二款编程语言。

    499 引用 • 1395 回帖 • 245 关注
  • Follow
    4 引用 • 12 回帖 • 3 关注