
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、構建數(shù)據管道、使用 Cortex AI 或在 Snowflake 上使用 Snowpark Python 時應用這些規(guī)則。何時使用當用戶請求有關 Snowflake SQL、數(shù)據管道、Cortex AI 或 Snowpark Python 的幫助時。當你需要針對 dbt、性能調優(yōu)或安全加固的 Snowflake 特定指導時。SQL 最佳實踐命名與風格對所有標識符使用snake_case。避免使用雙引號標識符——它們會創(chuàng)建區(qū)分大小寫的名稱需要不斷加引號。使用 CTEWITH子句而不是嵌套子查詢。使用CREATE OR REPLACE實現(xiàn)冪等的 DDL。使用顯式列列表——生產環(huán)境中絕不要使用SELECT *Snowflake 的列式存儲只掃描引用的列。存儲過程——冒號前綴規(guī)則在 SQL 存儲過程BEGIN…END 塊中變量和參數(shù)必須在 SQL 語句內使用冒號:前綴。否則Snowflake 會報標識符無效錯誤。錯誤示例CREATEPROCEDUREmy_proc(p_idINT)RETURNSSTRINGLANGUAGESQLASBEGINLET result STRING;SELECTnameINTOresultFROMusersWHEREidp_id;RETURNresult;END;正確示例CREATEPROCEDUREmy_proc(p_idINT)RETURNSSTRINGLANGUAGESQLASBEGINLET result STRING;SELECTnameINTO:resultFROMusersWHEREid:p_id;RETURNresult;END;半結構化數(shù)據使用 VARIANT、OBJECT、ARRAY 處理 JSON/Avro/Parquet/ORC。訪問嵌套字段src:customer.name::STRING。始終進行類型轉換src:price::NUMBER(10,2)。VARIANT 的 null 與 SQL NULL 的區(qū)別JSON 的null存儲為null。加載時使用STRIP_NULL_VALUE TRUE。展開數(shù)組SELECT f.value:name::STRING FROM my_table, LATERAL FLATTEN(input src:items) f;使用 MERGE 進行更新插入MERGEINTOtarget tUSINGsource sONt.ids.idWHENMATCHEDTHENUPDATESETt.names.name,t.updated_atCURRENT_TIMESTAMP()WHENNOTMATCHEDTHENINSERT(id,name,updated_at)VALUES(s.id,s.name,CURRENT_TIMESTAMP());數(shù)據管道選擇你的方法方法何時使用動態(tài)表Dynamic Tables聲明式轉換。默認選擇。定義查詢Snowflake 負責刷新。流 任務Streams Tasks命令式 CDC。用于過程邏輯、存儲過程調用。Snowpipe從 S3/GCS/Azure 持續(xù)加載文件。動態(tài)表CREATEORREPLACEDYNAMICTABLEcleaned_events TARGET_LAG5 minutesWAREHOUSEtransform_whASSELECTevent_id,event_type,user_id,event_timestampFROMraw_eventsWHEREevent_typeISNOTNULL;關鍵規(guī)則逐步設置TARGET_LAG上游更緊下游更松。增量動態(tài)表不能依賴于全量刷新動態(tài)表。模式更改會破壞SELECT *——請使用顯式列列表。基礎表必須保持啟用更改跟蹤。兩個動態(tài)表之間不能放置視圖。流和任務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;-- 任務默認處于 SUSPENDED 狀態(tài)——你必須恢復它們ALTERTASK process_events RESUME;Cortex AI函數(shù)參考函數(shù)用途AI_COMPLETELLM 補全文本、圖像、文檔AI_CLASSIFY分類到類別中最多 500 個標簽AI_FILTER對文本/圖像進行布爾過濾AI_EXTRACT從文本/圖像/文檔中結構化提取AI_SENTIMENT情感評分-1 到 1AI_PARSE_DOCUMENTOCR 或版面提取AI_REDACTPII 移除已棄用請勿使用COMPLETE、CLASSIFY_TEXT、EXTRACT_ANSWER、PARSE_DOCUMENT、SUMMARIZE、TRANSLATE、SENTIMENT、EMBED_TEXT_768。TO_FILE —— 常見錯誤來源階段路徑和文件名是獨立的參數(shù)-- 錯誤TO_FILE(stage/file.pdf)-- 正確TO_FILE(db.schema.mystage,invoice.pdf)使用 AI_CLASSIFY 進行分類而不是 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是獨立的頂層對象不要嵌套在 tools 中。編輯規(guī)范中不要包含空/null 值——這會清除現(xià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()絕不要硬編碼憑據。DataFrame 是惰性的——在collect()/show()時執(zhí)行。不要對大型 DataFrame 使用collect()——在服務端處理。對于批處理/ML 工作負載使用向量化 UDF快 10-100 倍而不是標量 UDF。dbt on Snowflake動態(tài)表物化流式/近實時數(shù)據集市{{ config(materializeddynamic_table,snowflake_warehousetransforming,target_lag1 hour)}}增量物化大型事實表{{ config(materializedincremental,unique_keyevent_id)}}Snowflake 特定配置可與任何物化方式組合{{ config(transienttrue,copy_grantstrue,query_tagteam_daily)}}不要在沒有{% if is_incremental() %}保護的情況下使用{{ this }}。對流式/近實時數(shù)據集市使用dynamic_table物化。性能聚類鍵Cluster keys僅用于多 TB 級表用在 WHERE/JOIN/GROUP BY 列上。搜索優(yōu)化Search OptimizationALTER TABLE t ADD SEARCH OPTIMIZATION ON EQUALITY(col);倉庫大小從 X-Small 開始再向上擴展。AUTO_SUSPEND 60AUTO_RESUME TRUE。每個工作負載使用獨立的倉庫。先估算 AI 成本SELECT SUM(AI_COUNT_TOKENS(claude-4-sonnet, text)) FROM table;安全遵循最小權限 RBAC。使用數(shù)據庫角色進行對象級授權。定期審計 ACCOUNTADMINSHOW GRANTS OF ROLE ACCOUNTADMIN;使用網絡策略進行 IP 白名單管理。對 PII 列使用掩碼策略對多租戶隔離使用行訪問策略。常見錯誤模式錯誤原因修復“對象不存在”上下文錯誤或缺少授權完全限定名稱檢查授權存儲過程中的標識符無效缺少冒號前綴使用:variable_name“無法識別數(shù)值”VARIANT 未轉換src:field::NUMBER(10,2)任務未運行忘記恢復ALTER TASK ... RESUME動態(tài)表刷新失敗模式更改或跟蹤被禁用使用顯式列檢查更改跟蹤限制僅當任務明確符合上述范圍時使用此技能。不要將輸出視為特定環(huán)境驗證、測試或專家審查的替代品。如果缺少必需的輸入、權限、安全邊界或成功標準請停下來詢問澄清。