使用 SQL 搜索 DB2 进行分页的最快/最有效的方法

2023-12-10

现在我执行两个单独的 SQL 语句,其中一个执行SELECT COUNT(*)与搜索语句的标准基本相同。我不是最擅长做出这些陈述,有时有点慢,我想知道是否有更好的方法来做我所做的事情。可能只执行一条 SQL 语句并在 PHP 中执行更多工作?这是我有语句的“搜索包含”示例。

在第二个语句中,您将看到 Y 之间的 X,它部分是由第一个行计数语句的结果计算得出的。

SQL 行数:

SELECT COUNT(*) 
FROM itemmast 
LEFT OUTER JOIN itemweb 
ON iline = line 
AND iitem = item 
JOIN linemst 
ON iline = lline 
LEFT OUTER JOIN custord 
ON opline = iline 
AND opitem = iitem 
AND opcust = '12345' 
LEFT OUTER JOIN ordwdtl 
ON owline = iline 
AND owitem = iitem 
AND owusr ='user' 
AND owcust ='12345' 
WHERE ico = 01 
AND iecomm = 'Y'  
AND (UPPER(ITEMDESC) || UPPER(PRODDESC)) LIKE '%FOO%' 
     OR LINE LIKE '%FOO%' 
     OR UPPER(MFGNAME) LIKE '%FOO%' 
     OR UPPER(ITEM) LIKE '%FOO%' 
     OR UPPER(PRODNAME) LIKE '%FOO%' 
     OR UPPER(IDESC1 || IDESC2) LIKE '%FOO%' 
     OR UPPER(IMFGNO) LIKE '%FOO%' 
     OR UPPER(IITEM) LIKE '%FOO%') 

SQL 搜索:

SELECT * 
FROM (SELECT iline AS line, iitem AS item, rownumber() OVER (ORDER BY item) AS ROW_NUM 
      FROM itemmast 
      LEFT OUTER JOIN itemweb 
      ON iline = line 
      AND iitem = item 
      JOIN linemst 
      ON iline = lline 
      LEFT OUTER JOIN custord 
      ON opline = iline 
      AND opitem = iitem 
      AND opcust = '12345' 
      LEFT OUTER JOIN ordwdtl 
      ON owline = iline 
      AND owitem = iitem 
      AND owusr = 'user' 
      AND owcust = '12345' 
      WHERE ico = 01 
      AND iecomm = 'Y' 
      AND (UPPER(ITEMDESC) || UPPER(PRODDESC)) LIKE '%FOO%' 
           OR LINE LIKE '%FOO%' 
           OR UPPER(MFGNAME) LIKE '%FOO%' 
           OR UPPER(ITEM) LIKE '%FOO%' 
           OR UPPER(PRODNAME) LIKE '%FOO%' 
           OR UPPER(IDESC1 || IDESC2) LIKE '%FOO%' 
           OR UPPER(IMFGNO) LIKE '%FOO%' 
           OR UPPER(IITEM) LIKE '%FOO%')) 
      AS TEMP 
WHERE ROW_NUM BETWEEN 0 AND 25

如果您尝试在分页计数旁边显示结果总数(即 38 中的 0 到 25),那么单独的语句可能是您的最佳选择。我已经尝试了很多方法来获取各个行的计数,但性能(即使在中等测试数据库上)很糟糕。

您可能应该做的是创建一个可以查询的视图,其中包含所有选择标准,然后用必要的行为包装它:
Count:

SELECT COUNT(*)
FROM view

排名行:

SELECT *
FROM (SELECT *, ROW_NUMBER() OVER(ORDER BY item) as RANK
      FROM view) as TEMP
WHERE RANK BETWEEN 0 AND 25

您当然需要添加相对 where 条件,但这是视图要处理的事情类型。

如果您实际上不需要提前知道总行数,则可以简单地将最终排名设置为起始排名加上一些偏移量。然后,当您使用 PHP 显示结果时,只需编辑结束显示值即可。

