SQL 쿼리 최적화: 실행 계획을 읽고 타이밍에 따라 느린 쿼리 수정
쿼리가 느린 이유를 추측하지 마세요. 실행 계획을 읽고 백만 행으로 구성된 실제 테이블의 전후 측정을 통해 가장 중요한 수정 사항을 적용하는 방법을 알아보세요.
- 실행 계획부터 시작하세요. 데이터베이스가 실제로 무엇을 하는지 알려줍니다.
- 큰 테이블에서 전체 스캔을 찾은 다음 필터 및 조인과 일치하는 인덱스를 추가하세요.
- 함수에서 인덱스된 열을 래핑하지 마세요. 이렇게 하면 효율적인 인덱스 사용이 중단될 수 있습니다.
- 모든 데이터베이스와 데이터 세트가 다르게 동작하므로 전후를 측정하세요.
작년에는 밀리초가 걸렸던 쿼리가 오늘날에는 테이블이 늘어났기 때문에 몇 분이 걸릴 수 있습니다. SQL 쿼리 최적화는 영리한 트릭보다는 반복 가능한 프로세스에 관한 것입니다. 즉, 데이터베이스가 수행하는 작업을 파악하고, 낭비되는 작업을 제거하고, 도움이 되었는지 확인하는 것입니다.
우리는 SQLite 3.50에서 생성된 백만 개의 행에 대해 아래의 각 기술을 테스트했습니다. 타이밍은 메모리 내 데이터베이스를 사용하여 하나의 노트북에서 여러 번 실행하는 것 중 가장 좋습니다. 이는 시스템과 일치하지 않으며 PostgreSQL, MySQL 및 SQL Server에는 각각 고유한 최적화 프로그램과 계획 형식이 있습니다. 각 개선의 규모와 그 뒤에 숨은 원칙에 집중하세요.
결과 한눈에 보기
| 기술 | 이전 | 이후 |
|---|---|---|
| 필터 열의 인덱스 | 73ms | 0.01ms |
| 열의 함수가 아닌 범위 | 96ms | 33ms |
| 두 필터의 복합 인덱스 | 19ms | 2.2ms |
| 깊은 OFFSET이 아닌 키셋 | 8.1ms | 0.01ms |
테스트 설정
CREATE TABLE customers (
id INTEGER PRIMARY KEY, name TEXT, city TEXT
);
CREATE TABLE orders (
id INTEGER PRIMARY KEY, customer_id INT, status TEXT,
created TEXT, total INT, note TEXT
);
-- 50,000 customers and 1,000,000 orders with random values
간단한 최적화 프로세스
- 중요한 쿼리를 찾으세요. 느린 쿼리 로그나 모니터링을 사용하세요. 1분에 수천 번 실행되는 200ms 쿼리는 10초 분량의 월별 보고서보다 더 중요할 수 있습니다.
- 계획을 읽어보세요. 데이터베이스가 실제로 무엇을 하고 있는지 확인하세요.
- 한 가지를 변경하세요. 색인을 추가하거나 쿼리의 일부를 다시 작성하세요.
- 현실적인 데이터를 바탕으로 다시 측정합니다. 100개의 테스트 행에 대한 계획은 백만 개에 대해 거의 알려주지 않습니다.
- 시간을 두고 지켜보세요. 데이터가 증가하고 통계가 변화함에 따라 계획이 변경될 수 있습니다.
실행 계획 읽기
실행 계획은 사용하는 인덱스와 테이블 조인 순서를 포함하여 쿼리를 실행하기 위한 데이터베이스의 단계별 전략입니다. 이를 보려면 쿼리에 접두사를 붙이세요.
| 데이터베이스 | 명령 |
|---|---|
| SQLite | 쿼리 계획 선택 설명... |
| 포스트그레SQL | 설명 분석 선택 ... |
| MySQL | EXPLAIN SELECT ... 또는 EXPLAIN ANALYZE |
| SQL 서버 | SSMS의 실제 실행 계획 |
PostgreSQL의 EXPLAIN ANALYZE은 실제로 쿼리를 실행하므로 UPDATE 또는 DELETE과 함께 사용할 때는 주의하세요. 먼저 찾아야 할 사항은 다음과 같습니다.
| 보시다시피 | 의미 | 보통 |
|---|---|---|
| 스캔 또는 서열 스캔 | 전체 테이블을 읽습니다. | 큰 테이블에 대한 우려 |
| 검색 또는 색인 탐색 | 일치하는 행으로 이동 | 좋음 |
| 피복지수 | 색인에서만 답변됨 | 아주 좋음 |
| 임시 B-트리 또는 정렬 | 추가 분류 작업 | 확인해 볼 가치가 있는 |
전체 검사가 자동으로 나쁜 것은 아닙니다. 쿼리에 작은 테이블이 대부분 필요한 경우 검색이 가장 빠른 선택이 될 수 있습니다. PostgreSQL의 EXPLAIN ANALYZE에서는 추정된 행과 실제 행도 비교합니다. 큰 차이는 종종 테이블 통계가 오래되었음을 의미합니다.
올바른 색인 추가
이 쿼리는 한 고객의 주문을 찾습니다.
SELECT id, total FROM orders WHERE customer_id = 123;
인덱스를 추가하기 전 계획은 전체 스캔이었습니다.
SCAN orders
-- 20 rows in 73 ms
그런 다음 필터 열에 인덱스를 추가했습니다.
CREATE INDEX idx_orders_customer ON orders(customer_id);
SEARCH orders USING INDEX idx_orders_customer (customer_id=?)
-- 20 rows in 0.01 ms
동일한 20개의 행이 수천 배 더 빨리 반환되었습니다. 데이터베이스가 더 이상 행을 찾기 위해 백만 개의 행을 읽지 않기 때문입니다. 이 기사의 다른 어떤 기술도 우리에게 더 큰 승리를 가져다주지 못했습니다. 좋은 첫 번째 후보는 WHERE, JOIN 및 ORDER BY에 사용된 열이며, 특히 결과를 몇 개의 행으로 좁힐 때 더욱 그렇습니다. SQL 인덱스 가이드에서는 작동 방식을 설명합니다.
함수에서 인덱싱된 열을 래핑하지 마세요.
다음은 created에 대한 색인을 사용하여 3월 주문을 찾는 두 가지 방법입니다.
-- Function on the column
SELECT id FROM orders WHERE substr(created, 1, 7) = '2026-03';
-- SCAN orders USING COVERING INDEX idx_orders_created
-- 84,961 rows in 96 ms
-- Plain range
SELECT id FROM orders
WHERE created >= '2026-03-01' AND created < '2026-04-01';
-- SEARCH orders USING COVERING INDEX idx_orders_created (created>? AND created<?)
-- 84,961 rows in 33 ms
둘 다 동일한 행을 반환하지만 첫 번째는 약 3배 정도 시간이 걸립니다. 계획은 그 이유를 보여줍니다. 열에 함수가 있으면 데이터베이스가 정렬된 인덱스의 위치로 이동할 수 없으므로 모든 항목을 통해 SCAN해야 합니다. 범위 버전은 SEARCH 올바른 위치로 바로 이동할 수 있습니다. 이런 방식으로 인덱스를 사용할 수 있는 조건을 sargable이라고 합니다.
다음과 같은 일반적인 패턴에서도 동일한 문제가 나타납니다.
| 피하다 | 선호 |
|---|---|
연도(생성) = 2026 |
생성된 위치 >= '2026-01-01' AND 생성된 < '2027-01-01' |
WHERE 가격 * 2 > 100 |
WHERE 가격 > 50 |
WHERE LOWER(이메일) = 'a@b.com' |
함수 기반 인덱스 또는 대소문자를 구분하지 않는 데이터 정렬 |
이름이 '%99'인 곳 |
접두사 검색 또는 전체 텍스트 검색 |
우리는 마지막 것도 확인했습니다. 주요 와일드카드가 생성됨SCAN customers, 첫 글자부터 정렬된 색인은 끝 부분의 일치에 도움이 될 수 없습니다.
복합 인덱스
쿼리가 두 개의 열을 필터링하는 경우 단일 열 인덱스는 작업의 일부만 수행합니다.
SELECT id FROM orders
WHERE status = 'paid'
AND created >= '2026-03-01' AND created < '2026-03-08';
-- Using only the created index: 6,198 rows in 19 ms
CREATE INDEX idx_status_created ON orders(status, created);
-- SEARCH orders USING COVERING INDEX idx_status_created
-- (status=? AND created>? AND created<?)
-- 6,198 rows in 2.2 ms
열 순서는 매우 중요합니다. (status, created)의 색인은 성, 이름 순으로 정렬된 전화번호부처럼 작동합니다. 성만 검색할 수 있지만 이름만 검색할 수는 없습니다. status에 대한 쿼리만으로도 이 인덱스를 사용할 수 있습니다. created만으로는 필터링하는 것만으로는 일반적으로 효율적으로 사용할 수 없습니다. 경험상 동일성이 테스트된 열을 먼저 배치하고 그 뒤에 범위 열을 배치합니다.
해당 계획에는 포함 인덱스도 명시되어 있습니다. 즉, 인덱스에 쿼리에 필요한 모든 것이 포함되어 있으므로 테이블 자체를 읽을 필요가 없습니다. 필요한 열만 선택하면 이런 일이 발생할 가능성이 높아지는데, 이는 SELECT *를 피해야 하는 또 다른 이유입니다.
더 빠른 페이지 매김
딥 페이지에 OFFSET을 사용하면 숨겨진 비용이 발생합니다. 데이터베이스가 건너뛴 모든 행을 계속 지나쳐야 하기 때문입니다.
-- Page deep into the results
SELECT id FROM orders ORDER BY id LIMIT 20 OFFSET 500000;
-- 8.1 ms
-- Keyset pagination: continue from the last id seen
SELECT id FROM orders WHERE id > 500000 ORDER BY id LIMIT 20;
-- 0.01 ms
키 세트 페이지 매김은 아무리 깊이 들어가도 빠르게 유지됩니다. 또한 새 데이터가 추가될 때 페이지 간에 행이 이동하는 것을 방지합니다. 단점은 사용자가 실제로 필요한 경우가 거의 없는 5,000페이지로 바로 이동할 수 없다는 것입니다. 행이 넓거나 건너뛸 행이 더 많은 테이블에서는 테스트에서보다 간격이 훨씬 더 커질 수 있습니다.
팁: 우리의 타이밍은 유휴 컴퓨터에서 한 번에 하나의 쿼리를 측정합니다. 실제 로드 시에는 비효율적인 쿼리가 잠금을 유지하고 메모리, 디스크 및 CPU를 두고 다른 모든 것과 경쟁하기 때문에 더 많은 피해를 입힙니다.
간결한 쿼리 작성
- 필요한 열만 선택하세요.
SELECT *더 많은 데이터를 보내므로 인덱스가 쿼리를 덮지 못하게 할 수 있습니다. - 초기 필터링. 그룹화하기 전에 행을 제거하려면
WHERE를 사용하고 집계 조건에만HAVING을 사용합니다. SQL GROUP BY 및 HAVING을 참조하세요. - 몇 개의 행만 필요한 경우에는 LIMIT를 사용하세요.
- 중복 항목을 제거할 필요가 없는 경우 UNION ALL을 선호합니다. UNION 대 UNION ALL 테스트는 이것이 무엇을 절약하는지 보여줍니다.
- 불필요한 DISTINCT를 피하세요. 중복을 생성하는 조인을 숨기는 경우가 많습니다.
- 존재 확인을 위해 EXISTS를 사용하세요. SQL 하위 쿼리에 대한 가이드에서 설명하는 것처럼 첫 번째 일치에서 중지될 수 있습니다.
- N+1 쿼리를 살펴보세요. 일반적으로 애플리케이션 코드로 인해 발생하는 루프의 행당 하나의 쿼리가 실제 문제인 경우가 많습니다. 단일 조인 또는 일괄 쿼리로 수백 번의 왕복을 대체할 수 있습니다.
조인
조인하는 열을 색인화합니다. 우리는 한 도시의 고객을 대상으로 총 지출 보고서를 실행했으며 그 계획은 귀하가 원하는 것과 정확히 일치했습니다.
SELECT c.name, SUM(o.total)
FROM customers c
JOIN orders o ON o.customer_id = c.id
WHERE c.city = 'Goa'
GROUP BY c.id;
-- SCAN c
-- SEARCH o USING COVERING INDEX idx_cover (customer_id=?)
-- 9,900 rows in 34 ms
고객을 스캔한 다음 색인을 사용하여 각 고객의 주문을 찾습니다. orders.customer_id에 대한 인덱스가 없으면 데이터베이스는 각 고객에 대해 훨씬 더 많은 작업을 수행해야 합니다. 외래 키에 대한 인덱스는 수행할 수 있는 가장 일반적이고 중요한 추가 기능 중 하나입니다. 기본 사항에 대한 이해를 다시 높이려면 SQL 조인 설명을 참조하세요.
인덱스 비용이 발생하는 경우
인덱스는 무료가 아니므로 모든 열에 하나씩 추가하지 마세요.
- 쓰기 속도가 느려집니다. 모든 삽입, 업데이트 및 삭제는 각 인덱스도 업데이트해야 합니다.
- 더 많은 저장 공간과 메모리. 큰 테이블에서는 인덱스가 커질 수 있습니다.
- 비선택적 열에는 거의 이점이 없습니다. 대부분의 행이 일치하는 경우 true 또는 false 열의 인덱스는 도움이 되지 않을 수 있습니다.
- 중복성.
(a, b)에 이미 인덱스가 있는 경우(a)의 인덱스는 불필요한 경우가 많습니다.
주기적으로 사용량 통계를 확인하고, 사용하지 않는 인덱스는 제거하세요. 그리고 옵티마이저는 좋은 계획을 선택하기 위해 통계에 의존하기 때문에 ANALYZE 또는 데이터베이스와 동등한 것을 사용하여 통계를 최신 상태로 유지하십시오. 때때로 느린 부분은 쿼리보다는 경합입니다. 장기 실행 트랜잭션 잠금 보유로 인해 빠른 쿼리가 느리게 보일 수 있습니다.
일반적인 실수
- 측정하지 않고 최적화합니다. 확신에 찬 많은 추측이 잘못된 것으로 판명됩니다.
- 작은 데이터로 테스트합니다. 테이블이 늘어남에 따라 계획과 시기가 크게 변경됩니다.
- 다른 데이터베이스의 팁을 신뢰합니다. 한 엔진에 대한 조언이 다른 엔진에는 적용되지 않을 수 있습니다.
- 무작위로 인덱스를 추가합니다. 인덱스를 추가할 때마다 쓰기 속도가 느려집니다.
- 첫 번째 실행 효과 무시. 캐시는 두 번째 실행 속도를 더 빠르게 하므로 여러 번 실행하세요.
마무리
대부분의 느린 쿼리에는 인덱스 누락, 열의 함수 또는 너무 많은 데이터를 가져오는 등의 일반적인 원인이 있습니다. 이번 주에 가장 느린 실제 쿼리에 대해 EXPLAIN을 실행하고 큰 테이블에서 전체 스캔을 찾으십시오. 한 가지를 수정하고 다시 측정하고 변경된 사항을 기록해 두세요.
자주 묻는 질문
SQL 쿼리 최적화란 무엇입니까?
일반적으로 실행 계획을 검토하고 적절한 인덱스를 추가하고 비효율적인 쿼리를 다시 작성하여 쿼리에서 더 적은 시간과 리소스를 사용하도록 만드는 프로세스입니다.
실행 계획이란 무엇입니까?
이는 테이블을 읽는 방법, 사용하는 인덱스 및 조인 순서를 포함하여 쿼리를 실행하기 위해 데이터베이스가 선택한 전략입니다.
느린 쿼리를 어떻게 찾나요?
데이터베이스의 느린 쿼리 로그를 활성화하거나 PostgreSQL의 pg_stat_statements와 같은 도구를 사용하세요. 그런 다음 총 시간이 가장 긴 쿼리에 집중합니다.
인덱스를 추가하면 항상 쿼리가 더 빨라지나요?
아니요. 선택적 읽기에는 도움이 되지만 쓰기 속도가 느려지고 스토리지를 사용합니다. 대부분의 행이 조건과 일치하는 경우 최적화 프로그램은 이를 무시할 수도 있습니다.
SELECT *는 성능에 나쁜가요?
그럴 수 있습니다. 불필요한 데이터를 전송하고 인덱스가 쿼리를 처리하지 못하게 할 수 있습니다. 일반적으로 필요한 열만 나열하는 것이 더 좋습니다.
계속 학습하세요
테스트, WordPress 또는 SEO에 도움이 필요하십니까?
우리는 팀이 더 나은 소프트웨어를 출시하고 사이트를 성장시킬 수 있도록 돕습니다. 현재 진행 중인 작업을 알려주시면 명확한 다음 단계를 제안해 드리겠습니다.
추가 가이드 테스트, AI 및 최신 개발
이 기사가 마음에 드셨나요? 주제를 선택하고 최신 튜토리얼로 바로 이동하세요.
AI 환각 설명: 언어 모델이 사물을 구성하는 이유와 이를 줄이는 방법
AI 환각은 그것이 무엇인지, 언어 모델이 환각을 생성하는 이유, 일반적인 유형, 접지 및 프롬프트를 통해 환각을 줄이는 방법, 그리고 우리가 실행한 간단한 점검에 대해 설명했습니다.
기사 읽기 →DevOps환경 변수 설명: .env 파일, 비밀 및 구성이 올바르게 완료되었습니다.
우리가 실행한 Python 예제를 통해 설명된 환경 변수: 읽기 및 설정, 모든 값이 문자열인 이유, .env 파일, 프로세스 상속, 비밀 및 유효성 검사.
기사 읽기 →소프트웨어 개발API 속도 제한 설명: 알고리즘, 헤더 및 429 오류 처리
우리가 실행한 시뮬레이션을 통해 설명된 API 속도 제한: 토큰 버킷, 고정 창, 슬라이딩 창, 429 응답, 속도 제한 헤더, 백오프를 사용한 재시도 및 테스트 제한.
기사 읽기 →테스트 자동화Python에서 조롱: unittest.mock, 패치 및 테스트를 거짓말로 만드는 실수
Unittest.mock을 사용하여 Python에서 모의, 테스트됨: 모의 및 return_value, 부작용, 이름이 사용되는 패치, 사양 및 자동 사양, 모의 날짜 및 일반적인 실수.
기사 읽기 →소프트웨어 테스트코드 커버리지 설명: 회선 커버리지와 분기 커버리지 및 100%의 실제 의미
실제 Coverage.py 실행을 통해 설명되는 코드 적용 범위: 라인, 분기 및 조건 적용 범위, 보고서 읽기, 100% 적용 범위가 여전히 버그를 놓칠 수 있는 이유 및 합리적인 대상.
기사 읽기 →데이터베이스 및 SQLSQL의 DELETE vs TRUNCATE vs DROP: 차이점, 롤백 및 사용 시기
테스트된 SQL을 통해 DELETE 대 TRUNCATE 대 DROP에 대해 설명합니다. 각각의 제거, 롤백, 트리거, ID 재설정, 속도 및 PostgreSQL, MySQL, SQL Server 및 SQLite의 차이점.
기사 읽기 →데이터베이스 및 SQLSQL 뷰 설명: 예제를 통해 함정 생성, 사용 및 방지
우리가 실행한 쿼리로 설명된 SQL 뷰: 뷰 생성, 실시간 결과, 열 숨기기, 성능, 업데이트 가능하고 구체화된 뷰, 손상된 종속성 및 모범 사례.
기사 읽기 →소프트웨어 개발TypeScript 인터페이스와 유형: 실제 차이점, 컴파일러로 테스트
TypeScript 인터페이스 대 유형, 실제 컴파일러로 확인: 둘 다 할 수 있는 것, 하나만 할 수 있는 것, 선언 병합, 확장 대 교차점 및 따라야 할 간단한 규칙.
기사 읽기 →소프트웨어 개발Python *args 및 **kwargs 설명: 명확한 예가 포함된 유연한 함수
Python *args 및 **kwargs는 우리가 실행한 코드(패킹 및 언패킹, 매개변수 순서, 키워드 전용 및 위치 전용 인수, 데코레이터 및 일반적인 오류)를 설명했습니다.
기사 읽기 →소프트웨어 개발Python Lambda 함수: 구문, 실제 사용 및 사용하지 말아야 할 경우
Python 람다 함수는 구문, 키를 사용한 정렬, 맵 및 필터, 클로저, 후기 바인딩 트랩, 일반 def가 더 나은 선택인 경우 등 우리가 실행한 코드로 설명되었습니다.
기사 읽기 →인공지능AI 에이전트란 무엇입니까? 작동 방식, 간단한 에이전트 루프를 사용하여 실행할 수 있음
AI 에이전트란 무엇입니까? 우리가 실행한 작은 Python 루프, 실제 위험 및 간단한 챗봇이 더 나은 선택일 때 에이전트 루프, 도구, 메모리 및 가드레일에 대한 일반 가이드입니다.
기사 읽기 →DevOps모니터링과 관찰 가능성: 로그, 지표, 추적을 통한 실제 차이점
모니터링과 관찰 가능성 설명: 알려진 오류와 알려지지 않은 오류, 로그, 지표 및 추적, 결제 사건 안내, 골든 신호, OpenTelemetry 및 유용한 경고.
기사 읽기 →DevOpsDocker 볼륨과 바인딩 마운트: 컨테이너 데이터를 올바른 방식으로 유지
Docker 볼륨과 바인드 마운트 설명: 컨테이너 데이터가 사라지는 이유, 명명된 볼륨, 바인드 마운트, tmpfs, Compose 예제, 백업, 권한 및 각 사용 시기.
기사 읽기 →테스트 자동화TDD와 BDD: 주요 차이점, 두 가지 방식으로 구축된 하나의 기능 및 각 사용 시기
TDD와 BDD는 두 가지 방식으로 구축된 하나의 할인 기능, 즉 우리가 실행한 코드를 사용한 적록 리팩토링, 주어진 시점 시나리오, 도구, 장단점 및 각 사용 시기를 설명합니다.
기사 읽기 →소프트웨어 테스트UAT(사용자 승인 테스트): 프로세스, 체크리스트 및 실제 사례
사용자 승인 테스트는 누가 실행하는지, QA와 어떻게 다른지, 7단계 프로세스, UAT 테스트 사례 템플릿, 체크리스트, 승인 기준 및 일반적인 실수에 대해 설명했습니다.
기사 읽기 →데이터베이스 및 SQLSQL NULL 값 설명: IS NULL, COALESCE, NULLIF 및 피해야 할 함정
우리가 실행한 쿼리를 통해 설명된 SQL NULL 값: 3개 값 논리, IS NULL, COALESCE, NULLIF, 집계, 조인 및 정렬이 NULL을 처리하는 방법 및 조용히 발생하는 버그.
기사 읽기 →데이터베이스 및 SQLSQL CASE WHEN 문: 구문, 실제 예 및 일반적인 실수
우리가 실행한 쿼리로 설명된 SQL CASE: 단순 및 검색 양식, 조건 순서, SUM이 있는 피벗, COUNT 트릭, 사용자 정의 정렬, 업데이트 및 피해야 할 NULL 트랩.
기사 읽기 →소프트웨어 개발JWT란 무엇입니까? 실제 예제로 설명되는 JSON 웹 토큰
JWT란 무엇입니까? JSON 웹 토큰은 세 부분, 즉 우리가 실행한 코드에서 구축 및 변조된 토큰, JWT 대 세션, 저장소, 새로 고침 토큰 및 보안 실수를 설명했습니다.
기사 읽기 →소프트웨어 개발JavaScript 이벤트 루프 설명: 예제가 포함된 호출 스택, 마이크로태스크 및 타이머
호출 스택, 작업 및 마이크로태스크 대기열, setTimeout 0이 즉시 실행되지 않는 이유, 차단, 기아 및 인터뷰 퀴즈 등 우리가 실행한 코드로 JavaScript 이벤트 루프를 설명했습니다.
기사 읽기 →소프트웨어 개발Python 생성기 및 수율 설명: 실제 예제로 메모리 절약
Python 생성기와 항복은 우리가 실행한 코드로 설명됩니다. 일시 중지 및 재개 방법, 측정된 메모리 절약, 파이프라인, 무한 시퀀스, 항복, 전송 및 공통 트랩.
기사 읽기 →인공지능임베딩이란 무엇입니까? 벡터와 코사인 유사성을 간단하게 설명
임베딩이란 무엇입니까? 벡터, 코사인 유사성 및 의미론적 검색에 대한 일반 언어 가이드로, 우리가 실행한 작은 예, 일반적인 용도, 모델 선택 및 알려진 한계를 제공합니다.
기사 읽기 →DevOps블루-그린 배포와 카나리아 배포: 차이점, 장단점 및 선택 방법
블루-그린 배포와 카나리아 배포에 대한 설명: 각각의 작동 방식, 비용, 위험 및 롤백, 테스트한 안정적인 사용자 버킷팅, 데이터베이스 마이그레이션, 롤링 업데이트 및 선택 방법.
기사 읽기 →테스트 자동화불안정한 테스트: 원인과 해결 방법
우리가 실행한 데모를 통해 불안정한 테스트에 대해 설명했습니다. 주요 원인, 확인 및 진단 방법, 시기, 공유 상태 및 날짜, 격리 프로세스에 대한 적절한 수정 사항.
기사 읽기 →소프트웨어 테스트부하 테스트와 스트레스 테스트 비교: 차이점, 측정항목 및 k6 예
부하 테스트와 스트레스 테스트 비교 설명: 각각의 증명, 스파이크 및 흡수 테스트, 중요한 측정항목, 평균이 잘못된 이유, k6 예 및 테스트 계획 방법.
기사 읽기 →소프트웨어 테스트테스트 케이스와 테스트 시나리오: 주요 차이점, 예 및 각각의 사용 시기
테스트 케이스와 테스트 시나리오 설명: 명확한 정의, 병렬 테이블, 시나리오에서 케이스로 가져온 하나의 비밀번호 재설정 기능, 템플릿 및 각 사용 시기.
기사 읽기 →데이터베이스 및 SQLSQL 쿼리 최적화: 타이밍에 따라 실행 계획을 읽고 느린 쿼리를 수정합니다.
백만 개의 행에서 테스트된 SQL 쿼리 최적화: 실행 계획 읽기, 올바른 인덱스 추가, 분할할 수 없는 필터 수정, 복합 인덱스 및 키 세트 페이지 매김 사용.
기사 읽기 →데이터베이스 및 SQLSQL UNION 대 UNION ALL: 테스트된 차이점, 예 및 성능
SQL UNION과 UNION ALL은 우리가 실행한 쿼리(중복, 둘 다 따르는 규칙, 실제 데이터 버그, 측정된 성능, INTERSECT 및 EXCEPT, 각각의 사용 시기)를 설명합니다.
기사 읽기 →소프트웨어 개발JavaScript Fetch API 튜토리얼: GET, POST, 오류 처리 및 시간 초과
로컬 서버에 대해 테스트된 JavaScript Fetch API 튜토리얼: GET 및 POST, 404가 발생하지 않는 이유, 재사용 가능한 도우미, 쿼리 문자열, 시간 초과, CORS 및 일반적인 실수.
기사 읽기 →소프트웨어 개발Python 파일 처리: 읽기, 쓰기, CSV, JSON 및 pathlib 예제 포함
우리가 실행한 코드로 설명된 Python 파일 처리: 개방형 모드, 대용량 파일 읽기, CSV, JSON, pathlib, 바이너리 파일, 안전한 쓰기, 오류 처리 및 일반적인 실수.
기사 읽기 →소프트웨어 개발Python 클래스 및 객체: 실제 예제가 포함된 OOP 튜토리얼
우리가 실행한 코드로 설명된 Python 클래스와 객체: __init__, 메소드, 클래스 대 인스턴스 속성, 상속, 속성, 던더 메소드, 데이터 클래스 및 일반적인 실수.
기사 읽기 →인공지능대규모 언어 모델이란 무엇입니까? LLM의 작동 방식, 과대광고 없이 설명
대규모 언어 모델이란 무엇입니까? LLM은 토큰, 임베딩, 주의, 훈련, 온도 및 컨텍스트 창, 작은 다음 단어 데모 및 실제 한계 등 일반 언어로 설명됩니다.
기사 읽기 →DevOps초보자를 위한 Linux 명령: 예제가 포함된 필수 터미널 가이드
탐색, 파일, 로그 보기, grep, 파이프, 권한, 프로세스 및 아카이브 등 작업별로 그룹화된 초보자를 위한 Linux 명령과 실용적인 로그 분석 예제가 포함되어 있습니다.
기사 읽기 →테스트 자동화셀레늄 대 극작가: 주요 차이점, 코드 비교 및 선택할 항목
Selenium과 Playwright 비교: 아키텍처, 대기, 브라우저 및 언어 지원, 디버깅, 두 도구 모두에서 동일한 테스트, 마이그레이션 조언 및 선택 방법.
기사 읽기 →소프트웨어 테스트등가 분할: 실제 예제를 통해 설명되는 테스트 설계 기법
등가 분할 설명: 유효한 파티션과 유효하지 않은 파티션을 찾는 방법, 연령, 비밀번호 및 쿠폰에 대한 작업 예제, 실행한 테스트, 경계와 쌍을 이루는 이유.
기사 읽기 →소프트웨어 테스트소프트웨어 테스팅의 심각도와 우선순위: 차이점, 매트릭스 및 실제 사례
소프트웨어 테스팅의 심각도와 우선순위에 대한 설명: 명확한 정의, 예제가 포함된 4방향 매트릭스, 수준 척도, 각 항목을 설정하는 사람 및 버그 분류 실행 방법.
기사 읽기 →데이터베이스 및 SQLSQL 하위 쿼리 자습서: 유형, 상관 하위 쿼리 및 EXISTS(예제 포함)
스칼라, IN, FROM 및 SELECT 하위 쿼리, 상관 하위 쿼리, EXISTS, NOT IN NULL 트랩 및 하위 쿼리 대 JOIN 대 CTE 등 우리가 실행한 쿼리가 포함된 SQL 하위 쿼리 자습서입니다.
기사 읽기 →데이터베이스 및 SQLSQL 트랜잭션 및 ACID 설명: COMMIT, ROLLBACK 및 격리 수준
COMMIT, ROLLBACK, 저장점, 잠금, 격리 수준, 더티 읽기, 교착 상태 및 모범 사례 등 우리가 실행한 은행 이체를 통해 SQL 트랜잭션 및 ACID를 설명했습니다.
기사 읽기 →소프트웨어 개발Git 명령 치트 시트: 실제로 사용하는 명령과 예제
실제 데모 저장소의 출력과 함께 설정, 준비, 분기, 원격, 숨김, 기록 및 실행 취소 실수 등 작업별로 그룹화된 Git 명령 치트 시트입니다.
기사 읽기 →소프트웨어 개발JavaScript Promises 설명: then, catch, Promise.all 및 일반적인 실수
우리가 실행한 코드로 설명된 JavaScript Promise: 상태, then 및 catch 체인, 오류 처리, Promise.all, allSettled, race 및 기타, 이벤트 루프 및 일반적인 실수.
기사 읽기 →소프트웨어 개발Python 사전 튜토리얼: 방법, 예제 및 일반적인 패턴
우리가 실행한 코드가 포함된 Python 사전 튜토리얼: 사전 생성, 읽기 및 업데이트, 주요 방법, 병합, 이해, 패턴 계산 및 그룹화, 일반적인 실수.
기사 읽기 →인공지능RAG 란 무엇입니까? 실제 예제를 통해 설명되는 검색 증강 생성
RAG란 무엇인가요? 검색 증강 생성은 인덱싱, 청킹, 임베딩, 검색, 소규모로 작동하는 Python 예제, 평가 및 일반적인 실패 등 단계별로 설명됩니다.
기사 읽기 →DevOps초보자를 위한 Terraform 튜토리얼: 첫 번째 파일부터 모듈까지 코드로서의 인프라
초보자를 위한 Terraform 튜토리얼: 클라우드 계정 없이 시작하여 초기화, 계획 및 적용을 배우고 변수, 출력, 상태, 모듈 및 안전한 팀 워크플로를 학습합니다.
기사 읽기 →DevOpsDocker와 Kubernetes: 주요 차이점, 함께 작동하는 방식 및 필요한 사항
Docker와 Kubernetes에 대한 설명: 각각의 기능, 동일한 앱이 두 가지 모두에서 실행됨, Docker Compose와 Swarm 비교, dockershim 변경 사항 및 필요한 사항을 결정하는 방법.
기사 읽기 →테스트 자동화초보자를 위한 Pytest 튜토리얼: 고정 장치, 매개변수화 및 실제 예제
pytest 9.2에서 실행한 테스트(어설션, 픽스쳐, 매개변수화, conftest, 마커, tmp_path, Monkeypatch, 유용한 플래그 및 CI)가 포함된 초보자를 위한 pytest 튜토리얼입니다.
기사 읽기 →소프트웨어 테스트소프트웨어 테스팅 라이프사이클(STLC): 6단계, 시작 및 종료 기준, 예
소프트웨어 테스팅 수명주기는 시작 및 종료 기준, 결과물, 작업된 로그인 기능 예, STLC 대 SDLC 및 Agile의 STLC를 포함하는 6개의 STLC 단계를 설명합니다.
기사 읽기 →소프트웨어 개발Git merge vs rebase: 차이점, 예제, 언제 무엇을 쓸까
Git merge vs rebase를 실제 로그 출력, 비교표, rebase의 황금률, 안전한 팀 워크플로로 설명합니다.
기사 읽기 →소프트웨어 개발파이썬 리스트 컴프리헨션: 문법, 예제, 피해야 할 때
파이썬 리스트 컴프리헨션 설명: 문법, 필터링, if-else, 중첩 반복문, 실제 측정 시간, 그리고 일반 for 반복문이 더 나은 경우.
기사 읽기 →데이터베이스 및 SQL예제로 쉽게 배우는 SQL JOIN (Inner, Left, Right, Full)
샘플 테이블과 쿼리로 SQL JOIN을 단계별로 이해하세요. INNER, LEFT, RIGHT, FULL, CROSS, SELF와 흔한 실수, 성능 팁까지 정리했습니다.
기사 읽기 →