จัดการข้อมูลอย่างมีประสิทธิภาพ

ฟังก์ชันหลักของแอปพลิเคชัน Google Ads จำนวนมากคือการเรียกข้อมูลบัญชีสำหรับกรณีการใช้งาน เช่น การวิเคราะห์ข้อมูล การค้นหาของลูกค้า และการตรวจสอบการปฏิบัติตามนโยบาย ขณะดึงข้อมูล คุณควรเพิ่มประสิทธิภาพการใช้งานเพื่อไม่ให้เซิร์ฟเวอร์ Google ทำงานหนักเกินไป ดูรายละเอียดเพิ่มเติมได้ในคู่มือเกี่ยวกับการจำกัดอัตราราคาและการรักษาอีเมลสำหรับติดต่อให้เป็นปัจจุบัน

แคชข้อมูลของคุณ

คุณควรแคชรายละเอียดเอนทิตีที่ดึงจากเซิร์ฟเวอร์ API ในฐานข้อมูลในเครื่องแทนที่จะเรียกใช้เซิร์ฟเวอร์ทุกครั้งที่ต้องการข้อมูล โดยเฉพาะอย่างยิ่งสำหรับเอนทิตีที่มีการเข้าถึงบ่อยหรือซึ่งมีการเปลี่ยนแปลงไม่บ่อย ใช้ change-event และ change-status เมื่อเป็นไปได้เพื่อตรวจหาว่าออบเจ็กต์ใดมีการเปลี่ยนแปลงตั้งแต่ที่คุณซิงค์ผลลัพธ์ครั้งล่าสุด

เพิ่มประสิทธิภาพความถี่ในการเรียกใช้รายงาน

Google Ads มีหลักเกณฑ์ที่เผยแพร่เกี่ยวกับความใหม่ของข้อมูลและความถี่ในการอัปเดตข้อมูล คุณจึงควรใช้คำแนะนำนี้เพื่อดูว่า จะดึงข้อมูลรายงานบ่อยเพียงใด

หากคุณจำเป็นต้องอัปเดตบัญชีเป็นประจำ เราขอแนะนำให้จำกัดจำนวนบัญชีดังกล่าวให้เหลือเพียงบัญชีเดียว เช่น เฉพาะบัญชี Google Ads 20 อันดับแรก คุณสามารถอัปเดตแคมเปญที่เหลือด้วยความถี่ที่ต่ำลง เช่น 1 หรือ 2 ครั้งต่อวัน

เพิ่มประสิทธิภาพขนาดของรายงาน

แอปพลิเคชันของคุณควรดึงข้อมูลจำนวนมากแทนที่จะเรียกใช้รายงานขนาดเล็กจำนวนมาก ปัจจัยที่ส่งผลต่อตัวเลือกนี้คือขีดจำกัดของบัญชี

ตัวอย่างเช่น ลองพิจารณาโค้ดต่อไปนี้ซึ่งจะดึงสถิติสำหรับกลุ่มโฆษณาหนึ่งๆ และอัปเดตตารางฐานข้อมูลสถิติ

  List<long> adGroupIds = FetchAdGroupIdsFromLocalDatabase();

  foreach (long adGroupId in adGroupIds)
  {
    string query = "SELECT ad_group.id, ad_group.name, metrics.clicks, " +
        "metrics.cost_micros, metrics.impressions, segments.date FROM " +
        "ad_group WHERE segments.date DURING LAST_7_DAYS AND " +
        "ad_group.id = ${adGroupId}";
    List<GoogleAdsRow> rows = RunGoogleAdsReport(customerId, query);
    InsertRowsIntoStatsTable(adGroupId, rows);
  }

โค้ดนี้ทำงานได้ดีในบัญชีทดสอบขนาดเล็ก อย่างไรก็ตาม Google Ads รองรับกลุ่มโฆษณาได้สูงสุด 20,000 กลุ่มต่อแคมเปญ และ 10,000 แคมเปญต่อบัญชี ดังนั้นหากโค้ดนี้ทำงานกับบัญชี Google Ads ขนาดใหญ่ อาจทำให้เซิร์ฟเวอร์ Google Ads API ทำงานหนักเกินไป ซึ่งนำไปสู่การจำกัดอัตราและการควบคุม

วิธีที่ดีที่สุดคือการเรียกใช้รายงานฉบับเดียว แล้วประมวลผลในเครื่อง วิธีการหนึ่งที่ใช้แผนที่ในหน่วยความจำจะแสดงขึ้น

  Hashset<long> adGroupIds = FetchAdGroupIdsFromLocalDatabase();

  string query = "SELECT ad_group.id, ad_group.name, metrics.clicks, " +
      "metrics.cost_micros, metrics.impressions, segments.date FROM " +
      "ad_group WHERE segments.date DURING LAST_7_DAYS";
  List<GoogleAdsRow> rows = RunGoogleAdsReport(customer_id, query);

  var memoryMap = new Dictionary<long, List<GoogleAdsRow>>();
  for each (GoogleAdsRow row in rows)
  {
    var adGroupId = row.AdGroup.Id;

    if (adGroupIds.Contains(adGroupId))
    {
      CheckAndAddRowIntoMemoryMap(row, adGroupId, memoryMap);
    }
  }
  foreach (long adGroupId in memoryMap.Keys())
  {
    InsertRowsIntoStatsTable(adGroupId, rows);
  }