一些随机笔记: 1) 是否有理由认为line isn't upper()d?
2)无论你做什么,这个查询的性能几乎都会受到影响,仅仅是因为所有的字符串操作/比较。是否可以消除或忽略某些条件?除非在各个字符串列上使用的索引已经有upper应用于它们(某些更高版本的 DB2 允许将某些标量函数应用于索引键),大多数索引将完全无用(这对您正在寻找的索引没有帮助)%ANYTHING%毕竟)。


好吧,有一种“棘手”的方法可以做这样的事情,并且似乎获得了不错的性能...... 尝试这样的事情(首先定义的视图确实会有帮助):

SELECT TEMP.*, CASE WHEN RANK = 0 THEN (SELECT COUNT(*)
                                        FROM view)
                    ELSE 0 END
FROM (SELECT *, ROW_NUMBER() OVER(ORDER BY item) as RANK
      FROM view) as TEMP
WHERE RANK BETWEEN 0 AND 25

当然,你仍然需要拥有你的where子选择中也定义了子句...

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 SQL 搜索 DB2 进行分页的最快/最有效的方法 的相关文章

  • 使用存储过程访问数据可以提供哪些安全优势?

    我看到一些指南建议您通过存储过程对所有数据访问进行分层来保护数据库 我知道对于 SQL Server 您可以保护表甚至列免受 CRUD 操作的影响 例如 Logged in as sa USE AdventureWorks GRANT SE
  • PHP 警告 ZipArchive::extractTo():权限被拒绝

    我创建了一个应用程序 它使用 ZipArchive 类 php 中的标准 中的方法 extractTo 并在 Windows 7 上的本地主机 apache 服务器上对其进行了测试 没有任何问题 但是当我在一些unix生产服务器上尝试过它之
  • PSR-4 代码库中条令生成器的解决方法

    在 Windows 机器上使用 Symfony 2 和 Doctrine 我正在尝试 从现有模式生成实体 php app console doctrine mapping import force CoreBundle annotation
  • 如何从字符串中只获取数字? [复制]

    这个问题在这里已经有答案了 我有这样的字符串 第 001 课 完成 在这种情况下 我只想获取数字部分001 我试过这个 str the title preg match all d str matches number implode ma
  • PHP 中的正则表达式:找到第一个匹配的字符串

    我想在非常长的文本中找到第一个匹配的字符串 我知道我可以使用 preg grep 并获取返回数组的第一个元素 但是 如果我只需要第一场比赛 或者我知道提前只有一场比赛 那么这样做效率不高 有什么建议吗 预匹配 http www php ne
  • SQL COUNT(*) 返回错误答案

    以下脚本应返回部门名称以及这些部门中的员工人数 营销 行政和销售部门有 0 名员工 但返回值不是 0 而是 1 我怎样才能纠正它 select Department Departments DepartmentID count as Num
  • 使用 php 将 HLS Segment (ts) 视频转换并加入到 mp4

    你好我正在使用这个工具 https github com Ejz HLSDownloader https github com Ejz HLSDownloader将 HLS 视频片段从 m3u8 播放列表下载到 ts 文件中 不 我不知道如
  • SimpleSAMLPHP 重定向循环

    我们正在尝试使用自定义 mysql 数据库设置 sso 但它在以下两个请求之间进入无限循环 POST http 192 168 0 15 simplesaml module php core loginuserpass php 设置Cook
  • 如何在 SQL 中编写 where 子句来按一天中的时间过滤 DATETIME 列?

    我有带有 DATETIME 列时间戳的数据 我想将其过滤到 DATETIME 介于上午 9 30 到下午 5 30 之间的任意一天的记录集 最好的方法是什么 更新 更改是因为我需要精确到分钟 而不仅仅是小时 对于那个很抱歉 您始终可以将其编
  • WAMP 不显示目录列表中的图标

    过去 我通过 vmware 处理 PHP 代码 但最近我决定转而通过 WAMP 在 Windows 8 1 上 在本地进行处理 我创建了一个空文件夹tests in the www folder 然后在我的浏览器上输入http localh
  • 我可以显示我在 PHP 中设置的所有 cookie 吗?

    我正在尝试诊断 cookie 中的错误 但 cookie 的名称不是应有的名称 PHP 有没有办法打印我的域设置的所有 cookie 你有没有尝试过 print r COOKIE
  • 使用 DOM 获取 div 的内容(包括子标签)

    我正在使用 DOM 来获取 div 标签的内容 但内部 html 部分未显示 功能是 dom new DOMDocument libxml use internal errors true dom gt loadHTMLFile url l
  • 将秒转换为天、小时、分钟和秒

    我想转换一个变量 uptime这是秒 分为天 小时 分钟和秒 Example uptime 1640467 结果应该是 18 days 23 hours 41 minutes 这可以通过以下方式实现DateTime http php net
  • 避免 SQLite3 中的 SQL 注入

    我正在尝试找出一种避免 SQL 注入的好简单方法 到目前为止我只能提出两个想法 对用户输入进行 Base64 编码 其实不想这样做 使用正则表达式删除不需要的字符 目前正在使用这个 不确定是否100 安全 这是我当前的代码
  • 如何使用 PDO 动态构建查询

    我正在使用 PDO 并想做这样的事情 query dbh gt prepare SELECT FROM table WHERE column value query gt bindParam table tableName query gt
  • 从多个选择列表中插入数据到mysql数据库(html形式)

    我制作了一个表格 其中有商店的 ID
  • php向多个收件人发送邮件

    我可以通过在邮件程序中定义 id 来将电子邮件发送到一个电子邮件 id 但是当用户在表单中键入 消息和电子邮件 id 时 我无法理解如何发送到多个收件人 例如 我正在显示一个带有两个文本区域的表单 一个用于电子邮件 ID 一个用于自定义消息
  • 无法在 Centos 上安装 php-mysqli 扩展

    我正在尝试将 mysqli 扩展安装到 php yum install php mysqli 我收到下一个错误 Transaction Check Error file usr share mysql charsets Index xml
  • sqlsrv_num_rows 不返回任何值

    我正在尝试获取查询中返回的行数 while 循环遍历结果有效 但由于某种原因 sqlsrv num rows 不返回任何值 result SELECT from dtable WHERE id2 apple query sqlsrv que
  • PHP 除法浮点值问题

    当我尝试获取余数时 它给出了无效值 我试图获得两位小数的余数 我得到 3 4694469519536E 18 我的价值观是 x 0 1 y 0 005 我尝试了以下方法 echo ed fmod 0 1 0 005 OutPut 3 469

随机推荐

  • Python:Google API - 从消息中获取 mimeTypes

    我的目标是使用 Google API 从我指定的电子邮件中获取数据 目前我可以找到消息 获取消息数据并将消息数据解码为可读格式 之后我需要找到消息的正确部分 输入text html 然后使用扫描我的链接美丽的汤 不幸的是 我对电子邮件 Go
  • 为什么 apply() 返回错误的列类型?

    我最近开始使用 R 和apply 功能让我绊倒 我很感激这方面的帮助 is numeric iris Sepal Length returns TRUE is numeric iris Sepal Width returns TRUE is
  • 如何在 C# 中枚举网络共享和 Web 文件夹?

    Net为我们提供了一个FolderBrowserDialog控件来浏览文件夹 然而 这是一个模式对话框 我需要创建一个可以拖放到表单上的用户控件 因此 我一直在考虑创建自己的 我需要在其中获取所有本地驱动器 映射的网络驱动器 UNC 共享和
  • 使用 EaselJs 制作倒计时动画

    我正在尝试使用画架模拟倒计时动画 我有一个它应该是什么样子的例子 http jsfiddle net eguneys AeK28 但它看起来像一个黑客 有没有适当 更好 灵活的方法来做到这一点 换句话说 我如何定义一条路径 并用 easel
  • Pod 在 aws eks 中使用节点组角色而不是服务帐户

    我正在使用一个服务帐户 并通过 OIDC 为其分配了角色 我在 Pod 中打开 shell 并检查当前角色 但我的服务正在做同样的事情 但它使用节点角色 Java SDK 版本 aws java sdk core 1 11 505 Pod
  • 何时决定调用带括号和不带括号的 R 函数

    我正在学习R 为什么有时 R 中的函数会用括号调用 比如myfunction vs 有时它被称为没有myfunction 我如何知道何时使用括号跟注而不使用括号 我在 tidyverse 中看到很多没有括号的函数调用 Answer reco
  • PowerShell 窗口阻止关闭

    如果我显示 PowerShell 窗口 在 PowerShell 命令提示符处 它会阻止计算机关闭 IE 如果我打开 PowerShell 窗口 然后尝试关闭服务器 我会收到 结束程序 弹出窗口 提示 Windows 无法结束此程序 如果从
  • 如何连接到 Vault 服务器

    我想尝试一下vault 所以我配置了VAULT ADDR as echo VAULT ADDR http 127 0 0 1 8200 然后我在开发模式下启动了vault vault server dev 一切正常 我能够连接到服务器 然后
  • Pandas 的 read_excel 中逗号作为小数分隔符

    我有一个包含 119 个工作表的 Excel 文件 我想获取数据来绘制多个图表 问题在于数值以逗号作为小数点分隔符 我读到 与 read csv 不同 Pandas 中的 read excel 函数没有这个选项 我打算从某些选定的工作表中加
  • Django 1.8 和 Rest Framework 3.7 出现“导入错误:没有名为 urls 的模块”

    我正在使用 django 1 8 rest framework 3 7 7 python 2 7 12 urls py urlpatterns url r api core include core urls 核心 urls py urlp
  • 行号不显示?

    我发现我的程序存在一些问题 我使用 log4j 进行日志记录 但是 在日志文件中 所有行号都变成 对话模式如下 log4j appender file layout ConversionPattern d dd MM yyyy HH mm
  • Rcpp:将 C 数组作为 NumericMatrix 返回到 R

    include
  • IntelliJ IDEA 中创建了错误的 Manifest.mf .jar

    我正在尝试通过 IntelliJ IDEA 的 jar 工件将使用 OptaPlanner 6 0 1 库的项目打包到 jar 中 而不是包含标准的 manifest mf Manifest Version 1 0 Main Class a
  • CSS - 有两个切角的按钮[重复]

    这个问题在这里已经有答案了 大家好 我想创建一个
  • rgdal - 读取 ESRI 地理数据库 (gdb) 中的表

    我正在尝试使用 R 从 ESRI 地理数据库 gdb 读取没有几何图形的表 readOGR 抛出错误 因为没有定义几何图形 这是有意义的 library rgdal readOGR gSSURGO CO gdb mutext Error i
  • 如何创建 NSManagedObjectContext

    在 iPhone 的核心数据中 我在尝试将数据保存到NSManagedObjectContext 我相信我的问题都与我使用NSManagedObjectContext这是在多个线程中使用的 所以我想创建一个新的NSManagedObject
  • 我如何使用pyqt5中的QTextEdit显示html的所有样式(包括css的样式)

    Python 3 6 PYQT 5 12 1 我准备通过pyqt5来展示我需要的样式 并且我知道pyqt5中的QTextEdit可以很好地显示html代码 我有一些web开发经验 所以我决定使用html css来展示我的样式 但是 在 cs
  • 如何更改 TRichEdit 中某些字符的颜色? [关闭]

    很难说出这里问的是什么 这个问题模棱两可 含糊不清 不完整 过于宽泛或言辞激烈 无法以目前的形式合理回答 如需帮助澄清此问题以便重新打开 访问帮助中心 我正在做一个 Delphi 7 项目 我必须让用户输入一个数字 向下的层 来构建圣诞树
  • 返回十六进制 UUID 作为 Django 模型 charfield 的默认值

    我尝试创建一个具有从 uuid4 生成的标识符的模型 但我想要的不是常规的 uuid 而是标识符具有十六进制 uuid 格式 不带 这是我尝试过的 class Model models Model identifier models Cha
  • 使用 SQL 搜索 DB2 进行分页的最快/最有效的方法

    现在我执行两个单独的 SQL 语句 其中一个执行SELECT COUNT 与搜索语句的标准基本相同 我不是最擅长做出这些陈述 有时有点慢 我想知道是否有更好的方法来做我所做的事情 可能只执行一条 SQL 语句并在 PHP 中执行更多工作 这