數倉實時場景下表行數估算不准確引起的的性能瓶頸問題案例

来源:https://www.cnblogs.com/huaweiyun/archive/2023/10/24/17784708.html
-Advertisement-
Play Games

本文分享自華為雲社區《GaussDB(DWS)性能調優:實時場景下表行數估算不准確引起的的性能瓶頸問題案例》,作者: O泡果奶~。 本文針對實時場景下SQL語句因表行數估算不准確而導致語句執行超時報錯的案例進行分析。 1、【問題描述】 實時場景下,select查詢語句執行時間過長,該語句verbos ...


本文分享自華為雲社區《GaussDB(DWS)性能調優:實時場景下表行數估算不准確引起的的性能瓶頸問題案例》,作者: O泡果奶~。

本文針對實時場景下SQL語句因表行數估算不准確而導致語句執行超時報錯的案例進行分析。

1、【問題描述】

實時場景下,select查詢語句執行時間過長,該語句verbose執行計劃中存在nestloop,且使用hint(set (enable_index_nestloop off)) 無法生效。

2、【原始語句】

select * from ( select
        wo.work_order_id /*工單id*/,
        wo.work_order_code /*工單編碼*/,
        wo.work_order_name /*工單名稱*/,
        wo.work_order_level /*工單層級(第一層級(未拆分工單/父工單):1,第二層級(子工單):10)*/,
        decode(wo.work_order_level,1, '第一層級(未拆分工單/父工單)', 10,'第二層級(子工單)') as work_order_level_desc /*工單層級描述*/,
        substrb(wo.wo_description, 1, 1000) as wo_description /*工單描述*/,
        wo.wo_version /*工單版本號*/,
        wo.wo_lifecycle_status /*生命周期標識:0:正常工單,-1: 已刪除*/,
        wo.business_id /*工單來源業務id*/,
        wo.business_type /*工單來源業務類型(10:活動流工單 20:手工派單 30:拆單工單 40:臨時mos工單 50:ihub工單 60:ipmo工單 70:wbs工單 80:ncs工單 90:hr工單 100:ls工單 預設10)*/,
        decode( wo.business_type, '10', '活動流工單', '20', '手工派單', '30', '拆單工單', '40', '臨時MOS工單', '50', 'ihub工單', '60',  'ipmo工單',
                                          '70', 'WBS工單', '80', 'NCS工單', '90', 'HR工單', '100', 'LS工單' ) as business_type_desc /*工單來源業務類型描述*/,
        wo.parent_activity_id /*父節點活動id*/,
        wo.activity_lib_id /*活動庫活動id*/,
        wo.activity_type /*作業類型,1wbs,2活動,3里程碑*/,
        ac.activity_name  /*活動名稱*/,
        ac.std_ms_code as standard_ms_code  /*標準里程碑編碼*/,
        wo.plan_id /*計劃id*/,
        wo.project_number as proj_num  /*項目編碼*/,
        wo.du_id  /*交付單元id*/,
        wo.duration  /*工期*/,
        wo.billing_flag /*開票標識:y-開票*/,
        wo.na_flag  /*na標識*/,
        wo.inv_flag   /*inv標識*/,
        wo.master_flag   /*拆分標示,n:未拆分 ; y:已拆分*/,
        wo.created_by as created_by_id  /*創建人user id*/,
        u1.lname as created_by  /*創建人*/,
        wo.creation_date   /*創建時間*/,
        wo.last_updated_by as last_updated_by_id   /*最後更新人user id*/,
        u2.lname as last_updated_by  /*最後更新人*/,
        wo.last_update_date   /*最後更新時間*/,
        wp.wo_progress_id  /*活動進度id*/,
        wp.expect_start_date  /*預期開始日期*/,
        wp.expect_end_date  /*預期結束日期*/,
        wp.plan_start_time  /*計劃開始時間*/,
        wp.plan_end_time /*計劃完成時間*/,
        wp.actual_start_time  /*實際開始時間*/,
        wp.actual_end_time  /*實際完成時間*/,
        wp.close_time  /*活動關閉時間*/,
        wp.completion_rate   /*完工比率(數值如 0.8666)*/,
        to_char(substr(wp.remark, 1, 333)) as progress_description   /*進度備註信息*/,
        wp.total_value  /*總值*/,
        wp.accumulate_value  /*累計值*/,
        wp.report_time  /*值反饋時間*/,
        wp.total_plan_value  /*總計劃值*/,
        wp.ehs_risk  /*高危活動類型*/,
        wp.delay_reason_id   /*延遲原因id*/,
        substrb(ag.description, 1, 1000) as delay_reason_description  /*延遲原因描述*/,
        wp.wo_status  /*活動狀態  psc_lookup_item_t_3220 classify_code = 'WO_STATUS_CODE'*/,
        l2.item_name as wo_status_desc /*活動狀態描述*/,(
          case
            when lengthb(wp.approve_status) = 0 then null
            else wp.approve_status
          end
        ) :: number as approve_status   /*審批狀態  psc_lookup_item_t_3220 classify_code = 'WORK_ORDER_APPROVE_STATUS'*/,
        l3.item_name as approve_status_desc   /*審批狀態描述*/,
        wp.par_workorder_doc_flag  /*父工單是否有交付件(y/n)*/,
        wp.deliverables_complete   /*交付件上傳狀態 0:不涉及交付件 1:待上傳交付件 2:交付件上傳中,未上傳完9:交付件已上傳完*/,
        wp.revenue_trigger_status   /*觸髮狀態(0:未觸發過  1:已觸發   2:已觸發,pc校驗觸發失敗  3:pc觸發成功)*/,
        wp.billing_status   /*開票狀態(空值:未觸發過  1:已開票)*/,
        wp.frozen_flag  /*凍結標識(y/n)*/,
        wp.mr_frozen_flag   /*mr是否凍結站點要貨通過更新實施計劃刷新欄位*/,
        wp.mr_status  /*站點簽狀態 1未簽收,2部分簽收,3全部簽收,10未簽收,20部分簽收,30全部簽收,40部分超配置簽收,50全部超配置簽收  完工驗狀態 p:部分完成,f:全部完成*/,
        wp.tool_flag  /*是否掛工具工單回寫(y/n)*/,
        wp.split_cp_flag   /*拆分施工計劃標識 y已拆分 n未拆分*/,
        wp.mos_data_source  /*站點簽完工驗狀數據來源*/,
        wo.template_id  /*模板id,例如活動流節點id*/,
        tfn.task_flow_id  /*任務流id*/,
        tfn.task_flow_node_id /*活動流節點id*/,
        tfn.revenue_flag /*收入里程碑標識(y/n)*/,
        tfn.on_site  /*是否現場*/,
        nvl(l1.item_name, tfn.owner_type) as owner_type  /*責任方類型 客戶/華為/分包商*/,
        tfn.subcon
        /*是否分包*/
        /*產品域*/,case
          when wo.enable_flag = 'Y'
          and wp.enable_flag = 'Y'
          and wo.wo_lifecycle_status = 0
          and nvl(du.enable_flag, 'Y') = 'Y' then 'Y'
          else 'N'
        end as enable_flag   /*有效標識,y為有效n為失效*/,
        'N' as del_flag  /*刪除標識 y為已刪除*/,
        3 as data_center_id  /*數據中心id*/,
        tf.task_flow_code   /*活動流編碼 add by jwx528041 20200408*/,
        tfn.task_flow_node_code  /*任務流節點編碼 add by jwx528041 20200408*/,
        tfn.task_flow_node_name  /*任務流節點名稱 add by jwx528041 20200408*/,
        tfn.task_flow_node_type  /*任務流節點類型 add by jwx528041 20200408*/,
        tfn.enable_flag as flow_enable_flag  /*活動流有效標識 add by jwx528041 20200408*/,
        wo.tenant_code   /*租戶編碼 add by jwx528041 20200408*/,
        tfn.activity_id  /*活動流水號 add by jwx528041 20200408*/,
        tfn.lead_time  /*持續時間  add by jwx528041 20200408*/,
        wo.resource_id as wo_actual_owner_id   /*工單實際責任人id update by swx949890 202207*/,
        wo.resource_name as wo_actual_owner  /*工單實際責任人 update by swx949890 202207*/,
        wo.contractor_id as wo_actual_owner_contr_id  /*工單實際責任人分包商id update by swx949890 202207*/,
        wo.contractor_name as wo_actual_owner_contr_name  /*工單實際責任人分包商名稱 update by swx949890 202207*/,
        nvl(l4.item_name, tfn.delivery_model) as delivery_model  /*工單交付模式 add by cwx613468 20200711*/,
        tfn.on_line_site  /*是否上站 add by cwx613468 20200711*/,
        u3.lname as dispatcher_user_name   /*調度人 add by cwx613468 20200711*/,
        tfn.approve_level_qty  /*審批總層級 add by jwx528041 20200819*/,
        tf.task_flow_name   /*活動流名稱 add by jwx528041 20200819*/,
        tf.task_flow_type   /*活動流類型 add by jwx528041 20200819*/,
        wp.source_code   /*標識actual時間的修改來源,值為mobile標識從手機端回寫 add by jwx528041 20200819*/,
        wp.plan_updated_by   /*實際開始時間更新人user id add by jwx528041 20200819*/,
        wp.plan_update_time  /*計劃時間更新時間  add by jwx528041 20200819*/,
        wp.dispatch_time  /*調度時間  add by jwx528041 20200819*/,
        wp.first_actual_update_time   /*第一次實際開始時間填入時間  add by jwx528041 20200819*/,
        wp.first_actual_end_time   /*第一次實際結束時間填入時間  add by jwx528041 20200819*/,
        wp.first_actual_updated_by    /*第一次實際時間填入人user id add by jwx528041 20200819*/,
        wp.actual_start_update_time   /*實際開始時間更新日期 add by jwx528041 20200819*/,
        wp.actual_start_updated_by   /*實際開始時間更新人user id add by jwx528041 20200819*/,
        wp.actual_time_source  /*實際完成時間更新來源 add by jwx528041 20200819*/,
        wp.actual_end_update_time /*實際完成時間更新日期 add by jwx528041 20200819*/,
        wp.actual_end_updated_by /*實際完成時間更新人user id add by jwx528041 20200819*/,
        wp.revenue_trigger_failed_msg
        /*收入觸發失敗原因 add by jwx528041 20200819*/,
        ag.souce_type as delay_reason_souce_type  /*延遲原因數據來源:1、自定義 2、 add by jwx528041 20200819*/
                 --,ras.tree_type    as wo_owner_tree_type    /*工單責任人項目樹節點類型tree_type add by jwx528041 20200819*/ 
                 ,
        wo.tree_type as wo_owner_tree_type /*工單責任人項目樹節點類型tree_type update by swx949890 202207*/,
        dr.resouce_type as wo_owner_resouce_type /*工單責任人資源類型 add by jwx528041 20200819*/,
        l5.item_name as wo_owner_resouce_type_desc /*工單責任人資源類型 add by jwx528041 20200819*/,
        u4.w3_account as wo_owner_w3_account /*工單責任人w3賬號  add by jwx528041 20200819*/,
        rel.du_tf_rel_enable /*du與活動流關係有效性標識 y:有效 n:失效  add by lwx617215 20210116*/,
        t.billing_sla /*sla*/,
        t.billing_milestone /*開票里程碑*/,
        tf.required_tools,
        wp.active,
        gp.plan_code,
        gp.plan_name,
        gp.template_plan_id
      from
        sdisd.ogg_wo_work_order_2_3220 wo
        inner join sdisd.ogg_wo_progress_2_3220 wp on wo.work_order_id = wp.work_order_id
        left join sdisd.ogg_wo_task_flow_node_br_3220 tfn on wo.template_id = tfn.task_flow_node_id
        and nvl(wo.wo_version, 0) = case
          when nvl(wo.wo_version, 0) > 0 then tfn.version
          else tfn.wo_version
        end
        and wo.project_number = tfn.project_number
        left join sdisd.ogg_sds_activity_t_br_3220 ac on wo.activity_lib_id = ac.activity_id
        left join sdisd.ogg_sds_task_flow_t_br_3220 tf on tfn.task_flow_id = tf.task_flow_id
        left join sdisd.ogg_du_release_t_br_3220 du
        /*enable_flag新增有效du的判斷 lwx617215 20210116*/
        on wo.du_id = du.du_id
        left join sdisd.ogg_gcc_plan_2_3220 gp --dwx1189869
        on wo.plan_id = gp.plan_id
        and gp.tenant_code = 'RolloutPlan'
        and gp.parent_plan_id = -1
        and gp.enable_flag = 'Y'
        left join (
          select
            r.du_id,
            r.task_flow_id,
            /*du與活動流有效標識*/
            case
              when r.enable_flag = 'Y'
              and publish_flag = 'P' then 'Y'
              else 'N'
            end as du_tf_rel_enable,
            row_number() over(
              partition by r.du_id,
              r.task_flow_id
              order by
                r.last_update_date desc
            ) as rn
          from
            sdisd.ogg_rp_du_tf_release_3_3220 r
        ) rel on wo.du_id = rel.du_id
        and tfn.task_flow_id = rel.task_flow_id
        and rel.rn = 1
        left join sdisd.ogg_tpl_user_t_3220 u1 on wo.created_by = u1.user_id
        left join sdisd.ogg_tpl_user_t_3220 u2 on wo.last_updated_by = u2.user_id
        left join sdisd.ogg_tpl_user_t_3220 u3 on wp.dispatcher_user_id = u3.user_id
        left join sdisd.ogg_sds_activity_gap_t_br_3220 ag on wp.delay_reason_id = ag.activity_gap_id
        left join sdisd.ogg_tpl_lookup_item_t_3220 l1 on tfn.owner_type = l1.item_code
        and l1.classify_code = 'SDS_TASK_OWNER_TYPE'
        and l1.language = 'en_US'
        left join sdisd.ogg_psc_lookup_item_t_3220 l2 on wp.wo_status = l2.item_code
        and l2.classify_code = 'WO_STATUS_CODE'
        and l2.language = 'en_US'
        left join sdisd.ogg_psc_lookup_item_t_3220 l3 on wp.approve_status = l3.item_code
        and l3.classify_code = 'WORK_ORDER_APPROVE_STATUS'
        and l3.language = 'en_US'
        left join sdisd.ogg_tpl_lookup_item_t_3220 l4 on tfn.delivery_model = l4.item_code
        and l4.classify_code = 'SDS_TASK_ON_SITE'
        and l4.language = 'en_US'
        left join sdisd.ogg_pm_project_tree_node_3220 tn on wo.resource_id = tn.tree_id
        left join sdisd.ogg_pm_delivery_resource_3220 dr on tn.resource_id = dr.resource_id
        left join sdisd.ogg_tpl_user_t_3220 u4 on dr.user_id = u4.user_id
        left join sdisd.ogg_tpl_lookup_item_t_3220 l5 on dr.resouce_type = l5.item_code
        and l5.classify_code = 'PM_RESOURCE_TYPE'
        and l5.language = 'zh_CN'
        left join sdisd.ogg_sds_task_flow_node_br_3220 t on tfn.task_flow_node_id = t.task_flow_node_id
      where
        (
          wo.cdc_create_date >= to_timestamp('20231021', 'yyyy-mm-dd hh24:mi:ss.ff') -1 / 24 / 60
          or wp.cdc_create_date >= to_timestamp('20231021', 'yyyy-mm-dd hh24:mi:ss.ff') -1 / 24 / 60
          or tfn.cdc_create_date >= to_timestamp('20231021', 'yyyy-mm-dd hh24:mi:ss.ff') -1 / 24 / 60
          or ag.cdc_create_date >= to_timestamp('20231021', 'yyyy-mm-dd hh24:mi:ss.ff') -1 / 24 / 60
        )
  union all
      select
        wo.work_order_id
        /*工單id*/,
        wo.work_order_code
        /*工單編碼*/,
        wo.work_order_name
        /*工單名稱*/,
        wo.work_order_level
        /*工單層級(第一層級(未拆分工單/父工單):1,第二層級(子工單):10)*/,
        decode(
          wo.work_order_level,
          1,
          '第一層級(未拆分工單/父工單)',
          10,
          '第二層級(子工單)'
        ) as work_order_level_desc
        /*工單層級描述*/,
        substrb(wo.wo_description, 1, 1000) as wo_description
        /*工單描述*/,
        wo.wo_version
        /*工單版本號*/,
        wo.wo_lifecycle_status
        /*生命周期標識:0:正常工單,-1: 已刪除*/,
        wo.business_id
        /*工單來源業務id*/,
        wo.business_type
        /*工單來源業務類型(10:活動流工單 20:手工派單 30:拆單工單 40:臨時mos工單 50:ihub工單 60:ipmo工單 70:wbs工單 80:ncs工單 90:hr工單 100:ls工單 預設10)*/,
        decode(
          wo.business_type,
          '10',
          '活動流工單',
          '20',
          '手工派單',
          '30',
          '拆單工單',
          '40',
          '臨時MOS工單',
          '50',
          'ihub工單',
          '60',
          'ipmo工單',
          '70',
          'WBS工單',
          '80',
          'NCS工單',
          '90',
          'HR工單',
          '100',
          'LS工單'
        ) as business_type_desc
        /*工單來源業務類型描述*/,
        wo.parent_activity_id
        /*父節點活動id*/,
        wo.activity_lib_id
        /*活動庫活動id*/,
        wo.activity_type
        /*作業類型,1wbs,2活動,3里程碑*/,
        ac.activity_name
        /*活動名稱*/,
        ac.std_ms_code as standard_ms_code
        /*標準里程碑編碼*/,
        wo.plan_id
        /*計劃id*/,
        wo.project_number as proj_num
        /*項目編碼*/,
        wo.du_id
        /*交付單元id*/,
        wo.duration
        /*工期*/,
        wo.billing_flag
        /*開票標識:y-開票*/,
        wo.na_flag
        /*na標識*/,
        wo.inv_flag
        /*inv標識*/,
        wo.master_flag
        /*拆分標示,n:未拆分 ; y:已拆分*/,
        wo.created_by as created_by_id
        /*創建人user id*/,
        u1.lname as created_by
        /*創建人*/,
        wo.creation_date
        /*創建時間*/,
        wo.last_updated_by as last_updated_by_id
        /*最後更新人user id*/,
        u2.lname as last_updated_by
        /*最後更新人*/,
        wo.last_update_date
        /*最後更新時間*/,
        wp.wo_progress_id
        /*活動進度id*/,
        wp.expect_start_date
        /*預期開始日期*/,
        wp.expect_end_date
        /*預期結束日期*/,
        wp.plan_start_time
        /*計劃開始時間*/,
        wp.plan_end_time
        /*計劃完成時間*/,
        wp.actual_start_time
        /*實際開始時間*/,
        wp.actual_end_time
        /*實際完成時間*/,
        wp.close_time
        /*活動關閉時間*/,
        wp.completion_rate
        /*完工比率(數值如 0.8666)*/,
        to_char(substr(wp.remark, 1, 333)) as progress_description
        /*進度備註信息*/,
        wp.total_value
        /*總值*/,
        wp.accumulate_value
        /*累計值*/,
        wp.report_time
        <

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 開發板:STM32F407ZGT6; 目標:想使用軟體“串口調試助手” 情況:開發板上的USB_UART口所在器件損壞或者直接沒有; 解決辦法:查看該開發板的原理圖,可得:串口1的RX接TXD,串口1的TX接RXD,那麼按如下步驟操作:1、現在使用USB轉TTL模塊,將串口1的RX接USB轉TTL模 ...
  • @目錄1. 安裝 ocserv (OpenConnect server)2.生成證書1) 創建工作文件夾2) 生成 CA 證書3) 生成本地伺服器證書4) 生成客戶端證書(不生成)3. 配置 ocserv4.創建用戶5.配置系統設置1) 開啟內核轉發2) 配置iptables規則(不需要配置)3) ...
  • 前言 為了出門方便,我萌生出將Ubuntu放在U盤中的想法。我們都在硬碟上安裝Linux,我個人覺得在U盤上安裝和在硬碟上安裝步驟一致,因為U盤也可以分區使用。我的安裝方法為使用Ubuntu官方鏡像中的grub.efi作為引導,然後正常安裝,只是在安裝過程中的硬碟分區選擇U盤即可。 準備工作 安裝引 ...
  • atexit 處理器中再次調用 exit 為什麼能正常運行?atexit 處理器中再次調用 atexit 註冊的函數為什麼能正常被調用?帶著這些疑問來看看 glibc 是用什麼數據結構存儲終止處理器的,另外看看列印這些結構時遇到了哪些問題 ...
  • 1. 如何構建資料庫環境 1.1. 托管MySQL 1.2. VM上構建 1.3. 天下沒有免費的午餐,每一個選擇都伴隨著一系列的權衡 2. 托管MySQL 2.1. 服務商提供了一個可訪問的資料庫設置程式,而不需要用戶深入瞭解MySQL的具體細節 2.2. 使用托管MySQL將缺乏很多的可見性和控 ...
  • 緩存驅逐是指從緩存中刪除特定數據的過程。當緩存達到最大存儲容量時,必須刪除一些數據,為新數據騰出空間。本文將深入探討與緩存驅逐有關的細節,並就如何選擇合適的緩存驅逐策略給出建議。 ...
  • 如今,大規模、高時效、智能化數據處理已是“剛需”,企業需要更強大的數據平臺,來應對數據查詢、數據處理、數據挖掘、數據展示以及多種計算模型並行的挑戰,湖倉一體方案應運而生。 《實時湖倉實踐五講》是袋鼠雲打造的系列直播活動,將圍繞實時湖倉的建設趨勢和通用問題,邀請奮戰於企業數字化一線的核心產品&技術專家 ...
  • 通過實時索引、查詢和全文搜索引擎,Redis Enterprise提供了更好的數據檢索解決方案。通過強大的搜索引擎助力,Redis Enterprise能在亞毫秒級的時間內提供結果,以增強客戶體驗並助力商業智能。 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...