ซึ่งจะช่วยลดภาระงานของเซิร์ฟเวอร์ Google Ads API เนื่องจากมีการเรียกใช้รายงานน้อยลง

หากพบว่ารายงานมีขนาดใหญ่เกินกว่าที่จะเก็บไว้ในหน่วยความจำ คุณอาจแบ่งการค้นหาออกเป็นกลุ่มเล็กๆ ได้โดยการเพิ่มอนุประโยค LIMIT ดังนี้

SELECT
  ad_group.id,
  ad_group.name,
  metrics.clicks,
  metrics.cost_micros,
  metrics.impressions,
  segments.date
FROM ad_group
WHERE segments.date DURING LAST_7_DAYS
  AND ad_group.id IN (id1, id2, ...)
LIMIT 100000

ป้ายกำกับเป็นอีกวิธีหนึ่งในการจัดกลุ่มเอนทิตีและลดจำนวนคำค้นหาการรายงาน ดูคู่มือป้ายกำกับเพื่อเรียนรู้เพิ่มเติม

เพิ่มประสิทธิภาพข้อมูลที่คุณดึงข้อมูล

เมื่อเรียกใช้รายงาน คุณควรคำนึงถึงคอลัมน์ที่รวมอยู่ในข้อความค้นหา ลองดูตัวอย่างต่อไปนี้ซึ่งกำหนดให้ทำงานทุกชั่วโมง

SELECT
  customer.id,
  customer.currency_code,
  campaign.id,
  campaign.name,
  ad_group.id,
  ad_group.name,
  ad_group_criterion.keyword.match_type,
  ad_group_criterion.keyword.text,
  ad_group_criterion.criterion_id,
  ad_group_criterion.quality_info.creative_quality_score,
  ad_group_criterion.system_serving_status,
  ad_group_criterion.negative,
  ad_group_criterion.quality_info.quality_score,
  ad_group_criterion.quality_info.search_predicted_ctr,
  ad_group_criterion.quality_info.post_click_quality_score,
  metrics.historical_landing_page_quality_score,
  metrics.search_click_share,
  metrics.historical_creative_quality_score,
  metrics.clicks,
  metrics.impressions
FROM keyword_view
WHERE segments.date DURING LAST_7_DAYS

คอลัมน์เดียวที่มีแนวโน้มจะเปลี่ยนแปลงทุกชั่วโมงคือ metrics.clicks และ metrics.impressions คอลัมน์อื่นๆ ทั้งหมดมีการอัปเดตไม่บ่อยนักหรือไม่อัปเดตเลย การดึงข้อมูลรายชั่วโมงจึงไม่มีประสิทธิภาพอย่างมาก คุณสามารถจัดเก็บค่าเหล่านี้ในฐานข้อมูลของเครื่องและเรียกใช้รายงานเหตุการณ์การเปลี่ยนแปลงหรือการเปลี่ยนแปลงสถานะเพื่อดาวน์โหลดการเปลี่ยนแปลง 1-2 ครั้งต่อวัน

ในบางกรณี คุณสามารถลดจำนวนแถวที่ดาวน์โหลดได้โดยใช้ตัวกรองที่เหมาะสม

ล้างบัญชีที่ไม่ได้ใช้

หากแอปพลิเคชันของคุณจัดการบัญชีผู้ลงโฆษณาบุคคลที่สาม คุณต้องพัฒนาแอปพลิเคชันโดยคำนึงถึงการเลิกใช้งานของลูกค้า คุณควรล้างกระบวนการและพื้นที่เก็บข้อมูลเป็นระยะเพื่อนำบัญชีของลูกค้าที่ไม่ได้ใช้แอปพลิเคชันของคุณอีกต่อไปออก โปรดคำนึงถึงคำแนะนำต่อไปนี้เมื่อลบบัญชี Google Ads ที่ไม่ได้ใช้

  • เพิกถอนการให้สิทธิ์ที่ลูกค้าให้แอปพลิเคชันเพื่อจัดการบัญชีของพวกเขา
  • หยุดเรียก API ไปยังบัญชี Google Ads ของลูกค้า โดยเฉพาะอย่างยิ่งกับงานแบบออฟไลน์ เช่น งาน cron และไปป์ไลน์ข้อมูลที่ออกแบบมาเพื่อเรียกใช้โดยไม่ต้องให้ผู้ใช้จัดการ
  • หากลูกค้าเพิกถอนการให้สิทธิ์ แอปพลิเคชันของคุณควรจัดการกับสถานการณ์อย่างเหมาะสมและหลีกเลี่ยงการส่งการเรียก API ที่ไม่ถูกต้องไปยังเซิร์ฟเวอร์ API ของ Google
  • หากลูกค้ายกเลิกบัญชี Google Ads ของตน คุณควรตรวจหาและหลีกเลี่ยงการส่งการเรียก API ที่ไม่ถูกต้องไปยังเซิร์ฟเวอร์ API ของ Google
  • ลบข้อมูลที่คุณดาวน์โหลดจากบัญชี Google Ads ของลูกค้า ออกจากฐานข้อมูลของเครื่องหลังจากระยะเวลาที่เหมาะสม