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