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

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

ทำความเข้าใจนโยบายการใช้งานทรัพยากรสำหรับรายงาน

Google Ads API จะจำกัดรูปแบบการค้นหา GoogleAdsService.Search และ GoogleAdsService.SearchStream ที่ใช้ทรัพยากร API มากเกินไปเพื่อรักษาความเสถียรของเซิร์ฟเวอร์ หากรูปแบบการค้นหาหนึ่งๆ ถูกจำกัด บริการ วิธีการ และรูปแบบการค้นหาอื่นๆ จะยังคงทำงานต่อไปโดยไม่ได้รับผลกระทบ ระบบจะแสดงข้อผิดพลาดต่อไปนี้สำหรับคำขอที่ถูกจำกัด

รหัสข้อผิดพลาด
QuotaError.EXCESSIVE_SHORT_TERM_QUERY_RESOURCE_CONSUMPTION หรือ QuotaError.EXCESSIVE_LONG_TERM_QUERY_RESOURCE_CONSUMPTION ขึ้นอยู่กับระยะเวลาที่มีการใช้ทรัพยากรสูง

หากพบข้อผิดพลาดเหล่านี้ ให้รอ 5 นาทีก่อนลองส่งคำขอที่ล้มเหลวอีกครั้งด้วย QuotaError.EXCESSIVE_SHORT_TERM_QUERY_RESOURCE_CONSUMPTION และ 30 นาทีสำหรับคำขอที่ล้มเหลวด้วย QuotaError.EXCESSIVE_LONG_TERM_QUERY_RESOURCE_CONSUMPTION

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

วิธีการ ช่องค่าใช้จ่าย
GoogleAdsService.Search SearchGoogleAdsResponse.query_resource_consumption
GoogleAdsService.SearchStream SearchGoogleAdsStreamResponse.query_resource_consumption

เมตริกต้นทุนที่ช่องเหล่านี้แสดงผลจะขึ้นอยู่กับปัจจัยต่างๆ เช่น

  • ขนาดของบัญชี
  • มุมมองและคอลัมน์ที่คุณดึงข้อมูลในรายงาน
  • ภาระงานในเซิร์ฟเวอร์ Google Ads API

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

กรอบเวลา ค่าเฉลี่ย (p50) P70 (ค่อนข้างสูง) P95 (สูงมาก)
ระยะสั้น (5 นาที) 6000 30000 1800000
ระยะยาว (24 ชม.) 16000 90000 8400000

ตัวอย่างเช่น สมมติว่าคุณใช้รูปแบบการค้นหาต่อไปนี้ซึ่งใช้ทรัพยากร 600 หน่วยต่อรายงาน

SELECT campaign.id, campaign.name, metrics.cost_micros FROM campaign WHERE
    segments.date = 'YYYY-MM-DD'

คุณเรียกใช้การค้นหานี้สำหรับบัญชีลูกค้าหลายบัญชีในวันที่ต่างๆ กันได้โดยแก้ไขการค้นหาเพื่อแทนที่ค่าต่างๆ สำหรับตัวกรอง segments.date ตารางต่อไปนี้แสดงจำนวนรายงานที่คุณเรียกใช้ได้ในกรอบเวลาที่กำหนด เพื่อให้การใช้ทรัพยากรของคุณสอดคล้องกับที่เก็บข้อมูลการใช้ทรัพยากรต่างๆ

กรอบเวลา เฉยๆ ค่อนข้างสูง สูงมาก
ระยะสั้น (5 นาที) 10 50 3000
ระยะยาว (24 ชม.) 26 150 14000

การเรียกใช้รูปแบบการค้นหานี้ 10 ครั้งใน 5 นาทีจะนับเป็นการใช้งานโดยเฉลี่ย ส่วนการเรียกใช้รายงาน 3, 000 รายการใน 5 นาทีจะนับเป็นการใช้งานที่สูงมาก

มีกลยุทธ์หลายอย่างในการเพิ่มประสิทธิภาพการใช้ทรัพยากรของรายงาน ส่วนที่เหลือของคู่มือนี้จะครอบคลุมกลยุทธ์บางส่วนเหล่านี้

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

คุณควรแคชรายละเอียดเอนทิตีที่ดึงมาจากเซิร์ฟเวอร์ 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(customerId, query);

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

    if (adGroupIds.Contains(adGroupId))
    {
      CheckAndAddRowIntoMemoryMap(row, adGroupId, memoryMap);
    }
  }
  foreach (KeyValuePair<long, List<GoogleAdsRow>> entry in memoryMap)
  {
    InsertRowsIntoStatsTable(entry.Key, entry.Value);
  }

ซึ่งจะช่วยลดภาระงานในเซิร์ฟเวอร์ 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 และ Data Pipeline ที่ออกแบบมาให้ทำงานโดยไม่ต้องมีการแทรกแซงของผู้ใช้
  • หากลูกค้าเพิกถอนการให้สิทธิ์ แอปพลิเคชันของคุณควรจัดการสถานการณ์อย่างเหมาะสมและหลีกเลี่ยงการส่งการเรียก API ที่ไม่ถูกต้องไปยังเซิร์ฟเวอร์ API ของ Google
  • หากลูกค้าได้ยกเลิกบัญชี Google Ads แล้ว คุณควรตรวจหาบัญชีที่ยกเลิกและหลีกเลี่ยงการส่งการเรียก API ที่ไม่ถูกต้องไปยังเซิร์ฟเวอร์ API ของ Google
  • ลบข้อมูลที่คุณดาวน์โหลดจากบัญชี Google Ads ของลูกค้าออกจากฐานข้อมูลในเครื่องหลังจากผ่านไประยะเวลาหนึ่งที่เหมาะสม