ฟังก์ชันหลักของแอปพลิเคชัน 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 ของลูกค้าออกจากฐานข้อมูลในเครื่องหลังจากผ่านไประยะเวลาหนึ่ง