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

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

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

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

เวอร์ชัน API รหัสข้อผิดพลาด
<= v17 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-event หรือ change-status เพื่อดาวน์โหลดการเปลี่ยนแปลงวันละครั้งหรือ 2 ครั้ง

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

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

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

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