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

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

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

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

เวอร์ชัน API รหัสข้อผิดพลาด
<= เวอร์ชัน 17 QuotaError.RESOURCE_EXHAUSTED
>= v18 QuotaError.EXCESSIVE_SHORT_TERM_QUERY_RESOURCE_CONSUMPTION หรือ QuotaError.EXCESSIVE_LONG_TERM_QUERY_RESOURCE_CONSUMPTION ทั้งนี้ขึ้นอยู่กับ ในช่วงที่มีการใช้ทรัพยากรสูง

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

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

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

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

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

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

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

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