ฟังก์ชันหลักของแอปพลิเคชัน 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 ของลูกค้าออกจาก ฐานข้อมูลของคุณหลังจากช่วงเวลาที่เหมาะสม