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

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

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

    25818 引用 • 106883 回帖 • 1 关注
  • SQL
    129 引用 • 394 回帖 • 3 关注
  • Q&A

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

    9903 引用 • 45012 回帖 • 78 关注

相关帖子

欢迎来到这里!

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

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

    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 更新了该回帖

推荐标签 标签

  • 七牛云

    七牛云是国内领先的企业级公有云服务商,致力于打造以数据为核心的场景化 PaaS 服务。围绕富媒体场景,七牛先后推出了对象存储,融合 CDN 加速,数据通用处理,内容反垃圾服务,以及直播云服务等。

    29 引用 • 230 回帖 • 125 关注
  • 开源

    Open Source, Open Mind, Open Sight, Open Future!

    411 引用 • 3588 回帖 • 1 关注
  • 快应用

    快应用 是基于手机硬件平台的新型应用形态;标准是由主流手机厂商组成的快应用联盟联合制定;快应用标准的诞生将在研发接口、能力接入、开发者服务等层面建设标准平台;以平台化的生态模式对个人开发者和企业开发者全品类开放。

    15 引用 • 127 回帖
  • SQLite

    SQLite 是一个进程内的库,实现了自给自足的、无服务器的、零配置的、事务性的 SQL 数据库引擎。SQLite 是全世界使用最为广泛的数据库引擎。

    4 引用 • 7 回帖 • 7 关注
  • C++

    C++ 是在 C 语言的基础上开发的一种通用编程语言,应用广泛。C++ 支持多种编程范式,面向对象编程、泛型编程和过程化编程。

    108 引用 • 153 回帖
  • 钉钉

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

    15 引用 • 67 回帖 • 272 关注
  • 创业

    你比 99% 的人都优秀么?

    82 引用 • 1395 回帖 • 2 关注
  • Thymeleaf

    Thymeleaf 是一款用于渲染 XML/XHTML/HTML5 内容的模板引擎。类似 Velocity、 FreeMarker 等,它也可以轻易的与 Spring 等 Web 框架进行集成作为 Web 应用的模板引擎。与其它模板引擎相比,Thymeleaf 最大的特点是能够直接在浏览器中打开并正确显示模板页面,而不需要启动整个 Web 应用。

    11 引用 • 19 回帖 • 395 关注
  • Python

    Python 是一种面向对象、直译式电脑编程语言,具有近二十年的发展历史,成熟且稳定。它包含了一组完善而且容易理解的标准库,能够轻松完成很多常见的任务。它的语法简捷和清晰,尽量使用无异义的英语单词,与其它大多数程序设计语言使用大括号不一样,它使用缩进来定义语句块。

    554 引用 • 675 回帖
  • 宕机

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

    13 引用 • 82 回帖 • 76 关注
  • 互联网

    互联网(Internet),又称网际网络,或音译因特网、英特网。互联网始于 1969 年美国的阿帕网,是网络与网络之间所串连成的庞大网络,这些网络以一组通用的协议相连,形成逻辑上的单一巨大国际网络。

    98 引用 • 367 回帖
  • JetBrains

    JetBrains 是一家捷克的软件开发公司,该公司位于捷克的布拉格,并在俄国的圣彼得堡及美国麻州波士顿都设有办公室,该公司最为人所熟知的产品是 Java 编程语言开发撰写时所用的集成开发环境:IntelliJ IDEA

    18 引用 • 54 回帖
  • 架构

    我们平时所说的“架构”主要是指软件架构,这是有关软件整体结构与组件的抽象描述,用于指导软件系统各个方面的设计。另外还有“业务架构”、“网络架构”、“硬件架构”等细分领域。

    142 引用 • 442 回帖 • 2 关注
  • 星云链

    星云链是一个开源公链,业内简单的将其称为区块链上的谷歌。其实它不仅仅是区块链搜索引擎,一个公链的所有功能,它基本都有,比如你可以用它来开发部署你的去中心化的 APP,你可以在上面编写智能合约,发送交易等等。3 分钟快速接入星云链 (NAS) 测试网

    3 引用 • 16 回帖
  • OpenShift

    红帽提供的 PaaS 云,支持多种编程语言,为开发人员提供了更为灵活的框架、存储选择。

    14 引用 • 20 回帖 • 661 关注
  • 心情

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

    59 引用 • 369 回帖
  • 微软

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

    8 引用 • 44 回帖
  • CloudFoundry

    Cloud Foundry 是 VMware 推出的业界第一个开源 PaaS 云平台,它支持多种框架、语言、运行时环境、云平台及应用服务,使开发人员能够在几秒钟内进行应用程序的部署和扩展,无需担心任何基础架构的问题。

    5 引用 • 18 回帖 • 184 关注
  • 小说

    小说是以刻画人物形象为中心,通过完整的故事情节和环境描写来反映社会生活的文学体裁。

    32 引用 • 108 回帖
  • IPFS

    IPFS(InterPlanetary File System,星际文件系统)是永久的、去中心化保存和共享文件的方法,这是一种内容可寻址、版本化、点对点超媒体的分布式协议。请浏览 IPFS 入门笔记了解更多细节。

    20 引用 • 245 回帖 • 227 关注
  • WebClipper

    Web Clipper 是一款浏览器剪藏扩展,它可以帮助你把网页内容剪藏到本地。

    3 引用 • 9 回帖 • 1 关注
  • Chrome

    Chrome 又称 Google 浏览器,是一个由谷歌公司开发的网页浏览器。该浏览器是基于其他开源软件所编写,包括 WebKit,目标是提升稳定性、速度和安全性,并创造出简单且有效率的使用者界面。

    63 引用 • 289 回帖
  • Java

    Java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由 Sun Microsystems 公司于 1995 年 5 月推出的。Java 技术具有卓越的通用性、高效性、平台移植性和安全性。

    3201 引用 • 8216 回帖 • 6 关注
  • CentOS

    CentOS(Community Enterprise Operating System)是 Linux 发行版之一,它是来自于 Red Hat Enterprise Linux 依照开放源代码规定释出的源代码所编译而成。由于出自同样的源代码,因此有些要求高度稳定的服务器以 CentOS 替代商业版的 Red Hat Enterprise Linux 使用。两者的不同在于 CentOS 并不包含封闭源代码软件。

    240 引用 • 224 回帖 • 1 关注
  • Webswing

    Webswing 是一个能将任何 Swing 应用通过纯 HTML5 运行在浏览器中的 Web 服务器,详细介绍请看 将 Java Swing 应用变成 Web 应用

    1 引用 • 15 回帖 • 638 关注
  • Outlook
    1 引用 • 5 回帖 • 3 关注
  • Angular

    AngularAngularJS 的新版本。

    26 引用 • 66 回帖 • 558 关注