강의

멘토링

커뮤니티

Cộng đồng Hỏi & Đáp của Inflearn

Hình ảnh hồ sơ của fpahsqlcj6392
fpahsqlcj6392

câu hỏi đã được viết

Nhập môn và Thực hành Tối ưu hóa hiệu suất MySQL dành cho cả người không chuyên (Phần Tuning SQL)

[실습] 인덱스 직접 설정해보기 / 성능 측정해보기 강의에서요.

Viết

·

180

0

-- 높은 재귀(반복) 횟수를 허용하도록 설정

-- (아래에서 생성할 더미 데이터의 개수와 맞춰서 작성하면 된다.)

SET SESSION cte_max_recursion_depth = 1000000;

-- 더미 데이터 삽입 쿼리

INSERT INTO users (name, age)

WITH RECURSIVE cte (n) AS

(

SELECT 1

UNION ALL

SELECT n + 1 FROM cte WHERE n < 1000000 -- 생성하고 싶은 더미 데이터의 개수

)

SELECT

CONCAT('User', LPAD(n, 7, '0')), -- 'User' 다음에 7자리 숫자로 구성된 이름 생성

FLOOR(1 + RAND() * 1000) AS age -- 1부터 1000 사이의 랜덤 값으로 나이 생성

FROM cte;

-- 잘 생성됐는 지 확인

SELECT COUNT(*) FROM users;

 

SELECT n + 1 FROM cte WHERE n < 1000000 -- 생성하고 싶은 더미 데이터의 개수

SELECT n + 1 이 먼저 실행되고 FROM cte WHERE n < 1000000 이부분이 실행되니까.

n이 999999까지 실행되고 n + 1 =1000000 이니까 FROM cte WHERE n < 1000000이부분에 걸려서 1000000이 실행 안되는게 맞지 않나요?

sqlmysqldbms/rdbmsquery-tuning

Câu trả lời 1

0

jscode님의 프로필 이미지
jscode
Người chia sẻ kiến thức

안녕하세요 zzzzz님! 질문 잘 주셨습니다:D

 

SELECT n + 1 FROM cte WHERE n < 1000000에서

SELECT n + 1이 먼저 실행되지 않고

FROM cte WHERE n < 1000000이 먼저 실행이 됩니다!

그러다보니 n999999이더라도 정상적으로 쿼리가 실행이 된 것입니다.

 

다른 예로, SELECT age + 10, name FROM users WHERE age < 20;의 쿼리를 생각해봅시다.

여기서 이 쿼리가 실행될 때는 users 테이블에서 age < 20를 만족시키는 데이터를 먼저 뽑은 뒤에

그 뒤에 age + 10의 값과 name의 컬럼을 조회해서 출력합니다.

 

위 설명 중에서 이해 안 되시는 점 있으시면 댓글 남겨주세요~~

Hình ảnh hồ sơ của fpahsqlcj6392
fpahsqlcj6392

câu hỏi đã được viết

Đặt câu hỏi