[{"data":1,"prerenderedAt":6335},["ShallowReactive",2],{"blog-suitescript-performance-optimization-writing-efficient-scripts":3,"all-blog-posts":6139},{"id":4,"title":5,"author":6,"body":7,"categories":6122,"date":6125,"description":6126,"extension":6127,"heroImage":6128,"meta":6129,"navigation":1607,"path":6130,"relatedArticles":6131,"seo":6132,"stem":6133,"tags":6134,"__hash__":6138},"content\u002Fblog\u002Fsuitescript-performance-optimization-writing-efficient-scripts.md","SuiteScript Performance Optimization: Writing Efficient Scripts","Stenbase Team",{"type":8,"value":9,"toc":6072},"minimark",[10,14,18,21,24,29,32,37,133,137,140,265,273,277,280,593,596,599,603,606,613,617,620,625,813,818,883,889,893,900,905,1052,1057,1241,1247,1251,1254,1259,1439,1444,1519,1525,1529,1532,1537,1785,1790,1913,1919,1923,1926,1931,2042,2047,2147,2157,2159,2163,2166,2170,2173,2201,2204,2208,2868,2872,2877,3167,3172,3373,3378,3758,3760,3764,3767,3771,3774,3987,3991,3994,4503,4508,4520,4525,4536,4540,4543,5099,5104,5106,5110,5113,5117,5255,5259,5262,5442,5446,5594,5596,5600,5603,5609,5613,5618,5629,5634,5645,5650,5661,5666,5670,5674,5685,5689,5700,5704,5715,5720,5724,5728,5736,5740,5751,5755,5763,5768,5770,5774,5777,5781,5818,5822,5859,5863,5890,5894,5921,5925,5952,5954,5958,5962,5965,5969,5972,5976,5979,5983,5998,6002,6005,6007,6011,6014,6040,6043,6045,6049,6052,6061,6068],[11,12,5],"h1",{"id":13},"suitescript-performance-optimization-writing-efficient-scripts",[15,16,17],"p",{},"A single inefficient saved search loop can consume 10,000 governance units in seconds. We've seen it crash scheduled scripts, timeout user event scripts, and bring Suitelet interfaces to a crawl.",[15,19,20],{},"NetSuite's governance system isn't arbitrary—it's protecting your account from runaway scripts. But understanding governance is just the beginning. True SuiteScript performance optimization requires rethinking how you query data, process records, and manage memory.",[15,22,23],{},"We've optimized hundreds of SuiteScript implementations. The patterns that follow come from real performance audits where we cut execution times by 60-90% and governance consumption by 80%+. These aren't theoretical best practices—they're battle-tested techniques with measurable results.",[25,26,28],"h2",{"id":27},"understanding-governance-the-foundation-of-suitescript-performance","Understanding Governance: The Foundation of SuiteScript Performance",[15,30,31],{},"Every SuiteScript operation costs governance units. Exceed your script's allocation, and NetSuite terminates execution. Understanding the governance model is prerequisite to writing efficient code.",[33,34,36],"h3",{"id":35},"script-type-governance-limits","Script Type Governance Limits",[38,39,40,56],"table",{},[41,42,43],"thead",{},[44,45,46,50,53],"tr",{},[47,48,49],"th",{},"Script Type",[47,51,52],{},"Governance Limit",[47,54,55],{},"Typical Use Case",[57,58,59,71,82,92,102,112,123],"tbody",{},[44,60,61,65,68],{},[62,63,64],"td",{},"Client Script",[62,66,67],{},"1,000 units",[62,69,70],{},"Field validation, UI interactions",[44,72,73,76,79],{},[62,74,75],{},"User Event",[62,77,78],{},"10,000 units",[62,80,81],{},"Before\u002Fafter record save logic",[44,83,84,87,89],{},[62,85,86],{},"Suitelet",[62,88,78],{},[62,90,91],{},"Custom UI and web services",[44,93,94,97,99],{},[62,95,96],{},"RESTlet",[62,98,78],{},[62,100,101],{},"External API endpoints",[44,103,104,107,109],{},[62,105,106],{},"Scheduled Script",[62,108,78],{},[62,110,111],{},"Batch processing (single execution)",[44,113,114,117,120],{},[62,115,116],{},"Map\u002FReduce",[62,118,119],{},"10,000 units per phase",[62,121,122],{},"High-volume parallel processing",[44,124,125,128,130],{},[62,126,127],{},"Workflow Action",[62,129,67],{},[62,131,132],{},"Workflow-triggered logic",[33,134,136],{"id":135},"operation-governance-costs","Operation Governance Costs",[15,138,139],{},"Not all operations cost the same. Here's what consumes your budget:",[38,141,142,155],{},[41,143,144],{},[44,145,146,149,152],{},[47,147,148],{},"Operation",[47,150,151],{},"Governance Cost",[47,153,154],{},"Notes",[57,156,157,171,188,201,217,228,241,253],{},[44,158,159,165,168],{},[62,160,161],{},[162,163,164],"code",{},"record.load()",[62,166,167],{},"5-10 units",[62,169,170],{},"Varies by record type",[44,172,173,182,185],{},[62,174,175,178,179],{},[162,176,177],{},"record.create()"," + ",[162,180,181],{},"save()",[62,183,184],{},"10-20 units",[62,186,187],{},"Depends on sublist count",[44,189,190,195,198],{},[62,191,192],{},[162,193,194],{},"record.submitFields()",[62,196,197],{},"2-4 units",[62,199,200],{},"Much cheaper than full load\u002Fsave",[44,202,203,211,214],{},[62,204,205,178,208],{},[162,206,207],{},"search.create()",[162,209,210],{},"run()",[62,212,213],{},"5 units",[62,215,216],{},"Initial search execution",[44,218,219,222,225],{},[62,220,221],{},"Search result iteration",[62,223,224],{},"10 units per page (1000 results)",[62,226,227],{},"Pageddata is more efficient",[44,229,230,235,238],{},[62,231,232],{},[162,233,234],{},"https.request()",[62,236,237],{},"10 units",[62,239,240],{},"External API calls",[44,242,243,248,250],{},[62,244,245],{},[162,246,247],{},"email.send()",[62,249,237],{},[62,251,252],{},"Each email sent",[44,254,255,260,262],{},[62,256,257],{},[162,258,259],{},"file.load()",[62,261,213],{},[62,263,264],{},"File cabinet access",[15,266,267,268,272],{},"The killer insight: ",[269,270,271],"strong",{},"record operations are expensive; searches are cheap."," Most performance problems come from developers loading records when a search would suffice.",[33,274,276],{"id":275},"checking-governance-in-real-time","Checking Governance in Real-Time",[15,278,279],{},"Always monitor your governance consumption:",[281,282,287],"pre",{"className":283,"code":284,"language":285,"meta":286,"style":286},"language-javascript shiki shiki-themes github-light github-dark","\u002F**\n * @NApiVersion 2.1\n * @NScriptType ScheduledScript\n *\u002F\ndefine(['N\u002Fruntime', 'N\u002Flog'], function(runtime, log) {\n    \n    function execute(context) {\n        const script = runtime.getCurrentScript();\n        \n        \u002F\u002F Check at start\n        log.debug('Starting Governance', script.getRemainingUsage());\n        \n        \u002F\u002F Your processing logic here\n        processRecords();\n        \n        \u002F\u002F Check after major operations\n        log.debug('After Processing', script.getRemainingUsage());\n        \n        \u002F\u002F Always leave buffer\n        if (script.getRemainingUsage() \u003C 500) {\n            log.audit('Governance Warning', 'Low governance - stopping early');\n            return;\n        }\n    }\n    \n    return { execute: execute };\n});\n","javascript","",[162,288,289,298,311,322,328,370,376,392,414,420,426,449,454,460,468,473,479,497,502,508,530,552,561,567,573,578,587],{"__ignoreMap":286},[290,291,294],"span",{"class":292,"line":293},"line",1,[290,295,297],{"class":296},"sJ8bj","\u002F**\n",[290,299,301,304,308],{"class":292,"line":300},2,[290,302,303],{"class":296}," * ",[290,305,307],{"class":306},"szBVR","@NApiVersion",[290,309,310],{"class":296}," 2.1\n",[290,312,314,316,319],{"class":292,"line":313},3,[290,315,303],{"class":296},[290,317,318],{"class":306},"@NScriptType",[290,320,321],{"class":296}," ScheduledScript\n",[290,323,325],{"class":292,"line":324},4,[290,326,327],{"class":296}," *\u002F\n",[290,329,331,335,339,343,346,349,352,355,358,362,364,367],{"class":292,"line":330},5,[290,332,334],{"class":333},"sScJk","define",[290,336,338],{"class":337},"sVt8B","([",[290,340,342],{"class":341},"sZZnC","'N\u002Fruntime'",[290,344,345],{"class":337},", ",[290,347,348],{"class":341},"'N\u002Flog'",[290,350,351],{"class":337},"], ",[290,353,354],{"class":306},"function",[290,356,357],{"class":337},"(",[290,359,361],{"class":360},"s4XuR","runtime",[290,363,345],{"class":337},[290,365,366],{"class":360},"log",[290,368,369],{"class":337},") {\n",[290,371,373],{"class":292,"line":372},6,[290,374,375],{"class":337},"    \n",[290,377,379,382,385,387,390],{"class":292,"line":378},7,[290,380,381],{"class":306},"    function",[290,383,384],{"class":333}," execute",[290,386,357],{"class":337},[290,388,389],{"class":360},"context",[290,391,369],{"class":337},[290,393,395,398,402,405,408,411],{"class":292,"line":394},8,[290,396,397],{"class":306},"        const",[290,399,401],{"class":400},"sj4cs"," script",[290,403,404],{"class":306}," =",[290,406,407],{"class":337}," runtime.",[290,409,410],{"class":333},"getCurrentScript",[290,412,413],{"class":337},"();\n",[290,415,417],{"class":292,"line":416},9,[290,418,419],{"class":337},"        \n",[290,421,423],{"class":292,"line":422},10,[290,424,425],{"class":296},"        \u002F\u002F Check at start\n",[290,427,429,432,435,437,440,443,446],{"class":292,"line":428},11,[290,430,431],{"class":337},"        log.",[290,433,434],{"class":333},"debug",[290,436,357],{"class":337},[290,438,439],{"class":341},"'Starting Governance'",[290,441,442],{"class":337},", script.",[290,444,445],{"class":333},"getRemainingUsage",[290,447,448],{"class":337},"());\n",[290,450,452],{"class":292,"line":451},12,[290,453,419],{"class":337},[290,455,457],{"class":292,"line":456},13,[290,458,459],{"class":296},"        \u002F\u002F Your processing logic here\n",[290,461,463,466],{"class":292,"line":462},14,[290,464,465],{"class":333},"        processRecords",[290,467,413],{"class":337},[290,469,471],{"class":292,"line":470},15,[290,472,419],{"class":337},[290,474,476],{"class":292,"line":475},16,[290,477,478],{"class":296},"        \u002F\u002F Check after major operations\n",[290,480,482,484,486,488,491,493,495],{"class":292,"line":481},17,[290,483,431],{"class":337},[290,485,434],{"class":333},[290,487,357],{"class":337},[290,489,490],{"class":341},"'After Processing'",[290,492,442],{"class":337},[290,494,445],{"class":333},[290,496,448],{"class":337},[290,498,500],{"class":292,"line":499},18,[290,501,419],{"class":337},[290,503,505],{"class":292,"line":504},19,[290,506,507],{"class":296},"        \u002F\u002F Always leave buffer\n",[290,509,511,514,517,519,522,525,528],{"class":292,"line":510},20,[290,512,513],{"class":306},"        if",[290,515,516],{"class":337}," (script.",[290,518,445],{"class":333},[290,520,521],{"class":337},"() ",[290,523,524],{"class":306},"\u003C",[290,526,527],{"class":400}," 500",[290,529,369],{"class":337},[290,531,533,536,539,541,544,546,549],{"class":292,"line":532},21,[290,534,535],{"class":337},"            log.",[290,537,538],{"class":333},"audit",[290,540,357],{"class":337},[290,542,543],{"class":341},"'Governance Warning'",[290,545,345],{"class":337},[290,547,548],{"class":341},"'Low governance - stopping early'",[290,550,551],{"class":337},");\n",[290,553,555,558],{"class":292,"line":554},22,[290,556,557],{"class":306},"            return",[290,559,560],{"class":337},";\n",[290,562,564],{"class":292,"line":563},23,[290,565,566],{"class":337},"        }\n",[290,568,570],{"class":292,"line":569},24,[290,571,572],{"class":337},"    }\n",[290,574,576],{"class":292,"line":575},25,[290,577,375],{"class":337},[290,579,581,584],{"class":292,"line":580},26,[290,582,583],{"class":306},"    return",[290,585,586],{"class":337}," { execute: execute };\n",[290,588,590],{"class":292,"line":589},27,[290,591,592],{"class":337},"});\n",[15,594,595],{},"Build governance checks into loops. Exit gracefully before you hit the limit—don't let NetSuite terminate your script mid-operation.",[597,598],"hr",{},[25,600,602],{"id":601},"efficient-search-patterns-the-biggest-performance-win","Efficient Search Patterns: The Biggest Performance Win",[15,604,605],{},"Searches are the backbone of SuiteScript. Optimizing them delivers the largest performance gains.",[15,607,608],{},[609,610],"img",{"alt":611,"src":612},"Server performance monitoring and metrics dashboard","\u002Fimages\u002Fblog\u002Fsuitescript-performance-monitoring.webp",[33,614,616],{"id":615},"pattern-1-use-saved-searches-instead-of-scripted-searches","Pattern 1: Use Saved Searches Instead of Scripted Searches",[15,618,619],{},"Saved searches are compiled and cached by NetSuite. Scripted searches are built at runtime. For searches you'll run repeatedly, saved searches win.",[15,621,622],{},[269,623,624],{},"Slow approach (scripted search every time):",[281,626,628],{"className":283,"code":627,"language":285,"meta":286,"style":286},"\u002F\u002F BAD: Building search on every execution\nfunction getOpenOrders() {\n    const orderSearch = search.create({\n        type: search.Type.SALES_ORDER,\n        filters: [\n            ['status', 'anyof', 'SalesOrd:B', 'SalesOrd:D', 'SalesOrd:E'],\n            'AND',\n            ['mainline', 'is', 'T']\n        ],\n        columns: ['entity', 'tranid', 'total', 'trandate']\n    });\n    \n    return orderSearch.run().getRange({ start: 0, end: 1000 });\n}\n",[162,629,630,635,645,664,675,680,711,718,738,743,768,773,777,808],{"__ignoreMap":286},[290,631,632],{"class":292,"line":293},[290,633,634],{"class":296},"\u002F\u002F BAD: Building search on every execution\n",[290,636,637,639,642],{"class":292,"line":300},[290,638,354],{"class":306},[290,640,641],{"class":333}," getOpenOrders",[290,643,644],{"class":337},"() {\n",[290,646,647,650,653,655,658,661],{"class":292,"line":313},[290,648,649],{"class":306},"    const",[290,651,652],{"class":400}," orderSearch",[290,654,404],{"class":306},[290,656,657],{"class":337}," search.",[290,659,660],{"class":333},"create",[290,662,663],{"class":337},"({\n",[290,665,666,669,672],{"class":292,"line":324},[290,667,668],{"class":337},"        type: search.Type.",[290,670,671],{"class":400},"SALES_ORDER",[290,673,674],{"class":337},",\n",[290,676,677],{"class":292,"line":330},[290,678,679],{"class":337},"        filters: [\n",[290,681,682,685,688,690,693,695,698,700,703,705,708],{"class":292,"line":372},[290,683,684],{"class":337},"            [",[290,686,687],{"class":341},"'status'",[290,689,345],{"class":337},[290,691,692],{"class":341},"'anyof'",[290,694,345],{"class":337},[290,696,697],{"class":341},"'SalesOrd:B'",[290,699,345],{"class":337},[290,701,702],{"class":341},"'SalesOrd:D'",[290,704,345],{"class":337},[290,706,707],{"class":341},"'SalesOrd:E'",[290,709,710],{"class":337},"],\n",[290,712,713,716],{"class":292,"line":378},[290,714,715],{"class":341},"            'AND'",[290,717,674],{"class":337},[290,719,720,722,725,727,730,732,735],{"class":292,"line":394},[290,721,684],{"class":337},[290,723,724],{"class":341},"'mainline'",[290,726,345],{"class":337},[290,728,729],{"class":341},"'is'",[290,731,345],{"class":337},[290,733,734],{"class":341},"'T'",[290,736,737],{"class":337},"]\n",[290,739,740],{"class":292,"line":416},[290,741,742],{"class":337},"        ],\n",[290,744,745,748,751,753,756,758,761,763,766],{"class":292,"line":422},[290,746,747],{"class":337},"        columns: [",[290,749,750],{"class":341},"'entity'",[290,752,345],{"class":337},[290,754,755],{"class":341},"'tranid'",[290,757,345],{"class":337},[290,759,760],{"class":341},"'total'",[290,762,345],{"class":337},[290,764,765],{"class":341},"'trandate'",[290,767,737],{"class":337},[290,769,770],{"class":292,"line":428},[290,771,772],{"class":337},"    });\n",[290,774,775],{"class":292,"line":451},[290,776,375],{"class":337},[290,778,779,781,784,787,790,793,796,799,802,805],{"class":292,"line":456},[290,780,583],{"class":306},[290,782,783],{"class":337}," orderSearch.",[290,785,786],{"class":333},"run",[290,788,789],{"class":337},"().",[290,791,792],{"class":333},"getRange",[290,794,795],{"class":337},"({ start: ",[290,797,798],{"class":400},"0",[290,800,801],{"class":337},", end: ",[290,803,804],{"class":400},"1000",[290,806,807],{"class":337}," });\n",[290,809,810],{"class":292,"line":462},[290,811,812],{"class":337},"}\n",[15,814,815],{},[269,816,817],{},"Fast approach (saved search):",[281,819,821],{"className":283,"code":820,"language":285,"meta":286,"style":286},"\u002F\u002F GOOD: Load pre-compiled saved search\nfunction getOpenOrders() {\n    const orderSearch = search.load({ id: 'customsearch_open_orders' });\n    return orderSearch.run().getRange({ start: 0, end: 1000 });\n}\n",[162,822,823,828,836,857,879],{"__ignoreMap":286},[290,824,825],{"class":292,"line":293},[290,826,827],{"class":296},"\u002F\u002F GOOD: Load pre-compiled saved search\n",[290,829,830,832,834],{"class":292,"line":300},[290,831,354],{"class":306},[290,833,641],{"class":333},[290,835,644],{"class":337},[290,837,838,840,842,844,846,849,852,855],{"class":292,"line":313},[290,839,649],{"class":306},[290,841,652],{"class":400},[290,843,404],{"class":306},[290,845,657],{"class":337},[290,847,848],{"class":333},"load",[290,850,851],{"class":337},"({ id: ",[290,853,854],{"class":341},"'customsearch_open_orders'",[290,856,807],{"class":337},[290,858,859,861,863,865,867,869,871,873,875,877],{"class":292,"line":324},[290,860,583],{"class":306},[290,862,783],{"class":337},[290,864,786],{"class":333},[290,866,789],{"class":337},[290,868,792],{"class":333},[290,870,795],{"class":337},[290,872,798],{"class":400},[290,874,801],{"class":337},[290,876,804],{"class":400},[290,878,807],{"class":337},[290,880,881],{"class":292,"line":330},[290,882,812],{"class":337},[15,884,885,888],{},[269,886,887],{},"Performance difference:"," 15-30% faster execution, lower governance consumption, and the saved search can be modified by administrators without code changes.",[33,890,892],{"id":891},"pattern-2-paged-data-for-large-result-sets","Pattern 2: Paged Data for Large Result Sets",[15,894,895,896,899],{},"Using ",[162,897,898],{},"getRange()"," loads results into memory. For large result sets, use paged data instead.",[15,901,902],{},[269,903,904],{},"Memory-hungry approach:",[281,906,908],{"className":283,"code":907,"language":285,"meta":286,"style":286},"\u002F\u002F BAD: Loads all results into memory\nfunction processAllCustomers() {\n    const results = search.create({\n        type: search.Type.CUSTOMER,\n        filters: [['isinactive', 'is', 'F']],\n        columns: ['companyname', 'email', 'salesrep']\n    }).run().getRange({ start: 0, end: 4000 }); \u002F\u002F Limited to 4000 anyway\n    \n    results.forEach(function(result) {\n        processCustomer(result);\n    });\n}\n",[162,909,910,915,924,939,948,968,987,1013,1017,1036,1044,1048],{"__ignoreMap":286},[290,911,912],{"class":292,"line":293},[290,913,914],{"class":296},"\u002F\u002F BAD: Loads all results into memory\n",[290,916,917,919,922],{"class":292,"line":300},[290,918,354],{"class":306},[290,920,921],{"class":333}," processAllCustomers",[290,923,644],{"class":337},[290,925,926,928,931,933,935,937],{"class":292,"line":313},[290,927,649],{"class":306},[290,929,930],{"class":400}," results",[290,932,404],{"class":306},[290,934,657],{"class":337},[290,936,660],{"class":333},[290,938,663],{"class":337},[290,940,941,943,946],{"class":292,"line":324},[290,942,668],{"class":337},[290,944,945],{"class":400},"CUSTOMER",[290,947,674],{"class":337},[290,949,950,953,956,958,960,962,965],{"class":292,"line":330},[290,951,952],{"class":337},"        filters: [[",[290,954,955],{"class":341},"'isinactive'",[290,957,345],{"class":337},[290,959,729],{"class":341},[290,961,345],{"class":337},[290,963,964],{"class":341},"'F'",[290,966,967],{"class":337},"]],\n",[290,969,970,972,975,977,980,982,985],{"class":292,"line":372},[290,971,747],{"class":337},[290,973,974],{"class":341},"'companyname'",[290,976,345],{"class":337},[290,978,979],{"class":341},"'email'",[290,981,345],{"class":337},[290,983,984],{"class":341},"'salesrep'",[290,986,737],{"class":337},[290,988,989,992,994,996,998,1000,1002,1004,1007,1010],{"class":292,"line":378},[290,990,991],{"class":337},"    }).",[290,993,786],{"class":333},[290,995,789],{"class":337},[290,997,792],{"class":333},[290,999,795],{"class":337},[290,1001,798],{"class":400},[290,1003,801],{"class":337},[290,1005,1006],{"class":400},"4000",[290,1008,1009],{"class":337}," }); ",[290,1011,1012],{"class":296},"\u002F\u002F Limited to 4000 anyway\n",[290,1014,1015],{"class":292,"line":394},[290,1016,375],{"class":337},[290,1018,1019,1022,1025,1027,1029,1031,1034],{"class":292,"line":416},[290,1020,1021],{"class":337},"    results.",[290,1023,1024],{"class":333},"forEach",[290,1026,357],{"class":337},[290,1028,354],{"class":306},[290,1030,357],{"class":337},[290,1032,1033],{"class":360},"result",[290,1035,369],{"class":337},[290,1037,1038,1041],{"class":292,"line":422},[290,1039,1040],{"class":333},"        processCustomer",[290,1042,1043],{"class":337},"(result);\n",[290,1045,1046],{"class":292,"line":428},[290,1047,772],{"class":337},[290,1049,1050],{"class":292,"line":451},[290,1051,812],{"class":337},[15,1053,1054],{},[269,1055,1056],{},"Memory-efficient approach:",[281,1058,1060],{"className":283,"code":1059,"language":285,"meta":286,"style":286},"\u002F\u002F GOOD: Processes in pages, never loads entire result set\nfunction processAllCustomers() {\n    const customerSearch = search.create({\n        type: search.Type.CUSTOMER,\n        filters: [['isinactive', 'is', 'F']],\n        columns: ['companyname', 'email', 'salesrep']\n    });\n    \n    const pagedData = customerSearch.runPaged({ pageSize: 1000 });\n    \n    pagedData.pageRanges.forEach(function(pageRange) {\n        const page = pagedData.fetch({ index: pageRange.index });\n        \n        page.data.forEach(function(result) {\n            processCustomer(result);\n        });\n    });\n}\n",[162,1061,1062,1067,1075,1090,1098,1114,1130,1134,1138,1160,1164,1182,1200,1204,1221,1228,1233,1237],{"__ignoreMap":286},[290,1063,1064],{"class":292,"line":293},[290,1065,1066],{"class":296},"\u002F\u002F GOOD: Processes in pages, never loads entire result set\n",[290,1068,1069,1071,1073],{"class":292,"line":300},[290,1070,354],{"class":306},[290,1072,921],{"class":333},[290,1074,644],{"class":337},[290,1076,1077,1079,1082,1084,1086,1088],{"class":292,"line":313},[290,1078,649],{"class":306},[290,1080,1081],{"class":400}," customerSearch",[290,1083,404],{"class":306},[290,1085,657],{"class":337},[290,1087,660],{"class":333},[290,1089,663],{"class":337},[290,1091,1092,1094,1096],{"class":292,"line":324},[290,1093,668],{"class":337},[290,1095,945],{"class":400},[290,1097,674],{"class":337},[290,1099,1100,1102,1104,1106,1108,1110,1112],{"class":292,"line":330},[290,1101,952],{"class":337},[290,1103,955],{"class":341},[290,1105,345],{"class":337},[290,1107,729],{"class":341},[290,1109,345],{"class":337},[290,1111,964],{"class":341},[290,1113,967],{"class":337},[290,1115,1116,1118,1120,1122,1124,1126,1128],{"class":292,"line":372},[290,1117,747],{"class":337},[290,1119,974],{"class":341},[290,1121,345],{"class":337},[290,1123,979],{"class":341},[290,1125,345],{"class":337},[290,1127,984],{"class":341},[290,1129,737],{"class":337},[290,1131,1132],{"class":292,"line":378},[290,1133,772],{"class":337},[290,1135,1136],{"class":292,"line":394},[290,1137,375],{"class":337},[290,1139,1140,1142,1145,1147,1150,1153,1156,1158],{"class":292,"line":416},[290,1141,649],{"class":306},[290,1143,1144],{"class":400}," pagedData",[290,1146,404],{"class":306},[290,1148,1149],{"class":337}," customerSearch.",[290,1151,1152],{"class":333},"runPaged",[290,1154,1155],{"class":337},"({ pageSize: ",[290,1157,804],{"class":400},[290,1159,807],{"class":337},[290,1161,1162],{"class":292,"line":422},[290,1163,375],{"class":337},[290,1165,1166,1169,1171,1173,1175,1177,1180],{"class":292,"line":428},[290,1167,1168],{"class":337},"    pagedData.pageRanges.",[290,1170,1024],{"class":333},[290,1172,357],{"class":337},[290,1174,354],{"class":306},[290,1176,357],{"class":337},[290,1178,1179],{"class":360},"pageRange",[290,1181,369],{"class":337},[290,1183,1184,1186,1189,1191,1194,1197],{"class":292,"line":451},[290,1185,397],{"class":306},[290,1187,1188],{"class":400}," page",[290,1190,404],{"class":306},[290,1192,1193],{"class":337}," pagedData.",[290,1195,1196],{"class":333},"fetch",[290,1198,1199],{"class":337},"({ index: pageRange.index });\n",[290,1201,1202],{"class":292,"line":456},[290,1203,419],{"class":337},[290,1205,1206,1209,1211,1213,1215,1217,1219],{"class":292,"line":462},[290,1207,1208],{"class":337},"        page.data.",[290,1210,1024],{"class":333},[290,1212,357],{"class":337},[290,1214,354],{"class":306},[290,1216,357],{"class":337},[290,1218,1033],{"class":360},[290,1220,369],{"class":337},[290,1222,1223,1226],{"class":292,"line":470},[290,1224,1225],{"class":333},"            processCustomer",[290,1227,1043],{"class":337},[290,1229,1230],{"class":292,"line":475},[290,1231,1232],{"class":337},"        });\n",[290,1234,1235],{"class":292,"line":481},[290,1236,772],{"class":337},[290,1238,1239],{"class":292,"line":499},[290,1240,812],{"class":337},[15,1242,1243,1246],{},[269,1244,1245],{},"Why it matters:"," Paged data streams results. You never hold more than one page (1000 results) in memory. This prevents memory exceptions on large data sets and processes results faster.",[33,1248,1250],{"id":1249},"pattern-3-return-only-the-columns-you-need","Pattern 3: Return Only the Columns You Need",[15,1252,1253],{},"Every column in your search results consumes memory and bandwidth. Request only what you'll use.",[15,1255,1256],{},[269,1257,1258],{},"Wasteful approach:",[281,1260,1262],{"className":283,"code":1261,"language":285,"meta":286,"style":286},"\u002F\u002F BAD: Returns all available columns\nconst itemSearch = search.create({\n    type: search.Type.INVENTORY_ITEM,\n    filters: [['isinactive', 'is', 'F']],\n    columns: [\n        'itemid', 'displayname', 'salesdescription', 'purchasedescription',\n        'baseprice', 'cost', 'quantityavailable', 'quantityonhand',\n        'quantityonorder', 'quantitybackordered', 'vendor', 'manufacturer',\n        'class', 'department', 'location', 'subsidiary', 'custitem_field1',\n        'custitem_field2', 'custitem_field3', 'custitem_field4'\n        \u002F\u002F 20 columns when you only need 3\n    ]\n});\n",[162,1263,1264,1269,1285,1295,1312,1317,1339,1361,1383,1410,1425,1430,1435],{"__ignoreMap":286},[290,1265,1266],{"class":292,"line":293},[290,1267,1268],{"class":296},"\u002F\u002F BAD: Returns all available columns\n",[290,1270,1271,1274,1277,1279,1281,1283],{"class":292,"line":300},[290,1272,1273],{"class":306},"const",[290,1275,1276],{"class":400}," itemSearch",[290,1278,404],{"class":306},[290,1280,657],{"class":337},[290,1282,660],{"class":333},[290,1284,663],{"class":337},[290,1286,1287,1290,1293],{"class":292,"line":313},[290,1288,1289],{"class":337},"    type: search.Type.",[290,1291,1292],{"class":400},"INVENTORY_ITEM",[290,1294,674],{"class":337},[290,1296,1297,1300,1302,1304,1306,1308,1310],{"class":292,"line":324},[290,1298,1299],{"class":337},"    filters: [[",[290,1301,955],{"class":341},[290,1303,345],{"class":337},[290,1305,729],{"class":341},[290,1307,345],{"class":337},[290,1309,964],{"class":341},[290,1311,967],{"class":337},[290,1313,1314],{"class":292,"line":330},[290,1315,1316],{"class":337},"    columns: [\n",[290,1318,1319,1322,1324,1327,1329,1332,1334,1337],{"class":292,"line":372},[290,1320,1321],{"class":341},"        'itemid'",[290,1323,345],{"class":337},[290,1325,1326],{"class":341},"'displayname'",[290,1328,345],{"class":337},[290,1330,1331],{"class":341},"'salesdescription'",[290,1333,345],{"class":337},[290,1335,1336],{"class":341},"'purchasedescription'",[290,1338,674],{"class":337},[290,1340,1341,1344,1346,1349,1351,1354,1356,1359],{"class":292,"line":378},[290,1342,1343],{"class":341},"        'baseprice'",[290,1345,345],{"class":337},[290,1347,1348],{"class":341},"'cost'",[290,1350,345],{"class":337},[290,1352,1353],{"class":341},"'quantityavailable'",[290,1355,345],{"class":337},[290,1357,1358],{"class":341},"'quantityonhand'",[290,1360,674],{"class":337},[290,1362,1363,1366,1368,1371,1373,1376,1378,1381],{"class":292,"line":394},[290,1364,1365],{"class":341},"        'quantityonorder'",[290,1367,345],{"class":337},[290,1369,1370],{"class":341},"'quantitybackordered'",[290,1372,345],{"class":337},[290,1374,1375],{"class":341},"'vendor'",[290,1377,345],{"class":337},[290,1379,1380],{"class":341},"'manufacturer'",[290,1382,674],{"class":337},[290,1384,1385,1388,1390,1393,1395,1398,1400,1403,1405,1408],{"class":292,"line":416},[290,1386,1387],{"class":341},"        'class'",[290,1389,345],{"class":337},[290,1391,1392],{"class":341},"'department'",[290,1394,345],{"class":337},[290,1396,1397],{"class":341},"'location'",[290,1399,345],{"class":337},[290,1401,1402],{"class":341},"'subsidiary'",[290,1404,345],{"class":337},[290,1406,1407],{"class":341},"'custitem_field1'",[290,1409,674],{"class":337},[290,1411,1412,1415,1417,1420,1422],{"class":292,"line":422},[290,1413,1414],{"class":341},"        'custitem_field2'",[290,1416,345],{"class":337},[290,1418,1419],{"class":341},"'custitem_field3'",[290,1421,345],{"class":337},[290,1423,1424],{"class":341},"'custitem_field4'\n",[290,1426,1427],{"class":292,"line":428},[290,1428,1429],{"class":296},"        \u002F\u002F 20 columns when you only need 3\n",[290,1431,1432],{"class":292,"line":451},[290,1433,1434],{"class":337},"    ]\n",[290,1436,1437],{"class":292,"line":456},[290,1438,592],{"class":337},[15,1440,1441],{},[269,1442,1443],{},"Efficient approach:",[281,1445,1447],{"className":283,"code":1446,"language":285,"meta":286,"style":286},"\u002F\u002F GOOD: Only the columns you'll actually use\nconst itemSearch = search.create({\n    type: search.Type.INVENTORY_ITEM,\n    filters: [['isinactive', 'is', 'F']],\n    columns: ['itemid', 'displayname', 'quantityavailable']\n    \u002F\u002F 3 columns - faster query, less memory\n});\n",[162,1448,1449,1454,1468,1476,1492,1510,1515],{"__ignoreMap":286},[290,1450,1451],{"class":292,"line":293},[290,1452,1453],{"class":296},"\u002F\u002F GOOD: Only the columns you'll actually use\n",[290,1455,1456,1458,1460,1462,1464,1466],{"class":292,"line":300},[290,1457,1273],{"class":306},[290,1459,1276],{"class":400},[290,1461,404],{"class":306},[290,1463,657],{"class":337},[290,1465,660],{"class":333},[290,1467,663],{"class":337},[290,1469,1470,1472,1474],{"class":292,"line":313},[290,1471,1289],{"class":337},[290,1473,1292],{"class":400},[290,1475,674],{"class":337},[290,1477,1478,1480,1482,1484,1486,1488,1490],{"class":292,"line":324},[290,1479,1299],{"class":337},[290,1481,955],{"class":341},[290,1483,345],{"class":337},[290,1485,729],{"class":341},[290,1487,345],{"class":337},[290,1489,964],{"class":341},[290,1491,967],{"class":337},[290,1493,1494,1497,1500,1502,1504,1506,1508],{"class":292,"line":330},[290,1495,1496],{"class":337},"    columns: [",[290,1498,1499],{"class":341},"'itemid'",[290,1501,345],{"class":337},[290,1503,1326],{"class":341},[290,1505,345],{"class":337},[290,1507,1353],{"class":341},[290,1509,737],{"class":337},[290,1511,1512],{"class":292,"line":372},[290,1513,1514],{"class":296},"    \u002F\u002F 3 columns - faster query, less memory\n",[290,1516,1517],{"class":292,"line":378},[290,1518,592],{"class":337},[15,1520,1521,1524],{},[269,1522,1523],{},"Benchmark:"," A search returning 5,000 items with 20 columns vs. 3 columns executes 40-50% faster.",[33,1526,1528],{"id":1527},"pattern-4-use-formula-fields-for-calculated-values","Pattern 4: Use Formula Fields for Calculated Values",[15,1530,1531],{},"Don't fetch raw data and calculate in JavaScript. Let the database do the math.",[15,1533,1534],{},[269,1535,1536],{},"Slow approach (client-side calculation):",[281,1538,1540],{"className":283,"code":1539,"language":285,"meta":286,"style":286},"\u002F\u002F BAD: Fetching raw dates and calculating in JS\nconst results = search.create({\n    type: search.Type.SALES_ORDER,\n    columns: ['trandate', 'shipdate']\n}).run().getRange({ start: 0, end: 1000 });\n\nconst overdueOrders = results.filter(function(result) {\n    const tranDate = new Date(result.getValue('trandate'));\n    const shipDate = result.getValue('shipdate');\n    if (!shipDate) return false;\n    \n    const shipDateObj = new Date(shipDate);\n    const daysDiff = (shipDateObj - tranDate) \u002F (1000 * 60 * 60 * 24);\n    return daysDiff > 30;\n});\n",[162,1541,1542,1547,1561,1569,1582,1603,1609,1634,1662,1682,1704,1708,1724,1766,1781],{"__ignoreMap":286},[290,1543,1544],{"class":292,"line":293},[290,1545,1546],{"class":296},"\u002F\u002F BAD: Fetching raw dates and calculating in JS\n",[290,1548,1549,1551,1553,1555,1557,1559],{"class":292,"line":300},[290,1550,1273],{"class":306},[290,1552,930],{"class":400},[290,1554,404],{"class":306},[290,1556,657],{"class":337},[290,1558,660],{"class":333},[290,1560,663],{"class":337},[290,1562,1563,1565,1567],{"class":292,"line":313},[290,1564,1289],{"class":337},[290,1566,671],{"class":400},[290,1568,674],{"class":337},[290,1570,1571,1573,1575,1577,1580],{"class":292,"line":324},[290,1572,1496],{"class":337},[290,1574,765],{"class":341},[290,1576,345],{"class":337},[290,1578,1579],{"class":341},"'shipdate'",[290,1581,737],{"class":337},[290,1583,1584,1587,1589,1591,1593,1595,1597,1599,1601],{"class":292,"line":330},[290,1585,1586],{"class":337},"}).",[290,1588,786],{"class":333},[290,1590,789],{"class":337},[290,1592,792],{"class":333},[290,1594,795],{"class":337},[290,1596,798],{"class":400},[290,1598,801],{"class":337},[290,1600,804],{"class":400},[290,1602,807],{"class":337},[290,1604,1605],{"class":292,"line":372},[290,1606,1608],{"emptyLinePlaceholder":1607},true,"\n",[290,1610,1611,1613,1616,1618,1621,1624,1626,1628,1630,1632],{"class":292,"line":378},[290,1612,1273],{"class":306},[290,1614,1615],{"class":400}," overdueOrders",[290,1617,404],{"class":306},[290,1619,1620],{"class":337}," results.",[290,1622,1623],{"class":333},"filter",[290,1625,357],{"class":337},[290,1627,354],{"class":306},[290,1629,357],{"class":337},[290,1631,1033],{"class":360},[290,1633,369],{"class":337},[290,1635,1636,1638,1641,1643,1646,1649,1652,1655,1657,1659],{"class":292,"line":394},[290,1637,649],{"class":306},[290,1639,1640],{"class":400}," tranDate",[290,1642,404],{"class":306},[290,1644,1645],{"class":306}," new",[290,1647,1648],{"class":333}," Date",[290,1650,1651],{"class":337},"(result.",[290,1653,1654],{"class":333},"getValue",[290,1656,357],{"class":337},[290,1658,765],{"class":341},[290,1660,1661],{"class":337},"));\n",[290,1663,1664,1666,1669,1671,1674,1676,1678,1680],{"class":292,"line":416},[290,1665,649],{"class":306},[290,1667,1668],{"class":400}," shipDate",[290,1670,404],{"class":306},[290,1672,1673],{"class":337}," result.",[290,1675,1654],{"class":333},[290,1677,357],{"class":337},[290,1679,1579],{"class":341},[290,1681,551],{"class":337},[290,1683,1684,1687,1690,1693,1696,1699,1702],{"class":292,"line":422},[290,1685,1686],{"class":306},"    if",[290,1688,1689],{"class":337}," (",[290,1691,1692],{"class":306},"!",[290,1694,1695],{"class":337},"shipDate) ",[290,1697,1698],{"class":306},"return",[290,1700,1701],{"class":400}," false",[290,1703,560],{"class":337},[290,1705,1706],{"class":292,"line":428},[290,1707,375],{"class":337},[290,1709,1710,1712,1715,1717,1719,1721],{"class":292,"line":451},[290,1711,649],{"class":306},[290,1713,1714],{"class":400}," shipDateObj",[290,1716,404],{"class":306},[290,1718,1645],{"class":306},[290,1720,1648],{"class":333},[290,1722,1723],{"class":337},"(shipDate);\n",[290,1725,1726,1728,1731,1733,1736,1739,1742,1745,1747,1749,1752,1755,1757,1759,1761,1764],{"class":292,"line":456},[290,1727,649],{"class":306},[290,1729,1730],{"class":400}," daysDiff",[290,1732,404],{"class":306},[290,1734,1735],{"class":337}," (shipDateObj ",[290,1737,1738],{"class":306},"-",[290,1740,1741],{"class":337}," tranDate) ",[290,1743,1744],{"class":306},"\u002F",[290,1746,1689],{"class":337},[290,1748,804],{"class":400},[290,1750,1751],{"class":306}," *",[290,1753,1754],{"class":400}," 60",[290,1756,1751],{"class":306},[290,1758,1754],{"class":400},[290,1760,1751],{"class":306},[290,1762,1763],{"class":400}," 24",[290,1765,551],{"class":337},[290,1767,1768,1770,1773,1776,1779],{"class":292,"line":462},[290,1769,583],{"class":306},[290,1771,1772],{"class":337}," daysDiff ",[290,1774,1775],{"class":306},">",[290,1777,1778],{"class":400}," 30",[290,1780,560],{"class":337},[290,1782,1783],{"class":292,"line":470},[290,1784,592],{"class":337},[15,1786,1787],{},[269,1788,1789],{},"Fast approach (server-side calculation):",[281,1791,1793],{"className":283,"code":1792,"language":285,"meta":286,"style":286},"\u002F\u002F GOOD: Let the database filter\nconst overdueSearch = search.create({\n    type: search.Type.SALES_ORDER,\n    filters: [\n        ['formulanumeric: {shipdate} - {trandate}', 'greaterthan', 30]\n    ],\n    columns: ['trandate', 'shipdate', 'entity', 'total']\n});\n\nconst overdueOrders = overdueSearch.run().getRange({ start: 0, end: 1000 });\n\u002F\u002F Only overdue orders returned - no client-side filtering needed\n",[162,1794,1795,1800,1815,1823,1828,1848,1853,1873,1877,1881,1908],{"__ignoreMap":286},[290,1796,1797],{"class":292,"line":293},[290,1798,1799],{"class":296},"\u002F\u002F GOOD: Let the database filter\n",[290,1801,1802,1804,1807,1809,1811,1813],{"class":292,"line":300},[290,1803,1273],{"class":306},[290,1805,1806],{"class":400}," overdueSearch",[290,1808,404],{"class":306},[290,1810,657],{"class":337},[290,1812,660],{"class":333},[290,1814,663],{"class":337},[290,1816,1817,1819,1821],{"class":292,"line":313},[290,1818,1289],{"class":337},[290,1820,671],{"class":400},[290,1822,674],{"class":337},[290,1824,1825],{"class":292,"line":324},[290,1826,1827],{"class":337},"    filters: [\n",[290,1829,1830,1833,1836,1838,1841,1843,1846],{"class":292,"line":330},[290,1831,1832],{"class":337},"        [",[290,1834,1835],{"class":341},"'formulanumeric: {shipdate} - {trandate}'",[290,1837,345],{"class":337},[290,1839,1840],{"class":341},"'greaterthan'",[290,1842,345],{"class":337},[290,1844,1845],{"class":400},"30",[290,1847,737],{"class":337},[290,1849,1850],{"class":292,"line":372},[290,1851,1852],{"class":337},"    ],\n",[290,1854,1855,1857,1859,1861,1863,1865,1867,1869,1871],{"class":292,"line":378},[290,1856,1496],{"class":337},[290,1858,765],{"class":341},[290,1860,345],{"class":337},[290,1862,1579],{"class":341},[290,1864,345],{"class":337},[290,1866,750],{"class":341},[290,1868,345],{"class":337},[290,1870,760],{"class":341},[290,1872,737],{"class":337},[290,1874,1875],{"class":292,"line":394},[290,1876,592],{"class":337},[290,1878,1879],{"class":292,"line":416},[290,1880,1608],{"emptyLinePlaceholder":1607},[290,1882,1883,1885,1887,1889,1892,1894,1896,1898,1900,1902,1904,1906],{"class":292,"line":422},[290,1884,1273],{"class":306},[290,1886,1615],{"class":400},[290,1888,404],{"class":306},[290,1890,1891],{"class":337}," overdueSearch.",[290,1893,786],{"class":333},[290,1895,789],{"class":337},[290,1897,792],{"class":333},[290,1899,795],{"class":337},[290,1901,798],{"class":400},[290,1903,801],{"class":337},[290,1905,804],{"class":400},[290,1907,807],{"class":337},[290,1909,1910],{"class":292,"line":428},[290,1911,1912],{"class":296},"\u002F\u002F Only overdue orders returned - no client-side filtering needed\n",[15,1914,1915,1918],{},[269,1916,1917],{},"Performance gain:"," 60-80% faster for large result sets. The database is optimized for filtering; JavaScript is not.",[33,1920,1922],{"id":1921},"pattern-5-use-lookups-instead-of-record-loads","Pattern 5: Use Lookups Instead of Record Loads",[15,1924,1925],{},"If you only need a few fields from a record, don't load the entire record.",[15,1927,1928],{},[269,1929,1930],{},"Expensive approach:",[281,1932,1934],{"className":283,"code":1933,"language":285,"meta":286,"style":286},"\u002F\u002F BAD: Loading entire record for 2 fields\nfunction getCustomerInfo(customerId) {\n    const customer = record.load({\n        type: record.Type.CUSTOMER,\n        id: customerId\n    });\n    \n    return {\n        name: customer.getValue('companyname'),\n        email: customer.getValue('email')\n    };\n}\n\u002F\u002F Governance cost: 5-10 units\n",[162,1935,1936,1941,1955,1971,1980,1985,1989,1993,2000,2014,2028,2033,2037],{"__ignoreMap":286},[290,1937,1938],{"class":292,"line":293},[290,1939,1940],{"class":296},"\u002F\u002F BAD: Loading entire record for 2 fields\n",[290,1942,1943,1945,1948,1950,1953],{"class":292,"line":300},[290,1944,354],{"class":306},[290,1946,1947],{"class":333}," getCustomerInfo",[290,1949,357],{"class":337},[290,1951,1952],{"class":360},"customerId",[290,1954,369],{"class":337},[290,1956,1957,1959,1962,1964,1967,1969],{"class":292,"line":313},[290,1958,649],{"class":306},[290,1960,1961],{"class":400}," customer",[290,1963,404],{"class":306},[290,1965,1966],{"class":337}," record.",[290,1968,848],{"class":333},[290,1970,663],{"class":337},[290,1972,1973,1976,1978],{"class":292,"line":324},[290,1974,1975],{"class":337},"        type: record.Type.",[290,1977,945],{"class":400},[290,1979,674],{"class":337},[290,1981,1982],{"class":292,"line":330},[290,1983,1984],{"class":337},"        id: customerId\n",[290,1986,1987],{"class":292,"line":372},[290,1988,772],{"class":337},[290,1990,1991],{"class":292,"line":378},[290,1992,375],{"class":337},[290,1994,1995,1997],{"class":292,"line":394},[290,1996,583],{"class":306},[290,1998,1999],{"class":337}," {\n",[290,2001,2002,2005,2007,2009,2011],{"class":292,"line":416},[290,2003,2004],{"class":337},"        name: customer.",[290,2006,1654],{"class":333},[290,2008,357],{"class":337},[290,2010,974],{"class":341},[290,2012,2013],{"class":337},"),\n",[290,2015,2016,2019,2021,2023,2025],{"class":292,"line":422},[290,2017,2018],{"class":337},"        email: customer.",[290,2020,1654],{"class":333},[290,2022,357],{"class":337},[290,2024,979],{"class":341},[290,2026,2027],{"class":337},")\n",[290,2029,2030],{"class":292,"line":428},[290,2031,2032],{"class":337},"    };\n",[290,2034,2035],{"class":292,"line":451},[290,2036,812],{"class":337},[290,2038,2039],{"class":292,"line":456},[290,2040,2041],{"class":296},"\u002F\u002F Governance cost: 5-10 units\n",[15,2043,2044],{},[269,2045,2046],{},"Cheap approach:",[281,2048,2050],{"className":283,"code":2049,"language":285,"meta":286,"style":286},"\u002F\u002F GOOD: Lookup only the fields you need\nfunction getCustomerInfo(customerId) {\n    const fields = search.lookupFields({\n        type: search.Type.CUSTOMER,\n        id: customerId,\n        columns: ['companyname', 'email']\n    });\n    \n    return {\n        name: fields.companyname,\n        email: fields.email\n    };\n}\n\u002F\u002F Governance cost: 1 unit\n",[162,2051,2052,2057,2069,2085,2093,2098,2110,2114,2118,2124,2129,2134,2138,2142],{"__ignoreMap":286},[290,2053,2054],{"class":292,"line":293},[290,2055,2056],{"class":296},"\u002F\u002F GOOD: Lookup only the fields you need\n",[290,2058,2059,2061,2063,2065,2067],{"class":292,"line":300},[290,2060,354],{"class":306},[290,2062,1947],{"class":333},[290,2064,357],{"class":337},[290,2066,1952],{"class":360},[290,2068,369],{"class":337},[290,2070,2071,2073,2076,2078,2080,2083],{"class":292,"line":313},[290,2072,649],{"class":306},[290,2074,2075],{"class":400}," fields",[290,2077,404],{"class":306},[290,2079,657],{"class":337},[290,2081,2082],{"class":333},"lookupFields",[290,2084,663],{"class":337},[290,2086,2087,2089,2091],{"class":292,"line":324},[290,2088,668],{"class":337},[290,2090,945],{"class":400},[290,2092,674],{"class":337},[290,2094,2095],{"class":292,"line":330},[290,2096,2097],{"class":337},"        id: customerId,\n",[290,2099,2100,2102,2104,2106,2108],{"class":292,"line":372},[290,2101,747],{"class":337},[290,2103,974],{"class":341},[290,2105,345],{"class":337},[290,2107,979],{"class":341},[290,2109,737],{"class":337},[290,2111,2112],{"class":292,"line":378},[290,2113,772],{"class":337},[290,2115,2116],{"class":292,"line":394},[290,2117,375],{"class":337},[290,2119,2120,2122],{"class":292,"line":416},[290,2121,583],{"class":306},[290,2123,1999],{"class":337},[290,2125,2126],{"class":292,"line":422},[290,2127,2128],{"class":337},"        name: fields.companyname,\n",[290,2130,2131],{"class":292,"line":428},[290,2132,2133],{"class":337},"        email: fields.email\n",[290,2135,2136],{"class":292,"line":451},[290,2137,2032],{"class":337},[290,2139,2140],{"class":292,"line":456},[290,2141,812],{"class":337},[290,2143,2144],{"class":292,"line":462},[290,2145,2146],{"class":296},"\u002F\u002F Governance cost: 1 unit\n",[15,2148,2149,2152,2153,2156],{},[269,2150,2151],{},"Governance savings:"," 80-90% reduction. Use ",[162,2154,2155],{},"search.lookupFields()"," whenever you need to read (not write) record data.",[597,2158],{},[25,2160,2162],{"id":2161},"batch-processing-with-mapreduce","Batch Processing with Map\u002FReduce",[15,2164,2165],{},"For high-volume processing, Map\u002FReduce scripts are essential. They provide higher governance limits through parallel execution and automatic checkpointing.",[33,2167,2169],{"id":2168},"mapreduce-architecture","Map\u002FReduce Architecture",[15,2171,2172],{},"Map\u002FReduce scripts have four phases:",[2174,2175,2176,2183,2189,2195],"ol",{},[2177,2178,2179,2182],"li",{},[269,2180,2181],{},"getInputData",": Returns the data to process (search, query, or array)",[2177,2184,2185,2188],{},[269,2186,2187],{},"map",": Processes each input item in parallel",[2177,2190,2191,2194],{},[269,2192,2193],{},"reduce",": Groups and summarizes mapped data",[2177,2196,2197,2200],{},[269,2198,2199],{},"summarize",": Final processing and error handling",[15,2202,2203],{},"Each phase gets 10,000 governance units. Phases run in parallel workers.",[33,2205,2207],{"id":2206},"basic-mapreduce-template","Basic Map\u002FReduce Template",[281,2209,2211],{"className":283,"code":2210,"language":285,"meta":286,"style":286},"\u002F**\n * @NApiVersion 2.1\n * @NScriptType MapReduceScript\n *\u002F\ndefine(['N\u002Frecord', 'N\u002Fsearch', 'N\u002Fruntime'], function(record, search, runtime) {\n    \n    function getInputData() {\n        \u002F\u002F Return a search, array, or object\n        return search.create({\n            type: search.Type.SALES_ORDER,\n            filters: [\n                ['status', 'anyof', 'SalesOrd:B'],\n                'AND',\n                ['mainline', 'is', 'T']\n            ],\n            columns: ['entity', 'tranid', 'total']\n        });\n    }\n    \n    function map(context) {\n        const searchResult = JSON.parse(context.value);\n        const orderId = searchResult.id;\n        \n        \u002F\u002F Process individual record\n        try {\n            processOrder(orderId);\n            \n            \u002F\u002F Write to reduce phase (optional)\n            context.write({\n                key: searchResult.values.entity.value, \u002F\u002F Group by customer\n                value: orderId\n            });\n        } catch (e) {\n            log.error('Map Error', { orderId: orderId, error: e.message });\n        }\n    }\n    \n    function reduce(context) {\n        const customerId = context.key;\n        const orderIds = context.values;\n        \n        \u002F\u002F Process grouped data\n        log.audit('Customer Orders', {\n            customerId: customerId,\n            orderCount: orderIds.length\n        });\n        \n        \u002F\u002F Summarize per customer\n        updateCustomerOrderCount(customerId, orderIds.length);\n    }\n    \n    function summarize(summary) {\n        \u002F\u002F Log completion stats\n        log.audit('Map\u002FReduce Complete', {\n            inputCount: summary.inputSummary.recordCount,\n            mapErrors: summary.mapSummary.errors.length,\n            reduceErrors: summary.reduceSummary.errors.length,\n            durationMs: summary.seconds * 1000\n        });\n        \n        \u002F\u002F Handle errors\n        summary.mapSummary.errors.iterator().each(function(key, error) {\n            log.error('Map Error', { key: key, error: error });\n            return true;\n        });\n    }\n    \n    return {\n        getInputData: getInputData,\n        map: map,\n        reduce: reduce,\n        summarize: summarize\n    };\n});\n",[162,2212,2213,2217,2225,2234,2238,2276,2280,2289,2294,2305,2314,2319,2336,2343,2359,2364,2381,2385,2389,2393,2406,2427,2439,2443,2448,2455,2463,2468,2474,2485,2494,2500,2506,2518,2534,2539,2544,2549,2563,2576,2589,2594,2600,2615,2621,2630,2635,2640,2646,2660,2665,2670,2685,2691,2705,2711,2721,2731,2743,2748,2753,2759,2788,2802,2812,2817,2822,2827,2834,2840,2846,2852,2858,2863],{"__ignoreMap":286},[290,2214,2215],{"class":292,"line":293},[290,2216,297],{"class":296},[290,2218,2219,2221,2223],{"class":292,"line":300},[290,2220,303],{"class":296},[290,2222,307],{"class":306},[290,2224,310],{"class":296},[290,2226,2227,2229,2231],{"class":292,"line":313},[290,2228,303],{"class":296},[290,2230,318],{"class":306},[290,2232,2233],{"class":296}," MapReduceScript\n",[290,2235,2236],{"class":292,"line":324},[290,2237,327],{"class":296},[290,2239,2240,2242,2244,2247,2249,2252,2254,2256,2258,2260,2262,2265,2267,2270,2272,2274],{"class":292,"line":330},[290,2241,334],{"class":333},[290,2243,338],{"class":337},[290,2245,2246],{"class":341},"'N\u002Frecord'",[290,2248,345],{"class":337},[290,2250,2251],{"class":341},"'N\u002Fsearch'",[290,2253,345],{"class":337},[290,2255,342],{"class":341},[290,2257,351],{"class":337},[290,2259,354],{"class":306},[290,2261,357],{"class":337},[290,2263,2264],{"class":360},"record",[290,2266,345],{"class":337},[290,2268,2269],{"class":360},"search",[290,2271,345],{"class":337},[290,2273,361],{"class":360},[290,2275,369],{"class":337},[290,2277,2278],{"class":292,"line":372},[290,2279,375],{"class":337},[290,2281,2282,2284,2287],{"class":292,"line":378},[290,2283,381],{"class":306},[290,2285,2286],{"class":333}," getInputData",[290,2288,644],{"class":337},[290,2290,2291],{"class":292,"line":394},[290,2292,2293],{"class":296},"        \u002F\u002F Return a search, array, or object\n",[290,2295,2296,2299,2301,2303],{"class":292,"line":416},[290,2297,2298],{"class":306},"        return",[290,2300,657],{"class":337},[290,2302,660],{"class":333},[290,2304,663],{"class":337},[290,2306,2307,2310,2312],{"class":292,"line":422},[290,2308,2309],{"class":337},"            type: search.Type.",[290,2311,671],{"class":400},[290,2313,674],{"class":337},[290,2315,2316],{"class":292,"line":428},[290,2317,2318],{"class":337},"            filters: [\n",[290,2320,2321,2324,2326,2328,2330,2332,2334],{"class":292,"line":451},[290,2322,2323],{"class":337},"                [",[290,2325,687],{"class":341},[290,2327,345],{"class":337},[290,2329,692],{"class":341},[290,2331,345],{"class":337},[290,2333,697],{"class":341},[290,2335,710],{"class":337},[290,2337,2338,2341],{"class":292,"line":456},[290,2339,2340],{"class":341},"                'AND'",[290,2342,674],{"class":337},[290,2344,2345,2347,2349,2351,2353,2355,2357],{"class":292,"line":462},[290,2346,2323],{"class":337},[290,2348,724],{"class":341},[290,2350,345],{"class":337},[290,2352,729],{"class":341},[290,2354,345],{"class":337},[290,2356,734],{"class":341},[290,2358,737],{"class":337},[290,2360,2361],{"class":292,"line":470},[290,2362,2363],{"class":337},"            ],\n",[290,2365,2366,2369,2371,2373,2375,2377,2379],{"class":292,"line":475},[290,2367,2368],{"class":337},"            columns: [",[290,2370,750],{"class":341},[290,2372,345],{"class":337},[290,2374,755],{"class":341},[290,2376,345],{"class":337},[290,2378,760],{"class":341},[290,2380,737],{"class":337},[290,2382,2383],{"class":292,"line":481},[290,2384,1232],{"class":337},[290,2386,2387],{"class":292,"line":499},[290,2388,572],{"class":337},[290,2390,2391],{"class":292,"line":504},[290,2392,375],{"class":337},[290,2394,2395,2397,2400,2402,2404],{"class":292,"line":510},[290,2396,381],{"class":306},[290,2398,2399],{"class":333}," map",[290,2401,357],{"class":337},[290,2403,389],{"class":360},[290,2405,369],{"class":337},[290,2407,2408,2410,2413,2415,2418,2421,2424],{"class":292,"line":532},[290,2409,397],{"class":306},[290,2411,2412],{"class":400}," searchResult",[290,2414,404],{"class":306},[290,2416,2417],{"class":400}," JSON",[290,2419,2420],{"class":337},".",[290,2422,2423],{"class":333},"parse",[290,2425,2426],{"class":337},"(context.value);\n",[290,2428,2429,2431,2434,2436],{"class":292,"line":554},[290,2430,397],{"class":306},[290,2432,2433],{"class":400}," orderId",[290,2435,404],{"class":306},[290,2437,2438],{"class":337}," searchResult.id;\n",[290,2440,2441],{"class":292,"line":563},[290,2442,419],{"class":337},[290,2444,2445],{"class":292,"line":569},[290,2446,2447],{"class":296},"        \u002F\u002F Process individual record\n",[290,2449,2450,2453],{"class":292,"line":575},[290,2451,2452],{"class":306},"        try",[290,2454,1999],{"class":337},[290,2456,2457,2460],{"class":292,"line":580},[290,2458,2459],{"class":333},"            processOrder",[290,2461,2462],{"class":337},"(orderId);\n",[290,2464,2465],{"class":292,"line":589},[290,2466,2467],{"class":337},"            \n",[290,2469,2471],{"class":292,"line":2470},28,[290,2472,2473],{"class":296},"            \u002F\u002F Write to reduce phase (optional)\n",[290,2475,2477,2480,2483],{"class":292,"line":2476},29,[290,2478,2479],{"class":337},"            context.",[290,2481,2482],{"class":333},"write",[290,2484,663],{"class":337},[290,2486,2488,2491],{"class":292,"line":2487},30,[290,2489,2490],{"class":337},"                key: searchResult.values.entity.value, ",[290,2492,2493],{"class":296},"\u002F\u002F Group by customer\n",[290,2495,2497],{"class":292,"line":2496},31,[290,2498,2499],{"class":337},"                value: orderId\n",[290,2501,2503],{"class":292,"line":2502},32,[290,2504,2505],{"class":337},"            });\n",[290,2507,2509,2512,2515],{"class":292,"line":2508},33,[290,2510,2511],{"class":337},"        } ",[290,2513,2514],{"class":306},"catch",[290,2516,2517],{"class":337}," (e) {\n",[290,2519,2521,2523,2526,2528,2531],{"class":292,"line":2520},34,[290,2522,535],{"class":337},[290,2524,2525],{"class":333},"error",[290,2527,357],{"class":337},[290,2529,2530],{"class":341},"'Map Error'",[290,2532,2533],{"class":337},", { orderId: orderId, error: e.message });\n",[290,2535,2537],{"class":292,"line":2536},35,[290,2538,566],{"class":337},[290,2540,2542],{"class":292,"line":2541},36,[290,2543,572],{"class":337},[290,2545,2547],{"class":292,"line":2546},37,[290,2548,375],{"class":337},[290,2550,2552,2554,2557,2559,2561],{"class":292,"line":2551},38,[290,2553,381],{"class":306},[290,2555,2556],{"class":333}," reduce",[290,2558,357],{"class":337},[290,2560,389],{"class":360},[290,2562,369],{"class":337},[290,2564,2566,2568,2571,2573],{"class":292,"line":2565},39,[290,2567,397],{"class":306},[290,2569,2570],{"class":400}," customerId",[290,2572,404],{"class":306},[290,2574,2575],{"class":337}," context.key;\n",[290,2577,2579,2581,2584,2586],{"class":292,"line":2578},40,[290,2580,397],{"class":306},[290,2582,2583],{"class":400}," orderIds",[290,2585,404],{"class":306},[290,2587,2588],{"class":337}," context.values;\n",[290,2590,2592],{"class":292,"line":2591},41,[290,2593,419],{"class":337},[290,2595,2597],{"class":292,"line":2596},42,[290,2598,2599],{"class":296},"        \u002F\u002F Process grouped data\n",[290,2601,2603,2605,2607,2609,2612],{"class":292,"line":2602},43,[290,2604,431],{"class":337},[290,2606,538],{"class":333},[290,2608,357],{"class":337},[290,2610,2611],{"class":341},"'Customer Orders'",[290,2613,2614],{"class":337},", {\n",[290,2616,2618],{"class":292,"line":2617},44,[290,2619,2620],{"class":337},"            customerId: customerId,\n",[290,2622,2624,2627],{"class":292,"line":2623},45,[290,2625,2626],{"class":337},"            orderCount: orderIds.",[290,2628,2629],{"class":400},"length\n",[290,2631,2633],{"class":292,"line":2632},46,[290,2634,1232],{"class":337},[290,2636,2638],{"class":292,"line":2637},47,[290,2639,419],{"class":337},[290,2641,2643],{"class":292,"line":2642},48,[290,2644,2645],{"class":296},"        \u002F\u002F Summarize per customer\n",[290,2647,2649,2652,2655,2658],{"class":292,"line":2648},49,[290,2650,2651],{"class":333},"        updateCustomerOrderCount",[290,2653,2654],{"class":337},"(customerId, orderIds.",[290,2656,2657],{"class":400},"length",[290,2659,551],{"class":337},[290,2661,2663],{"class":292,"line":2662},50,[290,2664,572],{"class":337},[290,2666,2668],{"class":292,"line":2667},51,[290,2669,375],{"class":337},[290,2671,2673,2675,2678,2680,2683],{"class":292,"line":2672},52,[290,2674,381],{"class":306},[290,2676,2677],{"class":333}," summarize",[290,2679,357],{"class":337},[290,2681,2682],{"class":360},"summary",[290,2684,369],{"class":337},[290,2686,2688],{"class":292,"line":2687},53,[290,2689,2690],{"class":296},"        \u002F\u002F Log completion stats\n",[290,2692,2694,2696,2698,2700,2703],{"class":292,"line":2693},54,[290,2695,431],{"class":337},[290,2697,538],{"class":333},[290,2699,357],{"class":337},[290,2701,2702],{"class":341},"'Map\u002FReduce Complete'",[290,2704,2614],{"class":337},[290,2706,2708],{"class":292,"line":2707},55,[290,2709,2710],{"class":337},"            inputCount: summary.inputSummary.recordCount,\n",[290,2712,2714,2717,2719],{"class":292,"line":2713},56,[290,2715,2716],{"class":337},"            mapErrors: summary.mapSummary.errors.",[290,2718,2657],{"class":400},[290,2720,674],{"class":337},[290,2722,2724,2727,2729],{"class":292,"line":2723},57,[290,2725,2726],{"class":337},"            reduceErrors: summary.reduceSummary.errors.",[290,2728,2657],{"class":400},[290,2730,674],{"class":337},[290,2732,2734,2737,2740],{"class":292,"line":2733},58,[290,2735,2736],{"class":337},"            durationMs: summary.seconds ",[290,2738,2739],{"class":306},"*",[290,2741,2742],{"class":400}," 1000\n",[290,2744,2746],{"class":292,"line":2745},59,[290,2747,1232],{"class":337},[290,2749,2751],{"class":292,"line":2750},60,[290,2752,419],{"class":337},[290,2754,2756],{"class":292,"line":2755},61,[290,2757,2758],{"class":296},"        \u002F\u002F Handle errors\n",[290,2760,2762,2765,2768,2770,2773,2775,2777,2779,2782,2784,2786],{"class":292,"line":2761},62,[290,2763,2764],{"class":337},"        summary.mapSummary.errors.",[290,2766,2767],{"class":333},"iterator",[290,2769,789],{"class":337},[290,2771,2772],{"class":333},"each",[290,2774,357],{"class":337},[290,2776,354],{"class":306},[290,2778,357],{"class":337},[290,2780,2781],{"class":360},"key",[290,2783,345],{"class":337},[290,2785,2525],{"class":360},[290,2787,369],{"class":337},[290,2789,2791,2793,2795,2797,2799],{"class":292,"line":2790},63,[290,2792,535],{"class":337},[290,2794,2525],{"class":333},[290,2796,357],{"class":337},[290,2798,2530],{"class":341},[290,2800,2801],{"class":337},", { key: key, error: error });\n",[290,2803,2805,2807,2810],{"class":292,"line":2804},64,[290,2806,557],{"class":306},[290,2808,2809],{"class":400}," true",[290,2811,560],{"class":337},[290,2813,2815],{"class":292,"line":2814},65,[290,2816,1232],{"class":337},[290,2818,2820],{"class":292,"line":2819},66,[290,2821,572],{"class":337},[290,2823,2825],{"class":292,"line":2824},67,[290,2826,375],{"class":337},[290,2828,2830,2832],{"class":292,"line":2829},68,[290,2831,583],{"class":306},[290,2833,1999],{"class":337},[290,2835,2837],{"class":292,"line":2836},69,[290,2838,2839],{"class":337},"        getInputData: getInputData,\n",[290,2841,2843],{"class":292,"line":2842},70,[290,2844,2845],{"class":337},"        map: map,\n",[290,2847,2849],{"class":292,"line":2848},71,[290,2850,2851],{"class":337},"        reduce: reduce,\n",[290,2853,2855],{"class":292,"line":2854},72,[290,2856,2857],{"class":337},"        summarize: summarize\n",[290,2859,2861],{"class":292,"line":2860},73,[290,2862,2032],{"class":337},[290,2864,2866],{"class":292,"line":2865},74,[290,2867,592],{"class":337},[33,2869,2871],{"id":2870},"mapreduce-optimization-tips","Map\u002FReduce Optimization Tips",[15,2873,2874],{},[269,2875,2876],{},"1. Keep map functions lightweight:",[281,2878,2880],{"className":283,"code":2879,"language":285,"meta":286,"style":286},"\u002F\u002F BAD: Heavy processing in map\nfunction map(context) {\n    const orderId = JSON.parse(context.value).id;\n    const order = record.load({ type: 'salesorder', id: orderId });\n    \n    \u002F\u002F Lots of line-by-line processing\n    for (let i = 0; i \u003C order.getLineCount({ sublistId: 'item' }); i++) {\n        \u002F\u002F Complex logic per line\n    }\n    \n    order.save();\n}\n\n\u002F\u002F GOOD: Minimal map, heavy reduce\nfunction map(context) {\n    const data = JSON.parse(context.value);\n    \u002F\u002F Just write to reduce, minimal processing\n    context.write({\n        key: data.values.entity.value,\n        value: JSON.stringify({\n            orderId: data.id,\n            total: data.values.total\n        })\n    });\n}\n\nfunction reduce(context) {\n    \u002F\u002F Batch processing happens here\n    const orders = context.values.map(JSON.parse);\n    processBatch(orders);\n}\n",[162,2881,2882,2887,2899,2916,2938,2942,2947,2991,2996,3000,3004,3014,3018,3022,3027,3039,3056,3061,3070,3075,3090,3095,3100,3105,3109,3113,3117,3129,3134,3155,3163],{"__ignoreMap":286},[290,2883,2884],{"class":292,"line":293},[290,2885,2886],{"class":296},"\u002F\u002F BAD: Heavy processing in map\n",[290,2888,2889,2891,2893,2895,2897],{"class":292,"line":300},[290,2890,354],{"class":306},[290,2892,2399],{"class":333},[290,2894,357],{"class":337},[290,2896,389],{"class":360},[290,2898,369],{"class":337},[290,2900,2901,2903,2905,2907,2909,2911,2913],{"class":292,"line":313},[290,2902,649],{"class":306},[290,2904,2433],{"class":400},[290,2906,404],{"class":306},[290,2908,2417],{"class":400},[290,2910,2420],{"class":337},[290,2912,2423],{"class":333},[290,2914,2915],{"class":337},"(context.value).id;\n",[290,2917,2918,2920,2923,2925,2927,2929,2932,2935],{"class":292,"line":324},[290,2919,649],{"class":306},[290,2921,2922],{"class":400}," order",[290,2924,404],{"class":306},[290,2926,1966],{"class":337},[290,2928,848],{"class":333},[290,2930,2931],{"class":337},"({ type: ",[290,2933,2934],{"class":341},"'salesorder'",[290,2936,2937],{"class":337},", id: orderId });\n",[290,2939,2940],{"class":292,"line":330},[290,2941,375],{"class":337},[290,2943,2944],{"class":292,"line":372},[290,2945,2946],{"class":296},"    \u002F\u002F Lots of line-by-line processing\n",[290,2948,2949,2952,2954,2957,2960,2963,2966,2969,2971,2974,2977,2980,2983,2986,2989],{"class":292,"line":378},[290,2950,2951],{"class":306},"    for",[290,2953,1689],{"class":337},[290,2955,2956],{"class":306},"let",[290,2958,2959],{"class":337}," i ",[290,2961,2962],{"class":306},"=",[290,2964,2965],{"class":400}," 0",[290,2967,2968],{"class":337},"; i ",[290,2970,524],{"class":306},[290,2972,2973],{"class":337}," order.",[290,2975,2976],{"class":333},"getLineCount",[290,2978,2979],{"class":337},"({ sublistId: ",[290,2981,2982],{"class":341},"'item'",[290,2984,2985],{"class":337}," }); i",[290,2987,2988],{"class":306},"++",[290,2990,369],{"class":337},[290,2992,2993],{"class":292,"line":394},[290,2994,2995],{"class":296},"        \u002F\u002F Complex logic per line\n",[290,2997,2998],{"class":292,"line":416},[290,2999,572],{"class":337},[290,3001,3002],{"class":292,"line":422},[290,3003,375],{"class":337},[290,3005,3006,3009,3012],{"class":292,"line":428},[290,3007,3008],{"class":337},"    order.",[290,3010,3011],{"class":333},"save",[290,3013,413],{"class":337},[290,3015,3016],{"class":292,"line":451},[290,3017,812],{"class":337},[290,3019,3020],{"class":292,"line":456},[290,3021,1608],{"emptyLinePlaceholder":1607},[290,3023,3024],{"class":292,"line":462},[290,3025,3026],{"class":296},"\u002F\u002F GOOD: Minimal map, heavy reduce\n",[290,3028,3029,3031,3033,3035,3037],{"class":292,"line":470},[290,3030,354],{"class":306},[290,3032,2399],{"class":333},[290,3034,357],{"class":337},[290,3036,389],{"class":360},[290,3038,369],{"class":337},[290,3040,3041,3043,3046,3048,3050,3052,3054],{"class":292,"line":475},[290,3042,649],{"class":306},[290,3044,3045],{"class":400}," data",[290,3047,404],{"class":306},[290,3049,2417],{"class":400},[290,3051,2420],{"class":337},[290,3053,2423],{"class":333},[290,3055,2426],{"class":337},[290,3057,3058],{"class":292,"line":481},[290,3059,3060],{"class":296},"    \u002F\u002F Just write to reduce, minimal processing\n",[290,3062,3063,3066,3068],{"class":292,"line":499},[290,3064,3065],{"class":337},"    context.",[290,3067,2482],{"class":333},[290,3069,663],{"class":337},[290,3071,3072],{"class":292,"line":504},[290,3073,3074],{"class":337},"        key: data.values.entity.value,\n",[290,3076,3077,3080,3083,3085,3088],{"class":292,"line":510},[290,3078,3079],{"class":337},"        value: ",[290,3081,3082],{"class":400},"JSON",[290,3084,2420],{"class":337},[290,3086,3087],{"class":333},"stringify",[290,3089,663],{"class":337},[290,3091,3092],{"class":292,"line":532},[290,3093,3094],{"class":337},"            orderId: data.id,\n",[290,3096,3097],{"class":292,"line":554},[290,3098,3099],{"class":337},"            total: data.values.total\n",[290,3101,3102],{"class":292,"line":563},[290,3103,3104],{"class":337},"        })\n",[290,3106,3107],{"class":292,"line":569},[290,3108,772],{"class":337},[290,3110,3111],{"class":292,"line":575},[290,3112,812],{"class":337},[290,3114,3115],{"class":292,"line":580},[290,3116,1608],{"emptyLinePlaceholder":1607},[290,3118,3119,3121,3123,3125,3127],{"class":292,"line":589},[290,3120,354],{"class":306},[290,3122,2556],{"class":333},[290,3124,357],{"class":337},[290,3126,389],{"class":360},[290,3128,369],{"class":337},[290,3130,3131],{"class":292,"line":2470},[290,3132,3133],{"class":296},"    \u002F\u002F Batch processing happens here\n",[290,3135,3136,3138,3141,3143,3146,3148,3150,3152],{"class":292,"line":2476},[290,3137,649],{"class":306},[290,3139,3140],{"class":400}," orders",[290,3142,404],{"class":306},[290,3144,3145],{"class":337}," context.values.",[290,3147,2187],{"class":333},[290,3149,357],{"class":337},[290,3151,3082],{"class":400},[290,3153,3154],{"class":337},".parse);\n",[290,3156,3157,3160],{"class":292,"line":2487},[290,3158,3159],{"class":333},"    processBatch",[290,3161,3162],{"class":337},"(orders);\n",[290,3164,3165],{"class":292,"line":2496},[290,3166,812],{"class":337},[15,3168,3169],{},[269,3170,3171],{},"2. Use getInputData efficiently:",[281,3173,3175],{"className":283,"code":3174,"language":285,"meta":286,"style":286},"\u002F\u002F BAD: Loading records in getInputData\nfunction getInputData() {\n    const orders = [];\n    search.create({ type: 'salesorder' }).run().each(function(result) {\n        \u002F\u002F Don't load records here!\n        const order = record.load({ type: 'salesorder', id: result.id });\n        orders.push(order);\n        return true;\n    });\n    return orders;\n}\n\n\u002F\u002F GOOD: Return search object directly\nfunction getInputData() {\n    return search.create({\n        type: search.Type.SALES_ORDER,\n        filters: [['status', 'anyof', 'SalesOrd:B']],\n        columns: ['entity', 'tranid', 'total', 'subsidiary']\n    });\n    \u002F\u002F NetSuite handles pagination automatically\n}\n",[162,3176,3177,3182,3190,3201,3231,3236,3255,3266,3274,3278,3285,3289,3293,3298,3306,3316,3324,3340,3360,3364,3369],{"__ignoreMap":286},[290,3178,3179],{"class":292,"line":293},[290,3180,3181],{"class":296},"\u002F\u002F BAD: Loading records in getInputData\n",[290,3183,3184,3186,3188],{"class":292,"line":300},[290,3185,354],{"class":306},[290,3187,2286],{"class":333},[290,3189,644],{"class":337},[290,3191,3192,3194,3196,3198],{"class":292,"line":313},[290,3193,649],{"class":306},[290,3195,3140],{"class":400},[290,3197,404],{"class":306},[290,3199,3200],{"class":337}," [];\n",[290,3202,3203,3206,3208,3210,3212,3215,3217,3219,3221,3223,3225,3227,3229],{"class":292,"line":324},[290,3204,3205],{"class":337},"    search.",[290,3207,660],{"class":333},[290,3209,2931],{"class":337},[290,3211,2934],{"class":341},[290,3213,3214],{"class":337}," }).",[290,3216,786],{"class":333},[290,3218,789],{"class":337},[290,3220,2772],{"class":333},[290,3222,357],{"class":337},[290,3224,354],{"class":306},[290,3226,357],{"class":337},[290,3228,1033],{"class":360},[290,3230,369],{"class":337},[290,3232,3233],{"class":292,"line":330},[290,3234,3235],{"class":296},"        \u002F\u002F Don't load records here!\n",[290,3237,3238,3240,3242,3244,3246,3248,3250,3252],{"class":292,"line":372},[290,3239,397],{"class":306},[290,3241,2922],{"class":400},[290,3243,404],{"class":306},[290,3245,1966],{"class":337},[290,3247,848],{"class":333},[290,3249,2931],{"class":337},[290,3251,2934],{"class":341},[290,3253,3254],{"class":337},", id: result.id });\n",[290,3256,3257,3260,3263],{"class":292,"line":378},[290,3258,3259],{"class":337},"        orders.",[290,3261,3262],{"class":333},"push",[290,3264,3265],{"class":337},"(order);\n",[290,3267,3268,3270,3272],{"class":292,"line":394},[290,3269,2298],{"class":306},[290,3271,2809],{"class":400},[290,3273,560],{"class":337},[290,3275,3276],{"class":292,"line":416},[290,3277,772],{"class":337},[290,3279,3280,3282],{"class":292,"line":422},[290,3281,583],{"class":306},[290,3283,3284],{"class":337}," orders;\n",[290,3286,3287],{"class":292,"line":428},[290,3288,812],{"class":337},[290,3290,3291],{"class":292,"line":451},[290,3292,1608],{"emptyLinePlaceholder":1607},[290,3294,3295],{"class":292,"line":456},[290,3296,3297],{"class":296},"\u002F\u002F GOOD: Return search object directly\n",[290,3299,3300,3302,3304],{"class":292,"line":462},[290,3301,354],{"class":306},[290,3303,2286],{"class":333},[290,3305,644],{"class":337},[290,3307,3308,3310,3312,3314],{"class":292,"line":470},[290,3309,583],{"class":306},[290,3311,657],{"class":337},[290,3313,660],{"class":333},[290,3315,663],{"class":337},[290,3317,3318,3320,3322],{"class":292,"line":475},[290,3319,668],{"class":337},[290,3321,671],{"class":400},[290,3323,674],{"class":337},[290,3325,3326,3328,3330,3332,3334,3336,3338],{"class":292,"line":481},[290,3327,952],{"class":337},[290,3329,687],{"class":341},[290,3331,345],{"class":337},[290,3333,692],{"class":341},[290,3335,345],{"class":337},[290,3337,697],{"class":341},[290,3339,967],{"class":337},[290,3341,3342,3344,3346,3348,3350,3352,3354,3356,3358],{"class":292,"line":499},[290,3343,747],{"class":337},[290,3345,750],{"class":341},[290,3347,345],{"class":337},[290,3349,755],{"class":341},[290,3351,345],{"class":337},[290,3353,760],{"class":341},[290,3355,345],{"class":337},[290,3357,1402],{"class":341},[290,3359,737],{"class":337},[290,3361,3362],{"class":292,"line":504},[290,3363,772],{"class":337},[290,3365,3366],{"class":292,"line":510},[290,3367,3368],{"class":296},"    \u002F\u002F NetSuite handles pagination automatically\n",[290,3370,3371],{"class":292,"line":532},[290,3372,812],{"class":337},[15,3374,3375],{},[269,3376,3377],{},"3. Handle errors gracefully:",[281,3379,3381],{"className":283,"code":3380,"language":285,"meta":286,"style":286},"function map(context) {\n    try {\n        const result = JSON.parse(context.value);\n        processRecord(result.id);\n        context.write({ key: 'success', value: result.id });\n    } catch (e) {\n        \u002F\u002F Don't let one failure stop the batch\n        log.error('Map Error', { \n            recordId: context.key,\n            error: e.message \n        });\n        context.write({ key: 'error', value: context.key + ':' + e.message });\n    }\n}\n\nfunction summarize(summary) {\n    \u002F\u002F Count successes and failures\n    let successCount = 0;\n    let errorCount = 0;\n    \n    summary.output.iterator().each(function(key, value) {\n        if (key === 'success') successCount++;\n        if (key === 'error') errorCount++;\n        return true;\n    });\n    \n    log.audit('Processing Complete', {\n        success: successCount,\n        errors: errorCount,\n        duration: summary.seconds + ' seconds'\n    });\n    \n    \u002F\u002F Alert if error rate is high\n    if (errorCount > successCount * 0.1) { \u002F\u002F More than 10% errors\n        notifyAdmin('High error rate in Map\u002FReduce', {\n            errors: errorCount,\n            total: successCount + errorCount\n        });\n    }\n}\n",[162,3382,3383,3395,3402,3419,3427,3443,3452,3457,3470,3475,3480,3484,3510,3514,3518,3522,3534,3539,3553,3566,3570,3596,3616,3634,3642,3646,3650,3664,3669,3674,3684,3688,3692,3697,3719,3731,3736,3746,3750,3754],{"__ignoreMap":286},[290,3384,3385,3387,3389,3391,3393],{"class":292,"line":293},[290,3386,354],{"class":306},[290,3388,2399],{"class":333},[290,3390,357],{"class":337},[290,3392,389],{"class":360},[290,3394,369],{"class":337},[290,3396,3397,3400],{"class":292,"line":300},[290,3398,3399],{"class":306},"    try",[290,3401,1999],{"class":337},[290,3403,3404,3406,3409,3411,3413,3415,3417],{"class":292,"line":313},[290,3405,397],{"class":306},[290,3407,3408],{"class":400}," result",[290,3410,404],{"class":306},[290,3412,2417],{"class":400},[290,3414,2420],{"class":337},[290,3416,2423],{"class":333},[290,3418,2426],{"class":337},[290,3420,3421,3424],{"class":292,"line":324},[290,3422,3423],{"class":333},"        processRecord",[290,3425,3426],{"class":337},"(result.id);\n",[290,3428,3429,3432,3434,3437,3440],{"class":292,"line":330},[290,3430,3431],{"class":337},"        context.",[290,3433,2482],{"class":333},[290,3435,3436],{"class":337},"({ key: ",[290,3438,3439],{"class":341},"'success'",[290,3441,3442],{"class":337},", value: result.id });\n",[290,3444,3445,3448,3450],{"class":292,"line":372},[290,3446,3447],{"class":337},"    } ",[290,3449,2514],{"class":306},[290,3451,2517],{"class":337},[290,3453,3454],{"class":292,"line":378},[290,3455,3456],{"class":296},"        \u002F\u002F Don't let one failure stop the batch\n",[290,3458,3459,3461,3463,3465,3467],{"class":292,"line":394},[290,3460,431],{"class":337},[290,3462,2525],{"class":333},[290,3464,357],{"class":337},[290,3466,2530],{"class":341},[290,3468,3469],{"class":337},", { \n",[290,3471,3472],{"class":292,"line":416},[290,3473,3474],{"class":337},"            recordId: context.key,\n",[290,3476,3477],{"class":292,"line":422},[290,3478,3479],{"class":337},"            error: e.message \n",[290,3481,3482],{"class":292,"line":428},[290,3483,1232],{"class":337},[290,3485,3486,3488,3490,3492,3495,3498,3501,3504,3507],{"class":292,"line":451},[290,3487,3431],{"class":337},[290,3489,2482],{"class":333},[290,3491,3436],{"class":337},[290,3493,3494],{"class":341},"'error'",[290,3496,3497],{"class":337},", value: context.key ",[290,3499,3500],{"class":306},"+",[290,3502,3503],{"class":341}," ':'",[290,3505,3506],{"class":306}," +",[290,3508,3509],{"class":337}," e.message });\n",[290,3511,3512],{"class":292,"line":456},[290,3513,572],{"class":337},[290,3515,3516],{"class":292,"line":462},[290,3517,812],{"class":337},[290,3519,3520],{"class":292,"line":470},[290,3521,1608],{"emptyLinePlaceholder":1607},[290,3523,3524,3526,3528,3530,3532],{"class":292,"line":475},[290,3525,354],{"class":306},[290,3527,2677],{"class":333},[290,3529,357],{"class":337},[290,3531,2682],{"class":360},[290,3533,369],{"class":337},[290,3535,3536],{"class":292,"line":481},[290,3537,3538],{"class":296},"    \u002F\u002F Count successes and failures\n",[290,3540,3541,3544,3547,3549,3551],{"class":292,"line":499},[290,3542,3543],{"class":306},"    let",[290,3545,3546],{"class":337}," successCount ",[290,3548,2962],{"class":306},[290,3550,2965],{"class":400},[290,3552,560],{"class":337},[290,3554,3555,3557,3560,3562,3564],{"class":292,"line":504},[290,3556,3543],{"class":306},[290,3558,3559],{"class":337}," errorCount ",[290,3561,2962],{"class":306},[290,3563,2965],{"class":400},[290,3565,560],{"class":337},[290,3567,3568],{"class":292,"line":510},[290,3569,375],{"class":337},[290,3571,3572,3575,3577,3579,3581,3583,3585,3587,3589,3591,3594],{"class":292,"line":532},[290,3573,3574],{"class":337},"    summary.output.",[290,3576,2767],{"class":333},[290,3578,789],{"class":337},[290,3580,2772],{"class":333},[290,3582,357],{"class":337},[290,3584,354],{"class":306},[290,3586,357],{"class":337},[290,3588,2781],{"class":360},[290,3590,345],{"class":337},[290,3592,3593],{"class":360},"value",[290,3595,369],{"class":337},[290,3597,3598,3600,3603,3606,3609,3612,3614],{"class":292,"line":554},[290,3599,513],{"class":306},[290,3601,3602],{"class":337}," (key ",[290,3604,3605],{"class":306},"===",[290,3607,3608],{"class":341}," 'success'",[290,3610,3611],{"class":337},") successCount",[290,3613,2988],{"class":306},[290,3615,560],{"class":337},[290,3617,3618,3620,3622,3624,3627,3630,3632],{"class":292,"line":563},[290,3619,513],{"class":306},[290,3621,3602],{"class":337},[290,3623,3605],{"class":306},[290,3625,3626],{"class":341}," 'error'",[290,3628,3629],{"class":337},") errorCount",[290,3631,2988],{"class":306},[290,3633,560],{"class":337},[290,3635,3636,3638,3640],{"class":292,"line":569},[290,3637,2298],{"class":306},[290,3639,2809],{"class":400},[290,3641,560],{"class":337},[290,3643,3644],{"class":292,"line":575},[290,3645,772],{"class":337},[290,3647,3648],{"class":292,"line":580},[290,3649,375],{"class":337},[290,3651,3652,3655,3657,3659,3662],{"class":292,"line":589},[290,3653,3654],{"class":337},"    log.",[290,3656,538],{"class":333},[290,3658,357],{"class":337},[290,3660,3661],{"class":341},"'Processing Complete'",[290,3663,2614],{"class":337},[290,3665,3666],{"class":292,"line":2470},[290,3667,3668],{"class":337},"        success: successCount,\n",[290,3670,3671],{"class":292,"line":2476},[290,3672,3673],{"class":337},"        errors: errorCount,\n",[290,3675,3676,3679,3681],{"class":292,"line":2487},[290,3677,3678],{"class":337},"        duration: summary.seconds ",[290,3680,3500],{"class":306},[290,3682,3683],{"class":341}," ' seconds'\n",[290,3685,3686],{"class":292,"line":2496},[290,3687,772],{"class":337},[290,3689,3690],{"class":292,"line":2502},[290,3691,375],{"class":337},[290,3693,3694],{"class":292,"line":2508},[290,3695,3696],{"class":296},"    \u002F\u002F Alert if error rate is high\n",[290,3698,3699,3701,3704,3706,3708,3710,3713,3716],{"class":292,"line":2520},[290,3700,1686],{"class":306},[290,3702,3703],{"class":337}," (errorCount ",[290,3705,1775],{"class":306},[290,3707,3546],{"class":337},[290,3709,2739],{"class":306},[290,3711,3712],{"class":400}," 0.1",[290,3714,3715],{"class":337},") { ",[290,3717,3718],{"class":296},"\u002F\u002F More than 10% errors\n",[290,3720,3721,3724,3726,3729],{"class":292,"line":2536},[290,3722,3723],{"class":333},"        notifyAdmin",[290,3725,357],{"class":337},[290,3727,3728],{"class":341},"'High error rate in Map\u002FReduce'",[290,3730,2614],{"class":337},[290,3732,3733],{"class":292,"line":2541},[290,3734,3735],{"class":337},"            errors: errorCount,\n",[290,3737,3738,3741,3743],{"class":292,"line":2546},[290,3739,3740],{"class":337},"            total: successCount ",[290,3742,3500],{"class":306},[290,3744,3745],{"class":337}," errorCount\n",[290,3747,3748],{"class":292,"line":2551},[290,3749,1232],{"class":337},[290,3751,3752],{"class":292,"line":2565},[290,3753,572],{"class":337},[290,3755,3756],{"class":292,"line":2578},[290,3757,812],{"class":337},[597,3759],{},[25,3761,3763],{"id":3762},"caching-strategies","Caching Strategies",[15,3765,3766],{},"Repeated lookups kill performance. Cache data that doesn't change frequently.",[33,3768,3770],{"id":3769},"pattern-1-script-level-caching","Pattern 1: Script-Level Caching",[15,3772,3773],{},"For data used multiple times within a single script execution:",[281,3775,3777],{"className":283,"code":3776,"language":285,"meta":286,"style":286},"\u002F**\n * Script-level cache for subsidiary data\n *\u002F\nconst subsidiaryCache = {};\n\nfunction getSubsidiaryName(subsidiaryId) {\n    \u002F\u002F Check cache first\n    if (subsidiaryCache[subsidiaryId]) {\n        return subsidiaryCache[subsidiaryId];\n    }\n    \n    \u002F\u002F Cache miss - lookup and store\n    const fields = search.lookupFields({\n        type: search.Type.SUBSIDIARY,\n        id: subsidiaryId,\n        columns: ['name']\n    });\n    \n    subsidiaryCache[subsidiaryId] = fields.name;\n    return fields.name;\n}\n\nfunction processOrders(orders) {\n    orders.forEach(function(order) {\n        \u002F\u002F This lookup is cached after first call per subsidiary\n        const subName = getSubsidiaryName(order.subsidiary);\n        \u002F\u002F Process with subsidiary name\n    });\n}\n",[162,3778,3779,3783,3788,3792,3804,3808,3822,3827,3834,3841,3845,3849,3854,3868,3877,3882,3891,3895,3899,3909,3915,3919,3923,3937,3955,3960,3974,3979,3983],{"__ignoreMap":286},[290,3780,3781],{"class":292,"line":293},[290,3782,297],{"class":296},[290,3784,3785],{"class":292,"line":300},[290,3786,3787],{"class":296}," * Script-level cache for subsidiary data\n",[290,3789,3790],{"class":292,"line":313},[290,3791,327],{"class":296},[290,3793,3794,3796,3799,3801],{"class":292,"line":324},[290,3795,1273],{"class":306},[290,3797,3798],{"class":400}," subsidiaryCache",[290,3800,404],{"class":306},[290,3802,3803],{"class":337}," {};\n",[290,3805,3806],{"class":292,"line":330},[290,3807,1608],{"emptyLinePlaceholder":1607},[290,3809,3810,3812,3815,3817,3820],{"class":292,"line":372},[290,3811,354],{"class":306},[290,3813,3814],{"class":333}," getSubsidiaryName",[290,3816,357],{"class":337},[290,3818,3819],{"class":360},"subsidiaryId",[290,3821,369],{"class":337},[290,3823,3824],{"class":292,"line":378},[290,3825,3826],{"class":296},"    \u002F\u002F Check cache first\n",[290,3828,3829,3831],{"class":292,"line":394},[290,3830,1686],{"class":306},[290,3832,3833],{"class":337}," (subsidiaryCache[subsidiaryId]) {\n",[290,3835,3836,3838],{"class":292,"line":416},[290,3837,2298],{"class":306},[290,3839,3840],{"class":337}," subsidiaryCache[subsidiaryId];\n",[290,3842,3843],{"class":292,"line":422},[290,3844,572],{"class":337},[290,3846,3847],{"class":292,"line":428},[290,3848,375],{"class":337},[290,3850,3851],{"class":292,"line":451},[290,3852,3853],{"class":296},"    \u002F\u002F Cache miss - lookup and store\n",[290,3855,3856,3858,3860,3862,3864,3866],{"class":292,"line":456},[290,3857,649],{"class":306},[290,3859,2075],{"class":400},[290,3861,404],{"class":306},[290,3863,657],{"class":337},[290,3865,2082],{"class":333},[290,3867,663],{"class":337},[290,3869,3870,3872,3875],{"class":292,"line":462},[290,3871,668],{"class":337},[290,3873,3874],{"class":400},"SUBSIDIARY",[290,3876,674],{"class":337},[290,3878,3879],{"class":292,"line":470},[290,3880,3881],{"class":337},"        id: subsidiaryId,\n",[290,3883,3884,3886,3889],{"class":292,"line":475},[290,3885,747],{"class":337},[290,3887,3888],{"class":341},"'name'",[290,3890,737],{"class":337},[290,3892,3893],{"class":292,"line":481},[290,3894,772],{"class":337},[290,3896,3897],{"class":292,"line":499},[290,3898,375],{"class":337},[290,3900,3901,3904,3906],{"class":292,"line":504},[290,3902,3903],{"class":337},"    subsidiaryCache[subsidiaryId] ",[290,3905,2962],{"class":306},[290,3907,3908],{"class":337}," fields.name;\n",[290,3910,3911,3913],{"class":292,"line":510},[290,3912,583],{"class":306},[290,3914,3908],{"class":337},[290,3916,3917],{"class":292,"line":532},[290,3918,812],{"class":337},[290,3920,3921],{"class":292,"line":554},[290,3922,1608],{"emptyLinePlaceholder":1607},[290,3924,3925,3927,3930,3932,3935],{"class":292,"line":563},[290,3926,354],{"class":306},[290,3928,3929],{"class":333}," processOrders",[290,3931,357],{"class":337},[290,3933,3934],{"class":360},"orders",[290,3936,369],{"class":337},[290,3938,3939,3942,3944,3946,3948,3950,3953],{"class":292,"line":569},[290,3940,3941],{"class":337},"    orders.",[290,3943,1024],{"class":333},[290,3945,357],{"class":337},[290,3947,354],{"class":306},[290,3949,357],{"class":337},[290,3951,3952],{"class":360},"order",[290,3954,369],{"class":337},[290,3956,3957],{"class":292,"line":575},[290,3958,3959],{"class":296},"        \u002F\u002F This lookup is cached after first call per subsidiary\n",[290,3961,3962,3964,3967,3969,3971],{"class":292,"line":580},[290,3963,397],{"class":306},[290,3965,3966],{"class":400}," subName",[290,3968,404],{"class":306},[290,3970,3814],{"class":333},[290,3972,3973],{"class":337},"(order.subsidiary);\n",[290,3975,3976],{"class":292,"line":589},[290,3977,3978],{"class":296},"        \u002F\u002F Process with subsidiary name\n",[290,3980,3981],{"class":292,"line":2470},[290,3982,772],{"class":337},[290,3984,3985],{"class":292,"line":2476},[290,3986,812],{"class":337},[33,3988,3990],{"id":3989},"pattern-2-session-level-caching-with-ncache","Pattern 2: Session-Level Caching with N\u002Fcache",[15,3992,3993],{},"For data that should persist across script executions:",[281,3995,3997],{"className":283,"code":3996,"language":285,"meta":286,"style":286},"\u002F**\n * @NApiVersion 2.1\n *\u002F\ndefine(['N\u002Fcache', 'N\u002Fsearch'], function(cache, search) {\n    \n    const CACHE_NAME = 'EXCHANGE_RATES';\n    const CACHE_TTL = 3600; \u002F\u002F 1 hour in seconds\n    \n    function getExchangeRate(fromCurrency, toCurrency) {\n        const cacheKey = fromCurrency + '_' + toCurrency;\n        \n        const rateCache = cache.getCache({\n            name: CACHE_NAME,\n            scope: cache.Scope.PUBLIC\n        });\n        \n        \u002F\u002F Try to get from cache\n        let rate = rateCache.get({ key: cacheKey });\n        \n        if (rate) {\n            return parseFloat(rate);\n        }\n        \n        \u002F\u002F Cache miss - fetch from NetSuite\n        rate = fetchExchangeRate(fromCurrency, toCurrency);\n        \n        \u002F\u002F Store in cache\n        rateCache.put({\n            key: cacheKey,\n            value: rate.toString(),\n            ttl: CACHE_TTL\n        });\n        \n        return rate;\n    }\n    \n    function fetchExchangeRate(fromCurrency, toCurrency) {\n        \u002F\u002F Actual lookup logic\n        const rateSearch = search.create({\n            type: 'currencyrate',\n            filters: [\n                ['basecurrency', 'is', fromCurrency],\n                'AND',\n                ['transactioncurrency', 'is', toCurrency]\n            ],\n            columns: ['exchangerate']\n        });\n        \n        const result = rateSearch.run().getRange({ start: 0, end: 1 });\n        return result.length > 0 ? parseFloat(result[0].getValue('exchangerate')) : 1;\n    }\n    \n    return { getExchangeRate: getExchangeRate };\n});\n",[162,3998,3999,4003,4011,4015,4043,4047,4061,4079,4083,4102,4124,4128,4145,4155,4163,4167,4171,4176,4195,4199,4206,4216,4220,4224,4229,4242,4246,4251,4261,4266,4277,4285,4289,4293,4300,4304,4308,4324,4329,4344,4354,4358,4372,4378,4392,4396,4405,4409,4413,4441,4484,4488,4492,4499],{"__ignoreMap":286},[290,4000,4001],{"class":292,"line":293},[290,4002,297],{"class":296},[290,4004,4005,4007,4009],{"class":292,"line":300},[290,4006,303],{"class":296},[290,4008,307],{"class":306},[290,4010,310],{"class":296},[290,4012,4013],{"class":292,"line":313},[290,4014,327],{"class":296},[290,4016,4017,4019,4021,4024,4026,4028,4030,4032,4034,4037,4039,4041],{"class":292,"line":324},[290,4018,334],{"class":333},[290,4020,338],{"class":337},[290,4022,4023],{"class":341},"'N\u002Fcache'",[290,4025,345],{"class":337},[290,4027,2251],{"class":341},[290,4029,351],{"class":337},[290,4031,354],{"class":306},[290,4033,357],{"class":337},[290,4035,4036],{"class":360},"cache",[290,4038,345],{"class":337},[290,4040,2269],{"class":360},[290,4042,369],{"class":337},[290,4044,4045],{"class":292,"line":330},[290,4046,375],{"class":337},[290,4048,4049,4051,4054,4056,4059],{"class":292,"line":372},[290,4050,649],{"class":306},[290,4052,4053],{"class":400}," CACHE_NAME",[290,4055,404],{"class":306},[290,4057,4058],{"class":341}," 'EXCHANGE_RATES'",[290,4060,560],{"class":337},[290,4062,4063,4065,4068,4070,4073,4076],{"class":292,"line":378},[290,4064,649],{"class":306},[290,4066,4067],{"class":400}," CACHE_TTL",[290,4069,404],{"class":306},[290,4071,4072],{"class":400}," 3600",[290,4074,4075],{"class":337},"; ",[290,4077,4078],{"class":296},"\u002F\u002F 1 hour in seconds\n",[290,4080,4081],{"class":292,"line":394},[290,4082,375],{"class":337},[290,4084,4085,4087,4090,4092,4095,4097,4100],{"class":292,"line":416},[290,4086,381],{"class":306},[290,4088,4089],{"class":333}," getExchangeRate",[290,4091,357],{"class":337},[290,4093,4094],{"class":360},"fromCurrency",[290,4096,345],{"class":337},[290,4098,4099],{"class":360},"toCurrency",[290,4101,369],{"class":337},[290,4103,4104,4106,4109,4111,4114,4116,4119,4121],{"class":292,"line":422},[290,4105,397],{"class":306},[290,4107,4108],{"class":400}," cacheKey",[290,4110,404],{"class":306},[290,4112,4113],{"class":337}," fromCurrency ",[290,4115,3500],{"class":306},[290,4117,4118],{"class":341}," '_'",[290,4120,3506],{"class":306},[290,4122,4123],{"class":337}," toCurrency;\n",[290,4125,4126],{"class":292,"line":428},[290,4127,419],{"class":337},[290,4129,4130,4132,4135,4137,4140,4143],{"class":292,"line":451},[290,4131,397],{"class":306},[290,4133,4134],{"class":400}," rateCache",[290,4136,404],{"class":306},[290,4138,4139],{"class":337}," cache.",[290,4141,4142],{"class":333},"getCache",[290,4144,663],{"class":337},[290,4146,4147,4150,4153],{"class":292,"line":456},[290,4148,4149],{"class":337},"            name: ",[290,4151,4152],{"class":400},"CACHE_NAME",[290,4154,674],{"class":337},[290,4156,4157,4160],{"class":292,"line":462},[290,4158,4159],{"class":337},"            scope: cache.Scope.",[290,4161,4162],{"class":400},"PUBLIC\n",[290,4164,4165],{"class":292,"line":470},[290,4166,1232],{"class":337},[290,4168,4169],{"class":292,"line":475},[290,4170,419],{"class":337},[290,4172,4173],{"class":292,"line":481},[290,4174,4175],{"class":296},"        \u002F\u002F Try to get from cache\n",[290,4177,4178,4181,4184,4186,4189,4192],{"class":292,"line":499},[290,4179,4180],{"class":306},"        let",[290,4182,4183],{"class":337}," rate ",[290,4185,2962],{"class":306},[290,4187,4188],{"class":337}," rateCache.",[290,4190,4191],{"class":333},"get",[290,4193,4194],{"class":337},"({ key: cacheKey });\n",[290,4196,4197],{"class":292,"line":504},[290,4198,419],{"class":337},[290,4200,4201,4203],{"class":292,"line":510},[290,4202,513],{"class":306},[290,4204,4205],{"class":337}," (rate) {\n",[290,4207,4208,4210,4213],{"class":292,"line":532},[290,4209,557],{"class":306},[290,4211,4212],{"class":333}," parseFloat",[290,4214,4215],{"class":337},"(rate);\n",[290,4217,4218],{"class":292,"line":554},[290,4219,566],{"class":337},[290,4221,4222],{"class":292,"line":563},[290,4223,419],{"class":337},[290,4225,4226],{"class":292,"line":569},[290,4227,4228],{"class":296},"        \u002F\u002F Cache miss - fetch from NetSuite\n",[290,4230,4231,4234,4236,4239],{"class":292,"line":575},[290,4232,4233],{"class":337},"        rate ",[290,4235,2962],{"class":306},[290,4237,4238],{"class":333}," fetchExchangeRate",[290,4240,4241],{"class":337},"(fromCurrency, toCurrency);\n",[290,4243,4244],{"class":292,"line":580},[290,4245,419],{"class":337},[290,4247,4248],{"class":292,"line":589},[290,4249,4250],{"class":296},"        \u002F\u002F Store in cache\n",[290,4252,4253,4256,4259],{"class":292,"line":2470},[290,4254,4255],{"class":337},"        rateCache.",[290,4257,4258],{"class":333},"put",[290,4260,663],{"class":337},[290,4262,4263],{"class":292,"line":2476},[290,4264,4265],{"class":337},"            key: cacheKey,\n",[290,4267,4268,4271,4274],{"class":292,"line":2487},[290,4269,4270],{"class":337},"            value: rate.",[290,4272,4273],{"class":333},"toString",[290,4275,4276],{"class":337},"(),\n",[290,4278,4279,4282],{"class":292,"line":2496},[290,4280,4281],{"class":337},"            ttl: ",[290,4283,4284],{"class":400},"CACHE_TTL\n",[290,4286,4287],{"class":292,"line":2502},[290,4288,1232],{"class":337},[290,4290,4291],{"class":292,"line":2508},[290,4292,419],{"class":337},[290,4294,4295,4297],{"class":292,"line":2520},[290,4296,2298],{"class":306},[290,4298,4299],{"class":337}," rate;\n",[290,4301,4302],{"class":292,"line":2536},[290,4303,572],{"class":337},[290,4305,4306],{"class":292,"line":2541},[290,4307,375],{"class":337},[290,4309,4310,4312,4314,4316,4318,4320,4322],{"class":292,"line":2546},[290,4311,381],{"class":306},[290,4313,4238],{"class":333},[290,4315,357],{"class":337},[290,4317,4094],{"class":360},[290,4319,345],{"class":337},[290,4321,4099],{"class":360},[290,4323,369],{"class":337},[290,4325,4326],{"class":292,"line":2551},[290,4327,4328],{"class":296},"        \u002F\u002F Actual lookup logic\n",[290,4330,4331,4333,4336,4338,4340,4342],{"class":292,"line":2565},[290,4332,397],{"class":306},[290,4334,4335],{"class":400}," rateSearch",[290,4337,404],{"class":306},[290,4339,657],{"class":337},[290,4341,660],{"class":333},[290,4343,663],{"class":337},[290,4345,4346,4349,4352],{"class":292,"line":2578},[290,4347,4348],{"class":337},"            type: ",[290,4350,4351],{"class":341},"'currencyrate'",[290,4353,674],{"class":337},[290,4355,4356],{"class":292,"line":2591},[290,4357,2318],{"class":337},[290,4359,4360,4362,4365,4367,4369],{"class":292,"line":2596},[290,4361,2323],{"class":337},[290,4363,4364],{"class":341},"'basecurrency'",[290,4366,345],{"class":337},[290,4368,729],{"class":341},[290,4370,4371],{"class":337},", fromCurrency],\n",[290,4373,4374,4376],{"class":292,"line":2602},[290,4375,2340],{"class":341},[290,4377,674],{"class":337},[290,4379,4380,4382,4385,4387,4389],{"class":292,"line":2617},[290,4381,2323],{"class":337},[290,4383,4384],{"class":341},"'transactioncurrency'",[290,4386,345],{"class":337},[290,4388,729],{"class":341},[290,4390,4391],{"class":337},", toCurrency]\n",[290,4393,4394],{"class":292,"line":2623},[290,4395,2363],{"class":337},[290,4397,4398,4400,4403],{"class":292,"line":2632},[290,4399,2368],{"class":337},[290,4401,4402],{"class":341},"'exchangerate'",[290,4404,737],{"class":337},[290,4406,4407],{"class":292,"line":2637},[290,4408,1232],{"class":337},[290,4410,4411],{"class":292,"line":2642},[290,4412,419],{"class":337},[290,4414,4415,4417,4419,4421,4424,4426,4428,4430,4432,4434,4436,4439],{"class":292,"line":2648},[290,4416,397],{"class":306},[290,4418,3408],{"class":400},[290,4420,404],{"class":306},[290,4422,4423],{"class":337}," rateSearch.",[290,4425,786],{"class":333},[290,4427,789],{"class":337},[290,4429,792],{"class":333},[290,4431,795],{"class":337},[290,4433,798],{"class":400},[290,4435,801],{"class":337},[290,4437,4438],{"class":400},"1",[290,4440,807],{"class":337},[290,4442,4443,4445,4447,4449,4452,4454,4457,4459,4462,4464,4467,4469,4471,4473,4476,4479,4482],{"class":292,"line":2662},[290,4444,2298],{"class":306},[290,4446,1673],{"class":337},[290,4448,2657],{"class":400},[290,4450,4451],{"class":306}," >",[290,4453,2965],{"class":400},[290,4455,4456],{"class":306}," ?",[290,4458,4212],{"class":333},[290,4460,4461],{"class":337},"(result[",[290,4463,798],{"class":400},[290,4465,4466],{"class":337},"].",[290,4468,1654],{"class":333},[290,4470,357],{"class":337},[290,4472,4402],{"class":341},[290,4474,4475],{"class":337},")) ",[290,4477,4478],{"class":306},":",[290,4480,4481],{"class":400}," 1",[290,4483,560],{"class":337},[290,4485,4486],{"class":292,"line":2667},[290,4487,572],{"class":337},[290,4489,4490],{"class":292,"line":2672},[290,4491,375],{"class":337},[290,4493,4494,4496],{"class":292,"line":2687},[290,4495,583],{"class":306},[290,4497,4498],{"class":337}," { getExchangeRate: getExchangeRate };\n",[290,4500,4501],{"class":292,"line":2693},[290,4502,592],{"class":337},[15,4504,4505],{},[269,4506,4507],{},"When to use N\u002Fcache:",[4509,4510,4511,4514,4517],"ul",{},[2177,4512,4513],{},"Reference data (exchange rates, tax rates, subsidiary settings)",[2177,4515,4516],{},"Configuration values that rarely change",[2177,4518,4519],{},"Computed values that are expensive to calculate",[15,4521,4522],{},[269,4523,4524],{},"Cache TTL guidelines:",[4509,4526,4527,4530,4533],{},[2177,4528,4529],{},"Exchange rates: 1-4 hours",[2177,4531,4532],{},"Configuration: 24 hours",[2177,4534,4535],{},"Rarely-changing reference data: 1 week",[33,4537,4539],{"id":4538},"pattern-3-preload-related-data","Pattern 3: Preload Related Data",[15,4541,4542],{},"Instead of loading related records one at a time, preload them in a single search:",[281,4544,4546],{"className":283,"code":4545,"language":285,"meta":286,"style":286},"\u002F\u002F BAD: N+1 query pattern\nfunction processOrdersWithCustomers(orderIds) {\n    orderIds.forEach(function(orderId) {\n        const order = record.load({ type: 'salesorder', id: orderId });\n        const customerId = order.getValue('entity');\n        \n        \u002F\u002F Loading customer for each order - N lookups!\n        const customer = record.load({ type: 'customer', id: customerId });\n        processOrderWithCustomer(order, customer);\n    });\n}\n\n\u002F\u002F GOOD: Preload pattern\nfunction processOrdersWithCustomers(orderIds) {\n    \u002F\u002F First, get all unique customer IDs\n    const orderSearch = search.create({\n        type: search.Type.SALES_ORDER,\n        filters: [['internalid', 'anyof', orderIds]],\n        columns: ['entity']\n    });\n    \n    const customerIds = [];\n    orderSearch.run().each(function(result) {\n        const customerId = result.getValue('entity');\n        if (customerIds.indexOf(customerId) === -1) {\n            customerIds.push(customerId);\n        }\n        return true;\n    });\n    \n    \u002F\u002F Preload all customers in one search\n    const customerData = {};\n    search.create({\n        type: search.Type.CUSTOMER,\n        filters: [['internalid', 'anyof', customerIds]],\n        columns: ['companyname', 'email', 'salesrep', 'pricelevel']\n    }).run().each(function(result) {\n        customerData[result.id] = {\n            name: result.getValue('companyname'),\n            email: result.getValue('email'),\n            salesrep: result.getValue('salesrep'),\n            pricelevel: result.getValue('pricelevel')\n        };\n        return true;\n    });\n    \n    \u002F\u002F Now process orders with cached customer data\n    orderIds.forEach(function(orderId) {\n        const order = record.load({ type: 'salesorder', id: orderId });\n        const customerId = order.getValue('entity');\n        const customer = customerData[customerId]; \u002F\u002F Instant lookup\n        processOrderWithCustomer(order, customer);\n    });\n}\n",[162,4547,4548,4553,4567,4585,4603,4621,4625,4630,4650,4658,4662,4666,4670,4675,4687,4692,4706,4714,4728,4736,4740,4744,4755,4776,4794,4816,4826,4830,4838,4842,4846,4851,4862,4870,4878,4891,4912,4932,4941,4954,4967,4980,4993,4998,5006,5010,5014,5019,5035,5053,5071,5085,5091,5095],{"__ignoreMap":286},[290,4549,4550],{"class":292,"line":293},[290,4551,4552],{"class":296},"\u002F\u002F BAD: N+1 query pattern\n",[290,4554,4555,4557,4560,4562,4565],{"class":292,"line":300},[290,4556,354],{"class":306},[290,4558,4559],{"class":333}," processOrdersWithCustomers",[290,4561,357],{"class":337},[290,4563,4564],{"class":360},"orderIds",[290,4566,369],{"class":337},[290,4568,4569,4572,4574,4576,4578,4580,4583],{"class":292,"line":313},[290,4570,4571],{"class":337},"    orderIds.",[290,4573,1024],{"class":333},[290,4575,357],{"class":337},[290,4577,354],{"class":306},[290,4579,357],{"class":337},[290,4581,4582],{"class":360},"orderId",[290,4584,369],{"class":337},[290,4586,4587,4589,4591,4593,4595,4597,4599,4601],{"class":292,"line":324},[290,4588,397],{"class":306},[290,4590,2922],{"class":400},[290,4592,404],{"class":306},[290,4594,1966],{"class":337},[290,4596,848],{"class":333},[290,4598,2931],{"class":337},[290,4600,2934],{"class":341},[290,4602,2937],{"class":337},[290,4604,4605,4607,4609,4611,4613,4615,4617,4619],{"class":292,"line":330},[290,4606,397],{"class":306},[290,4608,2570],{"class":400},[290,4610,404],{"class":306},[290,4612,2973],{"class":337},[290,4614,1654],{"class":333},[290,4616,357],{"class":337},[290,4618,750],{"class":341},[290,4620,551],{"class":337},[290,4622,4623],{"class":292,"line":372},[290,4624,419],{"class":337},[290,4626,4627],{"class":292,"line":378},[290,4628,4629],{"class":296},"        \u002F\u002F Loading customer for each order - N lookups!\n",[290,4631,4632,4634,4636,4638,4640,4642,4644,4647],{"class":292,"line":394},[290,4633,397],{"class":306},[290,4635,1961],{"class":400},[290,4637,404],{"class":306},[290,4639,1966],{"class":337},[290,4641,848],{"class":333},[290,4643,2931],{"class":337},[290,4645,4646],{"class":341},"'customer'",[290,4648,4649],{"class":337},", id: customerId });\n",[290,4651,4652,4655],{"class":292,"line":416},[290,4653,4654],{"class":333},"        processOrderWithCustomer",[290,4656,4657],{"class":337},"(order, customer);\n",[290,4659,4660],{"class":292,"line":422},[290,4661,772],{"class":337},[290,4663,4664],{"class":292,"line":428},[290,4665,812],{"class":337},[290,4667,4668],{"class":292,"line":451},[290,4669,1608],{"emptyLinePlaceholder":1607},[290,4671,4672],{"class":292,"line":456},[290,4673,4674],{"class":296},"\u002F\u002F GOOD: Preload pattern\n",[290,4676,4677,4679,4681,4683,4685],{"class":292,"line":462},[290,4678,354],{"class":306},[290,4680,4559],{"class":333},[290,4682,357],{"class":337},[290,4684,4564],{"class":360},[290,4686,369],{"class":337},[290,4688,4689],{"class":292,"line":470},[290,4690,4691],{"class":296},"    \u002F\u002F First, get all unique customer IDs\n",[290,4693,4694,4696,4698,4700,4702,4704],{"class":292,"line":475},[290,4695,649],{"class":306},[290,4697,652],{"class":400},[290,4699,404],{"class":306},[290,4701,657],{"class":337},[290,4703,660],{"class":333},[290,4705,663],{"class":337},[290,4707,4708,4710,4712],{"class":292,"line":481},[290,4709,668],{"class":337},[290,4711,671],{"class":400},[290,4713,674],{"class":337},[290,4715,4716,4718,4721,4723,4725],{"class":292,"line":499},[290,4717,952],{"class":337},[290,4719,4720],{"class":341},"'internalid'",[290,4722,345],{"class":337},[290,4724,692],{"class":341},[290,4726,4727],{"class":337},", orderIds]],\n",[290,4729,4730,4732,4734],{"class":292,"line":504},[290,4731,747],{"class":337},[290,4733,750],{"class":341},[290,4735,737],{"class":337},[290,4737,4738],{"class":292,"line":510},[290,4739,772],{"class":337},[290,4741,4742],{"class":292,"line":532},[290,4743,375],{"class":337},[290,4745,4746,4748,4751,4753],{"class":292,"line":554},[290,4747,649],{"class":306},[290,4749,4750],{"class":400}," customerIds",[290,4752,404],{"class":306},[290,4754,3200],{"class":337},[290,4756,4757,4760,4762,4764,4766,4768,4770,4772,4774],{"class":292,"line":563},[290,4758,4759],{"class":337},"    orderSearch.",[290,4761,786],{"class":333},[290,4763,789],{"class":337},[290,4765,2772],{"class":333},[290,4767,357],{"class":337},[290,4769,354],{"class":306},[290,4771,357],{"class":337},[290,4773,1033],{"class":360},[290,4775,369],{"class":337},[290,4777,4778,4780,4782,4784,4786,4788,4790,4792],{"class":292,"line":569},[290,4779,397],{"class":306},[290,4781,2570],{"class":400},[290,4783,404],{"class":306},[290,4785,1673],{"class":337},[290,4787,1654],{"class":333},[290,4789,357],{"class":337},[290,4791,750],{"class":341},[290,4793,551],{"class":337},[290,4795,4796,4798,4801,4804,4807,4809,4812,4814],{"class":292,"line":575},[290,4797,513],{"class":306},[290,4799,4800],{"class":337}," (customerIds.",[290,4802,4803],{"class":333},"indexOf",[290,4805,4806],{"class":337},"(customerId) ",[290,4808,3605],{"class":306},[290,4810,4811],{"class":306}," -",[290,4813,4438],{"class":400},[290,4815,369],{"class":337},[290,4817,4818,4821,4823],{"class":292,"line":580},[290,4819,4820],{"class":337},"            customerIds.",[290,4822,3262],{"class":333},[290,4824,4825],{"class":337},"(customerId);\n",[290,4827,4828],{"class":292,"line":589},[290,4829,566],{"class":337},[290,4831,4832,4834,4836],{"class":292,"line":2470},[290,4833,2298],{"class":306},[290,4835,2809],{"class":400},[290,4837,560],{"class":337},[290,4839,4840],{"class":292,"line":2476},[290,4841,772],{"class":337},[290,4843,4844],{"class":292,"line":2487},[290,4845,375],{"class":337},[290,4847,4848],{"class":292,"line":2496},[290,4849,4850],{"class":296},"    \u002F\u002F Preload all customers in one search\n",[290,4852,4853,4855,4858,4860],{"class":292,"line":2502},[290,4854,649],{"class":306},[290,4856,4857],{"class":400}," customerData",[290,4859,404],{"class":306},[290,4861,3803],{"class":337},[290,4863,4864,4866,4868],{"class":292,"line":2508},[290,4865,3205],{"class":337},[290,4867,660],{"class":333},[290,4869,663],{"class":337},[290,4871,4872,4874,4876],{"class":292,"line":2520},[290,4873,668],{"class":337},[290,4875,945],{"class":400},[290,4877,674],{"class":337},[290,4879,4880,4882,4884,4886,4888],{"class":292,"line":2536},[290,4881,952],{"class":337},[290,4883,4720],{"class":341},[290,4885,345],{"class":337},[290,4887,692],{"class":341},[290,4889,4890],{"class":337},", customerIds]],\n",[290,4892,4893,4895,4897,4899,4901,4903,4905,4907,4910],{"class":292,"line":2541},[290,4894,747],{"class":337},[290,4896,974],{"class":341},[290,4898,345],{"class":337},[290,4900,979],{"class":341},[290,4902,345],{"class":337},[290,4904,984],{"class":341},[290,4906,345],{"class":337},[290,4908,4909],{"class":341},"'pricelevel'",[290,4911,737],{"class":337},[290,4913,4914,4916,4918,4920,4922,4924,4926,4928,4930],{"class":292,"line":2546},[290,4915,991],{"class":337},[290,4917,786],{"class":333},[290,4919,789],{"class":337},[290,4921,2772],{"class":333},[290,4923,357],{"class":337},[290,4925,354],{"class":306},[290,4927,357],{"class":337},[290,4929,1033],{"class":360},[290,4931,369],{"class":337},[290,4933,4934,4937,4939],{"class":292,"line":2551},[290,4935,4936],{"class":337},"        customerData[result.id] ",[290,4938,2962],{"class":306},[290,4940,1999],{"class":337},[290,4942,4943,4946,4948,4950,4952],{"class":292,"line":2565},[290,4944,4945],{"class":337},"            name: result.",[290,4947,1654],{"class":333},[290,4949,357],{"class":337},[290,4951,974],{"class":341},[290,4953,2013],{"class":337},[290,4955,4956,4959,4961,4963,4965],{"class":292,"line":2578},[290,4957,4958],{"class":337},"            email: result.",[290,4960,1654],{"class":333},[290,4962,357],{"class":337},[290,4964,979],{"class":341},[290,4966,2013],{"class":337},[290,4968,4969,4972,4974,4976,4978],{"class":292,"line":2591},[290,4970,4971],{"class":337},"            salesrep: result.",[290,4973,1654],{"class":333},[290,4975,357],{"class":337},[290,4977,984],{"class":341},[290,4979,2013],{"class":337},[290,4981,4982,4985,4987,4989,4991],{"class":292,"line":2596},[290,4983,4984],{"class":337},"            pricelevel: result.",[290,4986,1654],{"class":333},[290,4988,357],{"class":337},[290,4990,4909],{"class":341},[290,4992,2027],{"class":337},[290,4994,4995],{"class":292,"line":2602},[290,4996,4997],{"class":337},"        };\n",[290,4999,5000,5002,5004],{"class":292,"line":2617},[290,5001,2298],{"class":306},[290,5003,2809],{"class":400},[290,5005,560],{"class":337},[290,5007,5008],{"class":292,"line":2623},[290,5009,772],{"class":337},[290,5011,5012],{"class":292,"line":2632},[290,5013,375],{"class":337},[290,5015,5016],{"class":292,"line":2637},[290,5017,5018],{"class":296},"    \u002F\u002F Now process orders with cached customer data\n",[290,5020,5021,5023,5025,5027,5029,5031,5033],{"class":292,"line":2642},[290,5022,4571],{"class":337},[290,5024,1024],{"class":333},[290,5026,357],{"class":337},[290,5028,354],{"class":306},[290,5030,357],{"class":337},[290,5032,4582],{"class":360},[290,5034,369],{"class":337},[290,5036,5037,5039,5041,5043,5045,5047,5049,5051],{"class":292,"line":2648},[290,5038,397],{"class":306},[290,5040,2922],{"class":400},[290,5042,404],{"class":306},[290,5044,1966],{"class":337},[290,5046,848],{"class":333},[290,5048,2931],{"class":337},[290,5050,2934],{"class":341},[290,5052,2937],{"class":337},[290,5054,5055,5057,5059,5061,5063,5065,5067,5069],{"class":292,"line":2662},[290,5056,397],{"class":306},[290,5058,2570],{"class":400},[290,5060,404],{"class":306},[290,5062,2973],{"class":337},[290,5064,1654],{"class":333},[290,5066,357],{"class":337},[290,5068,750],{"class":341},[290,5070,551],{"class":337},[290,5072,5073,5075,5077,5079,5082],{"class":292,"line":2667},[290,5074,397],{"class":306},[290,5076,1961],{"class":400},[290,5078,404],{"class":306},[290,5080,5081],{"class":337}," customerData[customerId]; ",[290,5083,5084],{"class":296},"\u002F\u002F Instant lookup\n",[290,5086,5087,5089],{"class":292,"line":2672},[290,5088,4654],{"class":333},[290,5090,4657],{"class":337},[290,5092,5093],{"class":292,"line":2687},[290,5094,772],{"class":337},[290,5096,5097],{"class":292,"line":2693},[290,5098,812],{"class":337},[15,5100,5101,5103],{},[269,5102,1523],{}," Processing 500 orders with the N+1 pattern takes 45 seconds. With preloading, it takes 12 seconds—a 73% improvement.",[597,5105],{},[25,5107,5109],{"id":5108},"memory-management","Memory Management",[15,5111,5112],{},"SuiteScript runs in a constrained memory environment. Poor memory management leads to script failures.",[33,5114,5116],{"id":5115},"avoid-loading-large-arrays","Avoid Loading Large Arrays",[281,5118,5120],{"className":283,"code":5119,"language":285,"meta":286,"style":286},"\u002F\u002F BAD: Holding 50,000 results in memory\nconst allResults = [];\nsearch.create({ type: 'transaction' }).run().each(function(result) {\n    allResults.push(result);\n    return true;\n});\n\u002F\u002F allResults now holds 50,000 objects\n\n\u002F\u002F GOOD: Process and discard\nsearch.create({ type: 'transaction' }).run().each(function(result) {\n    processResult(result);\n    \u002F\u002F Result is garbage collected after this function\n    return true;\n});\n",[162,5121,5122,5127,5138,5168,5177,5185,5189,5194,5198,5203,5231,5238,5243,5251],{"__ignoreMap":286},[290,5123,5124],{"class":292,"line":293},[290,5125,5126],{"class":296},"\u002F\u002F BAD: Holding 50,000 results in memory\n",[290,5128,5129,5131,5134,5136],{"class":292,"line":300},[290,5130,1273],{"class":306},[290,5132,5133],{"class":400}," allResults",[290,5135,404],{"class":306},[290,5137,3200],{"class":337},[290,5139,5140,5143,5145,5147,5150,5152,5154,5156,5158,5160,5162,5164,5166],{"class":292,"line":313},[290,5141,5142],{"class":337},"search.",[290,5144,660],{"class":333},[290,5146,2931],{"class":337},[290,5148,5149],{"class":341},"'transaction'",[290,5151,3214],{"class":337},[290,5153,786],{"class":333},[290,5155,789],{"class":337},[290,5157,2772],{"class":333},[290,5159,357],{"class":337},[290,5161,354],{"class":306},[290,5163,357],{"class":337},[290,5165,1033],{"class":360},[290,5167,369],{"class":337},[290,5169,5170,5173,5175],{"class":292,"line":324},[290,5171,5172],{"class":337},"    allResults.",[290,5174,3262],{"class":333},[290,5176,1043],{"class":337},[290,5178,5179,5181,5183],{"class":292,"line":330},[290,5180,583],{"class":306},[290,5182,2809],{"class":400},[290,5184,560],{"class":337},[290,5186,5187],{"class":292,"line":372},[290,5188,592],{"class":337},[290,5190,5191],{"class":292,"line":378},[290,5192,5193],{"class":296},"\u002F\u002F allResults now holds 50,000 objects\n",[290,5195,5196],{"class":292,"line":394},[290,5197,1608],{"emptyLinePlaceholder":1607},[290,5199,5200],{"class":292,"line":416},[290,5201,5202],{"class":296},"\u002F\u002F GOOD: Process and discard\n",[290,5204,5205,5207,5209,5211,5213,5215,5217,5219,5221,5223,5225,5227,5229],{"class":292,"line":422},[290,5206,5142],{"class":337},[290,5208,660],{"class":333},[290,5210,2931],{"class":337},[290,5212,5149],{"class":341},[290,5214,3214],{"class":337},[290,5216,786],{"class":333},[290,5218,789],{"class":337},[290,5220,2772],{"class":333},[290,5222,357],{"class":337},[290,5224,354],{"class":306},[290,5226,357],{"class":337},[290,5228,1033],{"class":360},[290,5230,369],{"class":337},[290,5232,5233,5236],{"class":292,"line":428},[290,5234,5235],{"class":333},"    processResult",[290,5237,1043],{"class":337},[290,5239,5240],{"class":292,"line":451},[290,5241,5242],{"class":296},"    \u002F\u002F Result is garbage collected after this function\n",[290,5244,5245,5247,5249],{"class":292,"line":456},[290,5246,583],{"class":306},[290,5248,2809],{"class":400},[290,5250,560],{"class":337},[290,5252,5253],{"class":292,"line":462},[290,5254,592],{"class":337},[33,5256,5258],{"id":5257},"stream-file-processing","Stream File Processing",[15,5260,5261],{},"When processing large files, stream instead of loading entirely:",[281,5263,5265],{"className":283,"code":5264,"language":285,"meta":286,"style":286},"\u002F\u002F BAD: Load entire file into memory\nconst fileContent = file.load({ id: fileId }).getContents();\nconst lines = fileContent.split('\\n');\nlines.forEach(processLine);\n\n\u002F\u002F GOOD: Use file iterator (when available) or chunk processing\nfunction processLargeFile(fileId) {\n    const csvFile = file.load({ id: fileId });\n    const iterator = csvFile.lines.iterator();\n    \n    iterator.each(function() {\n        const line = iterator.value;\n        processLine(line);\n        return true; \u002F\u002F Continue iteration\n    });\n}\n",[162,5266,5267,5272,5294,5321,5331,5335,5340,5354,5370,5386,5390,5403,5415,5423,5434,5438],{"__ignoreMap":286},[290,5268,5269],{"class":292,"line":293},[290,5270,5271],{"class":296},"\u002F\u002F BAD: Load entire file into memory\n",[290,5273,5274,5276,5279,5281,5284,5286,5289,5292],{"class":292,"line":300},[290,5275,1273],{"class":306},[290,5277,5278],{"class":400}," fileContent",[290,5280,404],{"class":306},[290,5282,5283],{"class":337}," file.",[290,5285,848],{"class":333},[290,5287,5288],{"class":337},"({ id: fileId }).",[290,5290,5291],{"class":333},"getContents",[290,5293,413],{"class":337},[290,5295,5296,5298,5301,5303,5306,5309,5311,5314,5317,5319],{"class":292,"line":313},[290,5297,1273],{"class":306},[290,5299,5300],{"class":400}," lines",[290,5302,404],{"class":306},[290,5304,5305],{"class":337}," fileContent.",[290,5307,5308],{"class":333},"split",[290,5310,357],{"class":337},[290,5312,5313],{"class":341},"'",[290,5315,5316],{"class":400},"\\n",[290,5318,5313],{"class":341},[290,5320,551],{"class":337},[290,5322,5323,5326,5328],{"class":292,"line":324},[290,5324,5325],{"class":337},"lines.",[290,5327,1024],{"class":333},[290,5329,5330],{"class":337},"(processLine);\n",[290,5332,5333],{"class":292,"line":330},[290,5334,1608],{"emptyLinePlaceholder":1607},[290,5336,5337],{"class":292,"line":372},[290,5338,5339],{"class":296},"\u002F\u002F GOOD: Use file iterator (when available) or chunk processing\n",[290,5341,5342,5344,5347,5349,5352],{"class":292,"line":378},[290,5343,354],{"class":306},[290,5345,5346],{"class":333}," processLargeFile",[290,5348,357],{"class":337},[290,5350,5351],{"class":360},"fileId",[290,5353,369],{"class":337},[290,5355,5356,5358,5361,5363,5365,5367],{"class":292,"line":394},[290,5357,649],{"class":306},[290,5359,5360],{"class":400}," csvFile",[290,5362,404],{"class":306},[290,5364,5283],{"class":337},[290,5366,848],{"class":333},[290,5368,5369],{"class":337},"({ id: fileId });\n",[290,5371,5372,5374,5377,5379,5382,5384],{"class":292,"line":416},[290,5373,649],{"class":306},[290,5375,5376],{"class":400}," iterator",[290,5378,404],{"class":306},[290,5380,5381],{"class":337}," csvFile.lines.",[290,5383,2767],{"class":333},[290,5385,413],{"class":337},[290,5387,5388],{"class":292,"line":422},[290,5389,375],{"class":337},[290,5391,5392,5395,5397,5399,5401],{"class":292,"line":428},[290,5393,5394],{"class":337},"    iterator.",[290,5396,2772],{"class":333},[290,5398,357],{"class":337},[290,5400,354],{"class":306},[290,5402,644],{"class":337},[290,5404,5405,5407,5410,5412],{"class":292,"line":451},[290,5406,397],{"class":306},[290,5408,5409],{"class":400}," line",[290,5411,404],{"class":306},[290,5413,5414],{"class":337}," iterator.value;\n",[290,5416,5417,5420],{"class":292,"line":456},[290,5418,5419],{"class":333},"        processLine",[290,5421,5422],{"class":337},"(line);\n",[290,5424,5425,5427,5429,5431],{"class":292,"line":462},[290,5426,2298],{"class":306},[290,5428,2809],{"class":400},[290,5430,4075],{"class":337},[290,5432,5433],{"class":296},"\u002F\u002F Continue iteration\n",[290,5435,5436],{"class":292,"line":470},[290,5437,772],{"class":337},[290,5439,5440],{"class":292,"line":475},[290,5441,812],{"class":337},[33,5443,5445],{"id":5444},"clean-up-large-objects","Clean Up Large Objects",[281,5447,5449],{"className":283,"code":5448,"language":285,"meta":286,"style":286},"function processLargeDataSet(data) {\n    let tempResults = [];\n    \n    \u002F\u002F Process in chunks\n    for (let i = 0; i \u003C data.length; i += 1000) {\n        const chunk = data.slice(i, i + 1000);\n        const chunkResults = processChunk(chunk);\n        \n        \u002F\u002F Save results and clear temp\n        saveResults(chunkResults);\n        tempResults = []; \u002F\u002F Clear for garbage collection\n    }\n}\n",[162,5450,5451,5465,5476,5480,5485,5518,5541,5556,5560,5565,5573,5586,5590],{"__ignoreMap":286},[290,5452,5453,5455,5458,5460,5463],{"class":292,"line":293},[290,5454,354],{"class":306},[290,5456,5457],{"class":333}," processLargeDataSet",[290,5459,357],{"class":337},[290,5461,5462],{"class":360},"data",[290,5464,369],{"class":337},[290,5466,5467,5469,5472,5474],{"class":292,"line":300},[290,5468,3543],{"class":306},[290,5470,5471],{"class":337}," tempResults ",[290,5473,2962],{"class":306},[290,5475,3200],{"class":337},[290,5477,5478],{"class":292,"line":313},[290,5479,375],{"class":337},[290,5481,5482],{"class":292,"line":324},[290,5483,5484],{"class":296},"    \u002F\u002F Process in chunks\n",[290,5486,5487,5489,5491,5493,5495,5497,5499,5501,5503,5506,5508,5510,5513,5516],{"class":292,"line":330},[290,5488,2951],{"class":306},[290,5490,1689],{"class":337},[290,5492,2956],{"class":306},[290,5494,2959],{"class":337},[290,5496,2962],{"class":306},[290,5498,2965],{"class":400},[290,5500,2968],{"class":337},[290,5502,524],{"class":306},[290,5504,5505],{"class":337}," data.",[290,5507,2657],{"class":400},[290,5509,2968],{"class":337},[290,5511,5512],{"class":306},"+=",[290,5514,5515],{"class":400}," 1000",[290,5517,369],{"class":337},[290,5519,5520,5522,5525,5527,5529,5532,5535,5537,5539],{"class":292,"line":372},[290,5521,397],{"class":306},[290,5523,5524],{"class":400}," chunk",[290,5526,404],{"class":306},[290,5528,5505],{"class":337},[290,5530,5531],{"class":333},"slice",[290,5533,5534],{"class":337},"(i, i ",[290,5536,3500],{"class":306},[290,5538,5515],{"class":400},[290,5540,551],{"class":337},[290,5542,5543,5545,5548,5550,5553],{"class":292,"line":378},[290,5544,397],{"class":306},[290,5546,5547],{"class":400}," chunkResults",[290,5549,404],{"class":306},[290,5551,5552],{"class":333}," processChunk",[290,5554,5555],{"class":337},"(chunk);\n",[290,5557,5558],{"class":292,"line":394},[290,5559,419],{"class":337},[290,5561,5562],{"class":292,"line":416},[290,5563,5564],{"class":296},"        \u002F\u002F Save results and clear temp\n",[290,5566,5567,5570],{"class":292,"line":422},[290,5568,5569],{"class":333},"        saveResults",[290,5571,5572],{"class":337},"(chunkResults);\n",[290,5574,5575,5578,5580,5583],{"class":292,"line":428},[290,5576,5577],{"class":337},"        tempResults ",[290,5579,2962],{"class":306},[290,5581,5582],{"class":337}," []; ",[290,5584,5585],{"class":296},"\u002F\u002F Clear for garbage collection\n",[290,5587,5588],{"class":292,"line":451},[290,5589,572],{"class":337},[290,5591,5592],{"class":292,"line":456},[290,5593,812],{"class":337},[597,5595],{},[25,5597,5599],{"id":5598},"beforeafter-benchmarks","Before\u002FAfter Benchmarks",[15,5601,5602],{},"Real performance improvements from our optimizations:",[15,5604,5605],{},[609,5606],{"alt":5607,"src":5608},"Developer code review and debugging session","\u002Fimages\u002Fblog\u002Fsuitescript-performance-debugging.webp",[33,5610,5612],{"id":5611},"case-1-order-processing-script","Case 1: Order Processing Script",[15,5614,5615],{},[269,5616,5617],{},"Before optimization:",[4509,5619,5620,5623,5626],{},[2177,5621,5622],{},"Execution time: 180 seconds",[2177,5624,5625],{},"Governance used: 9,847 units",[2177,5627,5628],{},"Memory peak: 450MB",[15,5630,5631],{},[269,5632,5633],{},"Problems found:",[4509,5635,5636,5639,5642],{},[2177,5637,5638],{},"Loading full records when only 3 fields needed",[2177,5640,5641],{},"Saving records in a loop instead of batching",[2177,5643,5644],{},"No caching of subsidiary lookups",[15,5646,5647],{},[269,5648,5649],{},"After optimization:",[4509,5651,5652,5655,5658],{},[2177,5653,5654],{},"Execution time: 32 seconds",[2177,5656,5657],{},"Governance used: 2,156 units",[2177,5659,5660],{},"Memory peak: 85MB",[15,5662,5663],{},[269,5664,5665],{},"Improvement: 82% faster, 78% less governance",[33,5667,5669],{"id":5668},"case-2-inventory-sync-scheduled-script","Case 2: Inventory Sync Scheduled Script",[15,5671,5672],{},[269,5673,5617],{},[4509,5675,5676,5679,5682],{},[2177,5677,5678],{},"Processing 15,000 items took 4 hours",[2177,5680,5681],{},"Frequent timeout failures",[2177,5683,5684],{},"Required manual restart",[15,5686,5687],{},[269,5688,5633],{},[4509,5690,5691,5694,5697],{},[2177,5692,5693],{},"Sequential processing (no Map\u002FReduce)",[2177,5695,5696],{},"Querying warehouse availability one item at a time",[2177,5698,5699],{},"Recalculating same data repeatedly",[15,5701,5702],{},[269,5703,5649],{},[4509,5705,5706,5709,5712],{},[2177,5707,5708],{},"Processing 15,000 items takes 22 minutes",[2177,5710,5711],{},"Zero failures in 6 months",[2177,5713,5714],{},"Fully automated",[15,5716,5717],{},[269,5718,5719],{},"Improvement: 91% faster, 100% reliability",[33,5721,5723],{"id":5722},"case-3-customer-statement-suitelet","Case 3: Customer Statement Suitelet",[15,5725,5726],{},[269,5727,5617],{},[4509,5729,5730,5733],{},[2177,5731,5732],{},"Page load time: 12 seconds",[2177,5734,5735],{},"Users complained constantly",[15,5737,5738],{},[269,5739,5633],{},[4509,5741,5742,5745,5748],{},[2177,5743,5744],{},"Running 47 searches on page load",[2177,5746,5747],{},"Loading full customer record for display name",[2177,5749,5750],{},"No caching of static data",[15,5752,5753],{},[269,5754,5649],{},[4509,5756,5757,5760],{},[2177,5758,5759],{},"Page load time: 1.4 seconds",[2177,5761,5762],{},"User satisfaction restored",[15,5764,5765],{},[269,5766,5767],{},"Improvement: 88% faster",[597,5769],{},[25,5771,5773],{"id":5772},"performance-audit-checklist","Performance Audit Checklist",[15,5775,5776],{},"Use this checklist when reviewing SuiteScript performance:",[33,5778,5780],{"id":5779},"search-optimization","Search Optimization",[4509,5782,5785,5794,5800,5806,5812],{"className":5783},[5784],"contains-task-list",[2177,5786,5789,5793],{"className":5787},[5788],"task-list-item",[5790,5791],"input",{"disabled":1607,"type":5792},"checkbox"," Using saved searches instead of scripted where possible",[2177,5795,5797,5799],{"className":5796},[5788],[5790,5798],{"disabled":1607,"type":5792}," Returning only necessary columns",[2177,5801,5803,5805],{"className":5802},[5788],[5790,5804],{"disabled":1607,"type":5792}," Using paged data for large result sets",[2177,5807,5809,5811],{"className":5808},[5788],[5790,5810],{"disabled":1607,"type":5792}," Filtering in queries, not in JavaScript",[2177,5813,5815,5817],{"className":5814},[5788],[5790,5816],{"disabled":1607,"type":5792}," Using formula fields for calculations",[33,5819,5821],{"id":5820},"record-operations","Record Operations",[4509,5823,5825,5838,5847,5853],{"className":5824},[5784],[2177,5826,5828,5830,5831,5833,5834,5837],{"className":5827},[5788],[5790,5829],{"disabled":1607,"type":5792}," Using ",[162,5832,2082],{}," instead of ",[162,5835,5836],{},"record.load"," for reads",[2177,5839,5841,5830,5843,5846],{"className":5840},[5788],[5790,5842],{"disabled":1607,"type":5792},[162,5844,5845],{},"submitFields"," instead of load\u002Fmodify\u002Fsave where possible",[2177,5848,5850,5852],{"className":5849},[5788],[5790,5851],{"disabled":1607,"type":5792}," Batching record operations",[2177,5854,5856,5858],{"className":5855},[5788],[5790,5857],{"disabled":1607,"type":5792}," Avoiding N+1 query patterns",[33,5860,5862],{"id":5861},"governance","Governance",[4509,5864,5866,5872,5878,5884],{"className":5865},[5784],[2177,5867,5869,5871],{"className":5868},[5788],[5790,5870],{"disabled":1607,"type":5792}," Monitoring remaining usage in loops",[2177,5873,5875,5877],{"className":5874},[5788],[5790,5876],{"disabled":1607,"type":5792}," Exiting gracefully before limit",[2177,5879,5881,5883],{"className":5880},[5788],[5790,5882],{"disabled":1607,"type":5792}," Using Map\u002FReduce for high-volume processing",[2177,5885,5887,5889],{"className":5886},[5788],[5790,5888],{"disabled":1607,"type":5792}," Appropriate script type for the use case",[33,5891,5893],{"id":5892},"caching","Caching",[4509,5895,5897,5903,5909,5915],{"className":5896},[5784],[2177,5898,5900,5902],{"className":5899},[5788],[5790,5901],{"disabled":1607,"type":5792}," Script-level caching for repeated lookups",[2177,5904,5906,5908],{"className":5905},[5788],[5790,5907],{"disabled":1607,"type":5792}," N\u002Fcache for cross-execution persistence",[2177,5910,5912,5914],{"className":5911},[5788],[5790,5913],{"disabled":1607,"type":5792}," Preloading related data in batches",[2177,5916,5918,5920],{"className":5917},[5788],[5790,5919],{"disabled":1607,"type":5792}," Appropriate TTL values",[33,5922,5924],{"id":5923},"memory","Memory",[4509,5926,5928,5934,5940,5946],{"className":5927},[5784],[2177,5929,5931,5933],{"className":5930},[5788],[5790,5932],{"disabled":1607,"type":5792}," Not holding large arrays unnecessarily",[2177,5935,5937,5939],{"className":5936},[5788],[5790,5938],{"disabled":1607,"type":5792}," Processing data in streams\u002Fchunks",[2177,5941,5943,5945],{"className":5942},[5788],[5790,5944],{"disabled":1607,"type":5792}," Cleaning up temporary objects",[2177,5947,5949,5951],{"className":5948},[5788],[5790,5950],{"disabled":1607,"type":5792}," Avoiding unnecessary object creation",[597,5953],{},[25,5955,5957],{"id":5956},"frequently-asked-questions","Frequently Asked Questions",[33,5959,5961],{"id":5960},"how-do-i-know-if-my-script-has-performance-problems","How do I know if my script has performance problems?",[15,5963,5964],{},"Monitor execution time and governance usage. If a script consistently uses >80% of its governance, or takes longer than expected for its task, investigate. NetSuite's Execution Log shows both metrics.",[33,5966,5968],{"id":5967},"should-i-always-use-mapreduce-for-batch-processing","Should I always use Map\u002FReduce for batch processing?",[15,5970,5971],{},"Not always. For small batches (under 500 records), a scheduled script is simpler and sufficient. Map\u002FReduce adds complexity. Use it when you need parallel processing, higher governance limits, or automatic checkpointing for very large jobs.",[33,5973,5975],{"id":5974},"how-much-does-caching-really-help","How much does caching really help?",[15,5977,5978],{},"Significantly. We've seen scripts go from 200ms per iteration to 5ms just by caching subsidiary and currency lookups. For scripts processing thousands of records, caching turns hours into minutes.",[33,5980,5982],{"id":5981},"whats-the-biggest-performance-killer-in-suitescript","What's the biggest performance killer in SuiteScript?",[15,5984,5985,5986,5988,5989,5991,5992,5994,5995,5997],{},"Loading records when you don't need to. Every ",[162,5987,164],{}," is expensive. If you only need to read data, use ",[162,5990,2155],{},". If you only need to update a few fields, use ",[162,5993,194],{},". Reserve ",[162,5996,164],{}," for when you need the full record object.",[33,5999,6001],{"id":6000},"does-suitescript-20-perform-better-than-10","Does SuiteScript 2.0 perform better than 1.0?",[15,6003,6004],{},"Generally yes, especially for search operations and newer APIs. SuiteScript 2.x also has better async support and more efficient modules. If you're still on 1.0, migration provides performance benefits beyond just code modernization.",[597,6006],{},[25,6008,6010],{"id":6009},"next-steps","Next Steps",[15,6012,6013],{},"Optimizing SuiteScript is an iterative process. Start with the biggest problems:",[2174,6015,6016,6022,6028,6034],{},[2177,6017,6018,6021],{},[269,6019,6020],{},"Audit your slowest scripts",": Check execution logs for scripts consuming the most time and governance",[2177,6023,6024,6027],{},[269,6025,6026],{},"Apply the search optimization patterns",": This usually provides the biggest wins",[2177,6029,6030,6033],{},[269,6031,6032],{},"Implement caching",": Especially for reference data lookups",[2177,6035,6036,6039],{},[269,6037,6038],{},"Consider Map\u002FReduce for batch jobs",": If you're processing thousands of records",[15,6041,6042],{},"Performance optimization isn't a one-time task. As your data grows and processes evolve, revisit these patterns regularly.",[597,6044],{},[25,6046,6048],{"id":6047},"get-expert-help","Get Expert Help",[15,6050,6051],{},"Complex SuiteScript performance problems often require deep investigation. We've optimized scripts that seemed impossible to fix—the patterns above came from that experience.",[15,6053,6054,6055,6060],{},"If your scripts are slow, hitting governance limits, or unreliable, ",[6056,6057,6059],"a",{"href":6058},"\u002Fcontact","contact us"," for a performance audit. We'll identify the bottlenecks and provide specific, actionable recommendations.",[15,6062,6063,6064,2420],{},"For ongoing SuiteScript development needs, explore our ",[6056,6065,6067],{"href":6066},"\u002Fnetsuite-services\u002Fsuitescript-development","SuiteScript Development services",[6069,6070,6071],"style",{},"html pre.shiki code .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .s4XuR, html code.shiki .s4XuR{--shiki-default:#E36209;--shiki-dark:#FFAB70}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":286,"searchDepth":300,"depth":300,"links":6073},[6074,6079,6086,6091,6096,6101,6106,6113,6120,6121],{"id":27,"depth":300,"text":28,"children":6075},[6076,6077,6078],{"id":35,"depth":313,"text":36},{"id":135,"depth":313,"text":136},{"id":275,"depth":313,"text":276},{"id":601,"depth":300,"text":602,"children":6080},[6081,6082,6083,6084,6085],{"id":615,"depth":313,"text":616},{"id":891,"depth":313,"text":892},{"id":1249,"depth":313,"text":1250},{"id":1527,"depth":313,"text":1528},{"id":1921,"depth":313,"text":1922},{"id":2161,"depth":300,"text":2162,"children":6087},[6088,6089,6090],{"id":2168,"depth":313,"text":2169},{"id":2206,"depth":313,"text":2207},{"id":2870,"depth":313,"text":2871},{"id":3762,"depth":300,"text":3763,"children":6092},[6093,6094,6095],{"id":3769,"depth":313,"text":3770},{"id":3989,"depth":313,"text":3990},{"id":4538,"depth":313,"text":4539},{"id":5108,"depth":300,"text":5109,"children":6097},[6098,6099,6100],{"id":5115,"depth":313,"text":5116},{"id":5257,"depth":313,"text":5258},{"id":5444,"depth":313,"text":5445},{"id":5598,"depth":300,"text":5599,"children":6102},[6103,6104,6105],{"id":5611,"depth":313,"text":5612},{"id":5668,"depth":313,"text":5669},{"id":5722,"depth":313,"text":5723},{"id":5772,"depth":300,"text":5773,"children":6107},[6108,6109,6110,6111,6112],{"id":5779,"depth":313,"text":5780},{"id":5820,"depth":313,"text":5821},{"id":5861,"depth":313,"text":5862},{"id":5892,"depth":313,"text":5893},{"id":5923,"depth":313,"text":5924},{"id":5956,"depth":300,"text":5957,"children":6114},[6115,6116,6117,6118,6119],{"id":5960,"depth":313,"text":5961},{"id":5967,"depth":313,"text":5968},{"id":5974,"depth":313,"text":5975},{"id":5981,"depth":313,"text":5982},{"id":6000,"depth":313,"text":6001},{"id":6009,"depth":300,"text":6010},{"id":6047,"depth":300,"text":6048},[6123,6124],"NetSuite","SuiteScript","2026-02-02","Master SuiteScript performance with proven optimization techniques. Learn efficient search patterns, governance management, caching strategies, and batch processing with before\u002Fafter benchmarks.","md","\u002Fimages\u002Fblog\u002Fsuitescript-performance-hero.webp",{},"\u002Fblog\u002Fsuitescript-performance-optimization-writing-efficient-scripts",null,{"title":5,"description":6126},"blog\u002Fsuitescript-performance-optimization-writing-efficient-scripts",[6124,6135,5862,116,6136,6137],"Performance Optimization","NetSuite Development","API","HrgnprAhRR3S0qKdbO1sOUdOntey7aEOmivWxYJ3Jxg",[6140,6152,6163,6175,6184,6193,6203,6212,6222,6231,6240,6250,6258,6268,6276,6287,6299,6308,6311,6320,6328],{"path":6141,"title":6142,"categories":6143,"tags":6146,"heroImage":6151},"\u002Fblog\u002Fbuilding-custom-suitecommerce-extensions-developer-guide","Building Custom SuiteCommerce Extensions: A Developer's Start-to-Finish Guide",[6144,6145],"SuiteCommerce","Development",[6147,6148,6149,6124,6150],"SuiteCommerce Extensions","Custom Development","Backbone.js","Frontend Development","\u002Fimages\u002Fblog\u002Fextensions-guide-hero.webp",{"path":6153,"title":6154,"categories":6155,"tags":6157,"heroImage":6162},"\u002Fblog\u002Fcore-web-vitals-suitecommerce-optimization-checklist","Core Web Vitals for SuiteCommerce: The Complete 2026 Optimization Checklist",[6156,6144],"Performance",[6158,6159,6160,6161,6135,6144],"Core Web Vitals","LCP","INP","CLS","\u002Fimages\u002Fblog\u002Fcore-web-vitals-hero.webp",{"path":6164,"title":6165,"categories":6166,"tags":6168,"heroImage":6174},"\u002Fblog\u002Ffixing-duplicate-content-suitecommerce-faceted-navigation","Fixing Duplicate Content in SuiteCommerce Faceted Navigation",[6167,6144],"SEO",[6169,6170,6171,6172,6144,6173],"Duplicate Content","Faceted Navigation","Canonical Tags","Technical SEO","URL Parameters","\u002Fimages\u002Fblog\u002Fduplicate-content-seo-hero.webp",{"path":6176,"title":6177,"categories":6178,"tags":6179,"heroImage":6183},"\u002Fblog\u002Fheadless-suitecommerce-when-does-it-make-sense","Headless SuiteCommerce: When Does It Make Sense?",[6144,6145],[6144,6180,6181,6182,6156],"Headless Commerce","Architecture","Implementation","\u002Fimages\u002Fblog\u002Fheadless-suitecommerce-hero.webp",{"path":6185,"title":6186,"categories":6187,"tags":6189,"heroImage":6192},"\u002Fblog\u002Fnetsuite-ecommerce-integration-architecture-how-suitecommerce-works","NetSuite E-commerce Integration Architecture: How SuiteCommerce Actually Works",[6144,6145,6188],"Integration",[6181,6188,6124,6137,6190,6191],"Backend","Frontend","\u002Fimages\u002Fblog\u002Fnetsuite-ecommerce-integration-hero.webp",{"path":6194,"title":6195,"categories":6196,"tags":6197,"heroImage":6202},"\u002Fblog\u002Fnetsuite-integration-without-celigo-when-custom-beats-off-the-shelf","NetSuite Integration Without Celigo: When Custom Beats Off-the-Shelf",[6123,6188],[6198,6199,6200,96,6124,6201],"NetSuite Integration","Celigo","Custom Integration","API Development","\u002Fimages\u002Fblog\u002Fnetsuite-integration-hero.webp",{"path":6204,"title":6205,"categories":6206,"tags":6207,"heroImage":6211},"\u002Fblog\u002Fsuitecommerce-checkout-optimization-fixing-abandonment","SuiteCommerce Checkout Optimization: Fixing Abandonment at the Technical Level",[6144,6156],[6144,6208,6209,6210,6156],"Checkout Optimization","Cart Abandonment","Conversions","\u002Fimages\u002Fblog\u002Fsuitecommerce-checkout-hero.webp",{"path":6213,"title":6214,"categories":6215,"tags":6216,"heroImage":6221},"\u002Fblog\u002Fsuitecommerce-image-optimization-developer-guide","SuiteCommerce Image Optimization: A Developer's Guide",[6156,6144],[6217,6218,6219,6220,6156,6144],"Image Optimization","WebP","Lazy Loading","CDN","\u002Fimages\u002Fblog\u002Fimage-optimization-hero.webp",{"path":6223,"title":6224,"categories":6225,"tags":6226,"heroImage":6230},"\u002Fblog\u002Fsuitecommerce-implementation-cost-guide-2026","SuiteCommerce Implementation Cost Guide: What to Expect in 2026",[6144,6182],[6227,6182,6123,6228,6229],"SuiteCommerce Cost","Budget Planning","E-commerce","\u002Fimages\u002Fblog\u002Fimplementation-cost-hero.webp",{"path":6232,"title":6233,"categories":6234,"tags":6235,"heroImage":6239},"\u002Fblog\u002Fsuitecommerce-migration-checklist-upgrading-without-downtime","The SuiteCommerce Migration Checklist: Upgrading Without Downtime",[6144,6145],[6144,6236,6237,6238,6182],"Migration","Upgrade","Zero Downtime","\u002Fimages\u002Fblog\u002Fmigration-checklist-hero.webp",{"path":6241,"title":6242,"categories":6243,"tags":6244,"heroImage":6249},"\u002Fblog\u002Fsuitecommerce-myaccount-customization-b2b-features","SuiteCommerce MyAccount Customization: 10 Features B2B Customers Need",[6144,6145],[6144,6245,6246,6247,6248],"MyAccount","B2B","Customization","Portal","\u002Fimages\u002Fblog\u002Fsuitecommerce-myaccount-hero.webp",{"path":6251,"title":6252,"categories":6253,"tags":6255,"heroImage":6257},"\u002Fblog\u002Fsuitecommerce-performance-audit-286-stores","We Audited 286 Live SuiteCommerce Stores. Here's What We Found",[6156,6254,6144],"Research",[6156,6144,6158,6254,6256],"Benchmarks","\u002Fimages\u002Fblog\u002Fsuitecommerce-audit-hero.webp",{"path":6259,"title":6260,"categories":6261,"tags":6262,"heroImage":6267},"\u002Fblog\u002Fsuitecommerce-product-page-optimization-conversions-seo","How to Optimize SuiteCommerce Product Pages for Conversions and SEO",[6167,6156,6144],[6263,6264,6265,6172,6266],"Product Pages","Conversion Optimization","Schema Markup","CRO","\u002Fimages\u002Fblog\u002Fsuitecommerce-product-page-hero.webp",{"path":6269,"title":6270,"categories":6271,"tags":6272,"heroImage":6275},"\u002Fblog\u002Fsuitecommerce-seo-schema-markup-technical-guide","SuiteCommerce SEO: Schema Markup, Technical SEO, and What Actually Works",[6167,6144],[6265,6172,6273,6274,6144,6123],"JSON-LD","Structured Data","\u002Fimages\u002Fblog\u002Fseo-schema-markup-hero.webp",{"path":6277,"title":6278,"categories":6279,"tags":6281,"heroImage":6286},"\u002Fblog\u002Fsuitecommerce-theme-development-design-to-deployment","SuiteCommerce Theme Development: From Design to Deployment",[6145,6144,6280],"Themes",[6282,6283,6284,6285,6150,6247],"Theme Development","SASS","CSS","Templates","\u002Fimages\u002Fblog\u002Fsuitecommerce-theme-hero.webp",{"path":6288,"title":6289,"categories":6290,"tags":6293,"heroImage":6298},"\u002Fblog\u002Fsuitecommerce-version-upgrade-guide-2024","SuiteCommerce Version Upgrade Guide: 2023.x to 2024.x",[6144,6291,6292],"Maintenance","Upgrades",[6294,6236,6295,6296,6297],"Version Upgrade","2024 Release","SCA","Deployment","\u002Fimages\u002Fblog\u002Fsuitecommerce-upgrade-hero.webp",{"path":6300,"title":6301,"categories":6302,"tags":6303,"heroImage":6307},"\u002Fblog\u002Fsuitecommerce-vs-bigcommerce-netsuite-users","SuiteCommerce vs. BigCommerce for NetSuite Users: Which Platform Wins?",[6144,6229],[6304,6144,6123,6305,6306,6188],"BigCommerce","Platform Comparison","E-commerce Platform","\u002Fimages\u002Fblog\u002Fsuitecommerce-vs-bigcommerce-hero.webp",{"path":6130,"title":5,"categories":6309,"tags":6310,"heroImage":6128},[6123,6124],[6124,6135,5862,116,6136,6137],{"path":6312,"title":6313,"categories":6314,"tags":6315,"heroImage":6319},"\u002Fblog\u002Ftroubleshooting-suitecommerce-15-common-errors-how-to-fix","Troubleshooting SuiteCommerce: 15 Common Errors and How to Fix Them",[6144,6145],[6144,6316,6317,6318,6145],"Troubleshooting","Errors","Debugging","\u002Fimages\u002Fblog\u002Ftroubleshooting-errors-hero.webp",{"path":6321,"title":6322,"categories":6323,"tags":6324,"heroImage":6327},"\u002Fblog\u002Ftrue-cost-suitecommerce-maintenance-annual-budget-guide","The True Cost of SuiteCommerce Maintenance: Annual Budget Planning Guide",[6144,6156],[6144,6291,6228,6325,6326],"TCO","E-commerce Operations","\u002Fimages\u002Fblog\u002Fsuitecommerce-maintenance-cost-hero.webp",{"path":6329,"title":6330,"categories":6331,"tags":6332,"heroImage":6334},"\u002Fblog\u002Fwhy-suitecommerce-site-slow-how-to-fix","Why Your SuiteCommerce Site is Slow (And How to Fix It)",[6156,6144],[6156,6144,6333,6316],"Speed Optimization","\u002Fimages\u002Fblog\u002Fslow-site-fix-hero.webp",1773773966221]