簡體   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