繁体   English   中英

花很多时间从 oracle 获取数据并显示在 php 中

[英]taking much time to fetch data from oracle and show up at php

我正在使用 php 和 oracle 从 oracle 数据库中获取数据,并通过与 oracle 数据库连接,使用 php 代码显示在 php 表中。 问题是,在我有一些 for 循环来运行其他查询的过程中很长时间后我正在获取数据首先我运行了一个查询,该查询给出了截至 2019 年 11 月 23 日(我在查询中分配的日期)的总卡,并且此查询还给出了在 2019 年 11 月 11 日至 2019 年 11 月 25 日之间取消的所有卡,此处位于带有 oci_excecute() 的 php 中的查询下方

现在我想写另一个查询,它可以提供总的重新发行卡,但条件是员工之前取消了一张卡,并在 2019 年 11 月 11 日 23 日至 2019 年 11 月 25 日之间重新发行。 为此我做了以下代码

现在的问题是有一个 for 循环执行查询直到数组大小花费很多时间并且我在很长时间后得到结果。 你能告诉我如何快速获得结果吗? 谢谢

查询性能不佳的原因可能有很多。 我们不能只是看着一个问题,抚摸我们的下巴,然后说“啊哈!就是这条线”。 请阅读这篇关于询问 Oracle 调优问题的优秀文章

话虽如此,在这种情况下,您应该重新考虑应用程序设计。 查询循环中的查询循环始终是一个危险信号。 将所有必需的表连接起来以在客户端呈现的单个查询可能会更有效:

select eofficeuat.cardprintlog_cpa.empid
from   eofficeuat.cardprintlog_cpa
where  eofficeuat.cardprintlog_cpa.cardstatus='READY'
and    eofficeuat.cardprintlog_cpa.dateofissue BETWEEN TO_DATE('23/11/2019', 'dd/mm/yyyy') AND TO_DATE('25/11/2019', 'dd/mm/yyyy')
and    eofficeuat.cardprintlog_cpa.empid in (
                   select eofficeuat.cardprintlog_cpa.empid
                   from   eofficeuat.cardprintlog_cpa
                   where  eofficeuat.cardprintlog_cpa.cardstatus='DISCARDED'
                   )

如果不首先了解代码的性能配置文件,就没有单一的“让它变得更快”的解决方案。 我强烈建议对您的代码使用某种类型的应用程序性能监控。 这将让您测量脚本运行所需的时间、等待 SQL 查询所需的时间等。

有一些事情会作为潜在的性能问题出现(来自您的 APM 解决方案的数据将证实这一点):

  • 在 FROM 子句中有子查询的 SQL 查询可能会导致一些性能问题,具体取决于查询和数据。
  • 如果您正在检索您只想要聚合的数据列表,请尝试使用COUNT()其他函数。 例如SELECT COUNT(empid) as empid_count 这样你就不会处理数据两次(一次在查询中,第二次在你的代码中)。

在按照其他答案的建议整理出 SQL 之后,请考虑以下其他性能提示:

  • 使用绑定变量代替字符串连接语法,如:

    and eofficeuat.cardprintlog_cpa.empid='". $emp[$i] ."'

    字符串连接是一种 SQL 注入安全风险,

  • 在获取查询结果时,调整oci8.default_prefetchoci_set_prefetch()以减少 PHP 和数据库之间的“往返”。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM