探討資料庫查詢語言中使用遞迴時發生的「非終止」問題,以及控制此問題的評估策略之重要性。
想像一下。您請秘書幫您「找出所有最親近朋友的朋友」。秘書會查看朋友的名單,然後再次檢查那些朋友的朋友名單。但如果朋友之間的關係形成一個循環結構,不斷循環下去,會發生什麼事呢?秘書可能會一輩子都在處理這項工作而無法下班,而您也可能永遠聽不到結果。
電腦科學中也會發生類似的情況。當我們用於從資料庫擷取資訊的「查詢語言(Query Language,用於檢視或操作資料的語言)」加入了「遞迴(Recursion,一種再次呼叫自身的機制)」這個強大工具時,程式經常會出現無法結束而停滯的現象。電腦科學家稱之為「非終止(nontermination)」問題。
這為何重要?
我們日常使用的智慧型手機應用程式或網路服務,都在看不見的地方執行著無數的資料庫查詢。如果這些查詢無法正常結束,持續佔用系統資源,應用程式就會「當機」。
特別是現今的 AI 服務或推薦系統,為了理解人際關係或資訊的連結,需要處理更複雜的資料結構。資料越是複雜地交織在一起,電腦決定「從何處、如何處理工作」的順序,就成為決定服務穩定性的關鍵問題。
輕鬆理解:評估順序的奧秘
簡單來說,電腦處理指令的方式,也就是「評估策略(Evaluation Strategy,計算表達式的規則)」,就像廚師決定烹飪順序一樣。 出處 14
舉例來說,假設我們要準備料理來招待三位朋友。
- 由左至右 (left-to-right):無條件按照菜單順序一道一道地烹飪。
- 非決定性 (nondeterministic):按照食材準備好的順序,從手邊有的東西開始烹飪。
- 並行 ‘and’:同時開始製作三道菜,稍微一起進行。
在查詢語言中,若包含遞迴,資料的掃描順序就變得非常重要。就像料理的順序決定了食物能否完成,或只是材料胡亂混合一樣,查詢也取決於使用的策略,有可能成功給出答案,也有可能陷入無限迴圈。 出處 1, 出處 3
在傳統資料庫的世界裡,其實沒有這麼多關於這個問題的煩惱。像是 SQL(傳統資料庫語言)這類查詢是「聲明式(declarative)」的。也就是說,使用者僅要求「請給我這種資料」,資料庫引擎就會自行決定最有效率的順序來擷取,執行順序問題就成了系統的責任。 出處 10
然而,隨著開始處理遞迴,情況變得複雜。遞迴會不斷地再次呼叫自身,若未能妥善管理,便會無限地自我呼叫。為了解決此問題,學界正透過由左至右、非決定性以及並行 ‘and’ 等多種評估策略,研究「如何才能停止」。 出處 2, 出處 3
現況:進展到哪裡了?
目前我們在查詢語言的「效率」與「穩定性」之間進行權衡。資料庫引擎為了提升效能,會最佳化物理執行順序,但在此過程中仍需精確維持邏輯上的結果。 出處 8 查詢語言的設計者們正在精煉複雜的規則,以確保使用者編寫的程式碼不會陷入無限迴圈,同時也能盡可能快速地返回結果。 [出處 9](https://www.ijert.org/a-novel-evaluation—-
layout: post title: “AI가 답을 찾지 못하고 헤맨다면? 쿼리 언어의 ‘순서’ 이야기” description: “컴퓨터가 질문에 대답하지 못하고 무한히 고민에 빠지는 ‘비종료(nontermination)’ 문제와, 이를 해결하기 위한 평가 순서의 중요성을 쉽게 설명합니다.” summary: “데이터베이스 쿼리 언어에서 재귀를 사용할 때 발생하는 ‘비종료’ 문제와 이를 제어하는 평가 전략의 중요성을 다룹니다.” tags: [데이터베이스, 프로그래밍, AI상식, 기술원리] image: 2026-07-07-Evaluation-order-and-nontermination-in-query-languages.jpg image_alt: “데이터가 복잡하게 얽힌 미로 속에서 길을 찾는 로봇의 모습” reporter: “MindTickleBytes AI” news_type: “Knowledge” ai_opinion: “데이터 처리가 복잡해질수록 ‘어떤 순서로 생각할지’는 AI뿐만 아니라 모든 프로그래밍 언어의 핵심 과제입니다. 이 문제는 AI 시대의 효율적인 연산을 고민하는 우리에게 시사하는 바가 큽니다.” quiz:
- question: “쿼리 언어에서 ‘비종료(nontermination)’ 문제가 주로 발생하는 원인은 무엇인가요?” choices: [“데이터가 너무 많아서”, “재귀(recursion)를 사용할 때”, “평가 전략이 없어서”] answer: 1 explanation: “재귀 구조는 스스로를 반복적으로 호출하기 때문에, 조건이 제대로 설정되지 않으면 프로그램이 끝나지 않는 비종료 상태에 빠질 수 있습니다.”
- question: “전통적인 관계형 데이터베이스에서 쿼리 언어의 평가 순서가 중요하지 않았던 이유는 무엇인가요?” choices: [“SQL이 매우 단순해서”, “쿼리가 선언적(declarative)이기 때문에”, “데이터가 적어서”] answer: 1 explanation: “전통적인 관계형 세상에서 쿼리는 무엇을 얻을지 정의하는 ‘선언적’ 성격이 강해, 물리적인 실행 순서와 상관없이 결과가 보장되었습니다.”
- question: “본문에서 언급된 재귀 처리를 위한 평가 전략 3가지는 무엇인가요?” choices: [“왼쪽에서 오른쪽, 비결정적, 병렬 ‘and’”, “위에서 아래, 정적, 순차적”, “랜덤, 우선순위 기반, 최적화 기반”] answer: 0 explanation: “쿼리 언어의 재귀 문제를 해결하기 위해 왼쪽에서 오른쪽, 비결정적, 그리고 병렬 ‘and’ 전략이 논의됩니다.” lang: ko ref: 2026-07-07-Evaluation-order-and-nontermination-in-query-languages —
상상해보세요. 비서에게 “가장 친한 친구의 친구를 모두 찾아줘”라고 부탁했습니다. 비서는 친구 명단을 확인하고, 다시 그 친구들의 친구 명단을 확인합니다. 그런데 만약 친구들이 서로를 꼬리에 꼬리를 물고 무한히 추천한다면 어떻게 될까요? 비서는 평생 그 업무만 하느라 퇴근도 못 하고, 여러분은 결과를 영원히 듣지 못할지도 모릅니다.
컴퓨터 과학에서도 이와 비슷한 일이 일어납니다. 우리가 데이터베이스에서 정보를 가져오기 위해 사용하는 ‘쿼리 언어(Query Language, 데이터를 조회하거나 조작하는 언어)’에 ‘재귀(Recursion, 자기 자신을 다시 호출하는 방식)’라는 강력한 도구가 더해질 때, 프로그램이 끝나지 않고 멈춰버리는 현상이 발생하곤 합니다.
이게 왜 중요한가요?
우리가 일상에서 사용하는 스마트폰 앱이나 웹 서비스는 모두 보이지 않는 곳에서 수많은 데이터베이스 쿼리를 실행합니다. 만약 이 쿼리가 제대로 끝나지 않고 시스템 자원을 계속 잡아먹는다면, 앱은 ‘먹통’이 됩니다. 특히 복잡한 데이터 관계를 파악해야 하는 최신 AI 서비스나 추천 시스템에서 이 문제는 서비스의 안정성과 직결됩니다. 데이터가 복잡할수록 컴퓨터가 ‘어디서부터 어떻게 일을 처리할지’ 순서를 정하는 일은 프로그래머에게 매우 중요한 과제가 되었습니다.
쉽게 이해하기: 평가 순서의 비밀
쉽게 말해서, 컴퓨터가 명령을 처리하는 ‘평가 전략(Evaluation Strategy, 표현식을 계산하는 규칙)’은 요리사가 요리 순서를 결정하는 것과 같습니다. 출처 14
비유하자면, 세 명의 친구를 초대하기 위해 세 가지 요리를 준비한다고 해봅시다.
- 왼쪽에서 오른쪽으로(left-to-right): 무조건 메뉴판 순서대로 한 요리를 끝내고 다음으로 넘어갑니다.
- 비결정적(nondeterministic): 재료가 준비되는 순서대로, 눈에 띄는 것부터 먼저 요리합니다.
- 병렬 ‘and’: 세 요리를 동시에 조금씩 같이 시작합니다.
쿼리 언어에서도 재귀가 포함되면, 어떤 순서로 데이터를 훑느냐에 따라 프로그램이 성공적으로 답을 내놓을 수도, 아니면 아까의 비서처럼 무한 루프에 빠져버릴 수도 있습니다. 출처 1, 출처 3
전통적인 데이터베이스 세계에서는 이런 고민이 사실 크게 필요 없었습니다. SQL(전통적인 데이터베이스 언어)과 같은 쿼리는 ‘선언적(declarative)’입니다. 즉, “이런 데이터를 줘”라고 결과만 요구하면, 컴퓨터가 알아서 최적의 순서를 정해 가져왔기 때문에 순서 문제는 크게 중요하지 않았습니다. 출처 10
하지만 재귀를 다루기 시작하면서 상황은 달라졌습니다. 재귀는 자기 자신을 포함하기 때문에, 제대로 관리하지 않으면 무한히 스스로를 호출하게 됩니다. 이를 해결하기 위해 학계에서는 왼쪽에서 오른쪽, 비결정적, 그리고 병렬 ‘and’ 같은 다양한 평가 전략을 통해 ‘어떻게 해야 멈출 수 있는지’를 고민하고 있습니다. 출처 2, 출처 3
어디까지 왔을까?
현재 우리는 쿼리 언어의 효율성과 안정성 사이에서 줄타기를 하고 있습니다. 데이터베이스 엔진들은 성능을 높이기 위해 물리적인 실행 순서를 최적화하지만, 사용자가 기대하는 논리적인 결과는 유지해야 합니다. 출처 8 쿼리 언어의 설계자들은 사용자가 짠 코드가 무한 루프에 빠지지 않게 보장하면서도, 동시에 가능한 한 빠르게 결과를 돌려주기 위한 ‘평가 규칙’들을 정교하게 다듬고 있습니다. 출처 9
미래 전망
자료的關聯日益複雜。特別是我們每天面對的 AI 模型需要連結龐大的資訊才能給出答案,屆時「非終止」問題將會更加頻繁地出現。未來,無需開發者一一思考順序,系統本身能自動選擇最有效率且安全的「智慧型評估策略」來結束工作的技術將變得更加重要。 出處 1
MindTickleBytes AI 記者視角
隨著資料的連結,為了尋找問題答案而進行的自主思考過程也變得複雜。幫助電腦不迷失方向的「評估順序」概念,與我們解決複雜日常的方式息息相關。有時一步一步仔細解決,有時同時處理多項事務,有時則從最顯眼的事項開始著手——我們所採用的策略,在電腦內部也在以同樣的方式發生。
參考資料
- Evaluation order and nontermination in query languages
- Evaluation order and nontermination in query languages
- Evaluation order and nontermination in query languages
-
[Understanding the Run-Time Order of Evaluation in Query Processing by SAMI ARIDAL Medium](https://medium.com/@s.aridal/understanding-the-run-time-order-of-evaluation-in-query-processing-fe46e9dd9e61) - A Novel Evaluation of Query Processing and Optimization in DBMS – IJERT
- Formal semantics and analysis of object queries
- Evaluationstrategy - Wikipedia
- 因為資料太多
- 使用遞迴(recursion)時
- 沒有評估策略
- 因為SQL非常簡單
- 因為查詢是聲明式的(declarative)
- 因為資料量少
- 由左至右、非決定性、並行 'and'
- 由上至下、靜態、循序
- 隨機、基於優先權、基於最佳化