
name: snowflake-developmentdescription: “Comprehensive Snowflake development assistant covering SQL best practices, data pipeline design (Dynamic Tables, Streams, Tasks, Snowpipe), Cortex AI functions, Cortex Agents, Snowpark Python, dbt integration, performance tuning, and security hardening.”category:>Snowflake 開發(fā)你是 Snowflake 開發(fā)專家。在編寫 SQL、構(gòu)建數(shù)據(jù)管道、使用 Cortex AI 或在 Snowflake 上使用 Snowpark Python 時(shí)應(yīng)用這些規(guī)則。何時(shí)使用當(dāng)用戶請求有關(guān) Snowflake SQL、數(shù)據(jù)管道、Cortex AI 或 Snowpark Python 的幫助時(shí)。當(dāng)你需要針對 dbt、性能調(diào)優(yōu)或安全加固的 Snowflake 特定指導(dǎo)時(shí)。SQL 最佳實(shí)踐命名與風(fēng)格對所有標(biāo)識符使用snake_case。避免使用雙引號標(biāo)識符——它們會(huì)創(chuàng)建區(qū)分大小寫的名稱需要不斷加引號。使用 CTEWITH子句而不是嵌套子查詢。使用CREATE OR REPLACE實(shí)現(xiàn)冪等的 DDL。使用顯式列列表——生產(chǎn)環(huán)境中絕不要使用SELECT *Snowflake 的列式存儲(chǔ)只掃描引用的列。存儲(chǔ)過程——冒號前綴規(guī)則在 SQL 存儲(chǔ)過程BEGIN…END 塊中變量和參數(shù)必須在 SQL 語句內(nèi)使用冒號:前綴。否則Snowflake 會(huì)報(bào)標(biāo)識符無效錯(cuò)誤。錯(cuò)誤示例CREATEPROCEDUREmy_proc(p_idINT)RETURNSSTRINGLANGUAGESQLASBEGINLET result STRING;SELECTnameINTOresultFROMusersWHEREidp_id;RETURNresult;END;正確示例CREATEPROCEDUREmy_proc(p_idINT)RETURNSSTRINGLANGUAGESQLASBEGINLET result STRING;SELECTnameINTO:resultFROMusersWHEREid:p_id;RETURNresult;END;半結(jié)構(gòu)化數(shù)據(jù)使用 VARIANT、OBJECT、ARRAY 處理 JSON/Avro/Parquet/ORC。訪問嵌套字段src:customer.name::STRING。始終進(jìn)行類型轉(zhuǎn)換src:price::NUMBER(10,2)。VARIANT 的 null 與 SQL NULL 的區(qū)別JSON 的null存儲(chǔ)為null。加載時(shí)使用STRIP_NULL_VALUE TRUE。展開數(shù)組SELECT f.value:name::STRING FROM my_table, LATERAL FLATTEN(input src:items) f;使用 MERGE 進(jìn)行更新插入MERGEINTOtarget tUSINGsource sONt.ids.idWHENMATCHEDTHENUPDATESETt.names.name,t.updated_atCURRENT_TIMESTAMP()WHENNOTMATCHEDTHENINSERT(id,name,updated_at)VALUES(s.id,s.name,CURRENT_TIMESTAMP());數(shù)據(jù)管道選擇你的方法方法何時(shí)使用動(dòng)態(tài)表Dynamic Tables聲明式轉(zhuǎn)換。默認(rèn)選擇。定義查詢Snowflake 負(fù)責(zé)刷新。流 任務(wù)Streams Tasks命令式 CDC。用于過程邏輯、存儲(chǔ)過程調(diào)用。Snowpipe從 S3/GCS/Azure 持續(xù)加載文件。動(dòng)態(tài)表CREATEORREPLACEDYNAMICTABLEcleaned_events TARGET_LAG5 minutesWAREHOUSEtransform_whASSELECTevent_id,event_type,user_id,event_timestampFROMraw_eventsWHEREevent_typeISNOTNULL;關(guān)鍵規(guī)則逐步設(shè)置TARGET_LAG上游更緊下游更松。增量動(dòng)態(tài)表不能依賴于全量刷新動(dòng)態(tài)表。模式更改會(huì)破壞SELECT *——請使用顯式列列表?;A(chǔ)表必須保持啟用更改跟蹤。兩個(gè)動(dòng)態(tài)表之間不能放置視圖。流和任務(wù)CREATEORREPLACESTREAM raw_streamONTABLEraw_events;CREATEORREPLACETASK process_events WAREHOUSEtransform_wh SCHEDULEUSING CRON 0 */1 * * * America/Los_AngelesWHENSYSTEM$STREAM_HAS_DATA(raw_stream)ASINSERTINTOcleaned_eventsSELECT...FROMraw_stream;-- 任務(wù)默認(rèn)處于 SUSPENDED 狀態(tài)——你必須恢復(fù)它們ALTERTASK process_events RESUME;Cortex AI函數(shù)參考函數(shù)用途AI_COMPLETELLM 補(bǔ)全文本、圖像、文檔AI_CLASSIFY分類到類別中最多 500 個(gè)標(biāo)簽AI_FILTER對文本/圖像進(jìn)行布爾過濾AI_EXTRACT從文本/圖像/文檔中結(jié)構(gòu)化提取AI_SENTIMENT情感評分-1 到 1AI_PARSE_DOCUMENTOCR 或版面提取AI_REDACTPII 移除已棄用請勿使用COMPLETE、CLASSIFY_TEXT、EXTRACT_ANSWER、PARSE_DOCUMENT、SUMMARIZE、TRANSLATE、SENTIMENT、EMBED_TEXT_768。TO_FILE —— 常見錯(cuò)誤來源階段路徑和文件名是獨(dú)立的參數(shù)-- 錯(cuò)誤TO_FILE(stage/file.pdf)-- 正確TO_FILE(db.schema.mystage,invoice.pdf)使用 AI_CLASSIFY 進(jìn)行分類而不是 AI_COMPLETESELECTAI_CLASSIFY(ticket_text,[billing,technical,account]):labels[0]::VARCHARAScategoryFROMtickets;Cortex 智能體AgentsCREATEORREPLACEAGENT my_db.my_schema.sales_agentFROMSPECIFICATION $spec$ {models: {orchestration:auto},instructions: {orchestration:You are SalesBot...,response:Be concise.},tools:[{tool_spec: {type:cortex_analyst_text_to_sql,name:Sales,description:Queries sales...}}],tool_resources: {Sales: {semantic_model_file:stage/model.yaml}} } $spec$;智能體規(guī)則使用$spec$分隔符而不是$$。models必須是對象而不是數(shù)組。tool_resources是獨(dú)立的頂層對象不要嵌套在 tools 中。編輯規(guī)范中不要包含空/null 值——這會(huì)清除現(xiàn)有值。工具描述是頭號質(zhì)量因素。絕不要直接修改生產(chǎn)智能體——先克隆。Snowpark Pythonfromsnowflake.snowparkimportSessionimportos sessionSession.builder.configs({account:os.environ[SNOWFLAKE_ACCOUNT],user:os.environ[SNOWFLAKE_USER],password:os.environ[SNOWFLAKE_PASSWORD],role:my_role,warehouse:my_wh,database:my_db,schema:my_schema}).create()絕不要硬編碼憑據(jù)。DataFrame 是惰性的——在collect()/show()時(shí)執(zhí)行。不要對大型 DataFrame 使用collect()——在服務(wù)端處理。對于批處理/ML 工作負(fù)載使用向量化 UDF快 10-100 倍而不是標(biāo)量 UDF。dbt on Snowflake動(dòng)態(tài)表物化流式/近實(shí)時(shí)數(shù)據(jù)集市{{ config(materializeddynamic_table,snowflake_warehousetransforming,target_lag1 hour)}}增量物化大型事實(shí)表{{ config(materializedincremental,unique_keyevent_id)}}Snowflake 特定配置可與任何物化方式組合{{ config(transienttrue,copy_grantstrue,query_tagteam_daily)}}不要在沒有{% if is_incremental() %}保護(hù)的情況下使用{{ this }}。對流式/近實(shí)時(shí)數(shù)據(jù)集市使用dynamic_table物化。性能聚類鍵Cluster keys僅用于多 TB 級表用在 WHERE/JOIN/GROUP BY 列上。搜索優(yōu)化Search OptimizationALTER TABLE t ADD SEARCH OPTIMIZATION ON EQUALITY(col);倉庫大小從 X-Small 開始再向上擴(kuò)展。AUTO_SUSPEND 60AUTO_RESUME TRUE。每個(gè)工作負(fù)載使用獨(dú)立的倉庫。先估算 AI 成本SELECT SUM(AI_COUNT_TOKENS(claude-4-sonnet, text)) FROM table;安全遵循最小權(quán)限 RBAC。使用數(shù)據(jù)庫角色進(jìn)行對象級授權(quán)。定期審計(jì) ACCOUNTADMINSHOW GRANTS OF ROLE ACCOUNTADMIN;使用網(wǎng)絡(luò)策略進(jìn)行 IP 白名單管理。對 PII 列使用掩碼策略對多租戶隔離使用行訪問策略。常見錯(cuò)誤模式錯(cuò)誤原因修復(fù)“對象不存在”上下文錯(cuò)誤或缺少授權(quán)完全限定名稱檢查授權(quán)存儲(chǔ)過程中的標(biāo)識符無效缺少冒號前綴使用:variable_name“無法識別數(shù)值”VARIANT 未轉(zhuǎn)換src:field::NUMBER(10,2)任務(wù)未運(yùn)行忘記恢復(fù)ALTER TASK ... RESUME動(dòng)態(tài)表刷新失敗模式更改或跟蹤被禁用使用顯式列檢查更改跟蹤限制僅當(dāng)任務(wù)明確符合上述范圍時(shí)使用此技能。不要將輸出視為特定環(huán)境驗(yàn)證、測試或?qū)<覍彶榈奶娲?。如果缺少必需的輸入、?quán)限、安全邊界或成功標(biāo)準(zhǔn)請停下來詢問澄清。