naver_attach_info + apt_real_info

let etheaders_han = [
"Query ",
"DescendingNumber",
"네이버고유아파트번호",
"아파트이름",
"지역번호",
"승인일",
"네이버주소",
"지번",
"부번",
"매매금액차이",
"매매금액비율(%)",
"평형",
"최대매매금액",
"최대매매년도",
"최대매매해당층",
"최대매매금액",
"최대매매년도",
"최대매매해당층",
"지역번호",
"네이버 최저매매호가",
"네이버 최대매매호가",
"네이버 최저전세호가",
"네이버 최대전세호가",
"네이버 최저매매호가",
"네이버 최대매매호가",
"네이버 최저전세호가",
"네이버 최대전세호가",
"국토교통부주소",
"RealEstateTypeCode",
"RealEstateTypeName",
"LotNumber",
"Building",
"Buyer",
"Seller",
"국토교통부실거래금액",
"준공년도",
"국토교통부도로명주소",
"CancellationReasonDate",
"부동산거래타입",
"DataClass",
"InfoMarketClass",
"TransactionTime",
"중개장소",
"매매계약신고일",
"HousingType"
];
let etheaders = [
"Query", 
"DescendingNumber",
"ComplexNo",
"ComplexName",
"CortarNo",
"UseApproveYmd",
"CortarAddress",
"MainNumber",
"SubNumber",
"CapitalGain",
"CapitalGain(%)",
"AreaSquareMeters",
"PurchasePrice",
"ContractYearMonth",
"Floor",
"PurchasePrice",
"ContractYearMonth",
"Floor",
"Region",
"MinPriceByLetter",
"MaxPriceByLetter",
"MinLeasePriceByLetter",
"MaxLeasePriceByLetter",
"MinPrice",
"MaxPrice",
"MinLeasePrice",
"MaxLeasePrice",
"CityCounty",
"RealEstateTypeCode",
"RealEstateTypeName",
"LotNumber",
"Building",
"Buyer",
"Seller",
"TransactionAmount",
"ConstructionYear",
"RoadName",
"CancellationReasonDate",
"TransactionType",
"DataClass",
"InfoMarketClass",
"TransactionTime",
"BrokerLocation",
"RegistrationDate",
"HousingType"
];

let esheaders_han = [
"Query ",
"DescendingNumber",
"네이버고유아파트번호",
"아파트이름",
"지역번호",
"승인일",
"네이버주소",
"지번",
"부번",
"매매금액차이",
"매매금액비율(%)",
"평형",
"최대매매금액",
"최대매매년도",
"최대매매해당층",
"최소매매금액",
"최소매매년도",
"최소매매해당층",
"지역번호",
"네이버 최저매매호가",
"네이버 최대매매호가",
"네이버 최저전세호가",
"네이버 최대전세호가",
"네이버 최저매매호가",
"네이버 최대매매호가",
"네이버 최저전세호가",
"네이버 최대전세호가",
"국토교통부주소",
"RealEstateTypeCode",
"RealEstateTypeName",
"LotNumber",
"Building",
"Buyer",
"Seller",
"국토교통부실거래금액",
"준공년도",
"국토교통부도로명주소",
"CancellationReasonDate",
"부동산거래타입",
"DataClass",
"InfoMarketClass",
"TransactionTime",
"중개장소",
"매매계약신고일",
"HousingType"
];
let esheaders = [
"Query", 
"DescendingNumber",
"ComplexNo",
"ComplexName",
"CortarNo",
"UseApproveYmd",
"CortarAddress",
"MainNumber",
"SubNumber",
"CapitalGain",
"CapitalGain(%)",
"AreaSquareMeters",
"MaxPurchasePrice",
"MaxContractYearMonth",
"MaxFloor",
"MinPurchasePrice",
"MinContractYearMonth",
"MinFloor",
"Region",
"MinPriceByLetter",
"MaxPriceByLetter",
"MinLeasePriceByLetter",
"MaxLeasePriceByLetter",
"MinPrice",
"MaxPrice",
"MinLeasePrice",
"MaxLeasePrice",
"CityCounty",
"RealEstateTypeCode",
"RealEstateTypeName",
"LotNumber",
"Building",
"Buyer",
"Seller",
"TransactionAmount",
"ConstructionYear",
"RoadName",
"CancellationReasonDate",
"TransactionType",
"DataClass",
"InfoMarketClass",
"TransactionTime",
"BrokerLocation",
"RegistrationDate",
"HousingType"
];

 

index.html
0.03MB

외장형 디스크(USB 저장장치)의 데이터를 삭제할 때 기본적으로 휴지통으로 이동하지 않습니다.

이유:

  1. 휴지통은 로컬 디스크(C:)에만 적용
    • Windows의 기본 설정에서는 **내장 디스크(C: 등)**에 있는 파일만 휴지통으로 이동합니다.
    • USB, 외장하드, SD카드 등 이동식 저장장치에서는 삭제 시 휴지통을 거치지 않고 즉시 삭제됩니다.
  2. 삭제하면 바로 공간이 해제됨
    • 외장하드에서 300GB 데이터를 삭제하면, 해당 공간이 즉시 사용 가능해집니다.
    • 복구를 원하면 별도의 데이터 복구 프로그램을 사용해야 합니다.

🛠 하지만, 휴지통으로 보내고 싶다면?

🔹 방법 1: 외장하드에도 휴지통을 설정하기

  1. 바탕화면에서 휴지통(Right Click) → 속성(Properties) 선택
  2. 외장하드(USB 드라이브) 선택
  3. "삭제된 파일을 휴지통으로 이동" 옵션 체크
  4. "확인(OK)" 클릭

🔹 방법 2: Shift + Delete를 사용하지 않기

  • 그냥 Delete 키를 누르면 일부 경우 휴지통으로 이동할 수도 있지만,
    일반적으로 외장하드의 경우 휴지통을 거치지 않고 삭제됨

🚨 주의할 점

  • 실수로 삭제한 경우, 파일 복구 프로그램(예: Recuva, EaseUS Data Recovery)을 사용해야 복구 가능
  • 완전 삭제를 원하면 파일을 삭제한 후 드라이브를 포맷하거나 디스크 정리 실행

💡 결론: 기본적으로 외장형 디스크에서 삭제된 파일은 휴지통으로 가지 않고 즉시 삭제됩니다.

const table = document.querySelector("table"); // 테이블 선택
const rows = table.querySelectorAll("tr"); // 모든 행 선택
const lightGreenColor = "#A8C6A3";  // 색상 값을 const 변수로 선언

rows.forEach((row) => {
const cells = row.querySelectorAll("td"); // 해당 행의 모든 <td> 가져오기
cells.forEach((col, index) => {
if (firstPartClass === "ES565" || firstPartClass === "ER565") {
if (index === 9) col.style.backgroundColor = lightGreenColor
} else if (firstPartClass === "EU565" || firstPartClass === "EV565") {
if (index === 10) col.style.backgroundColor = lightGreenColor
} else if (firstPartClass === "ET565" || firstPartClass === "ET564") {
if (index === 12) col.style.backgroundColor = lightGreenColor
}
});
});

 

색상HEX 코드설명

🍏 #28A745 col.style.backgroundColor = "#28A745"; 초록 + 연두빛
🍃 #40C463 col.style.backgroundColor = "#40C463"; 좀 더 밝고 싱그러운 초록
🌿 #6CD26F col.style.backgroundColor = "#6CD26F"; 연한 연두색
🌱 #A8E6A3 col.style.backgroundColor = "#A8E6A3"; 부드러운 연두색 (밝은 느낌)

 

index.html
0.03MB

#if(true)
        string query = $@"
WITH MaxTransaction AS (
    SELECT 
MainNumber,
SubNumber,
ComplexName,
AreaSquareMeters,
TransactionAmount,
ContractYearMonth,
Floor,
ROW_NUMBER() OVER (
    PARTITION BY MainNumber, SubNumber, ComplexName, AreaSquareMeters 
    ORDER BY TransactionAmount DESC, ContractYearMonth DESC, Floor DESC
) AS RowNum
    FROM ANESTATEAPTALL
    WHERE (TransactionType = '중개거래' OR NOT EXISTS (SELECT 1 FROM ANESTATEAPTALL WHERE TransactionType = '중개거래'))
    AND CityCounty LIKE '{cityCountryText}%'
),
MinTransaction AS (
    SELECT 
MainNumber,
SubNumber,
ComplexName,
AreaSquareMeters,
TransactionAmount,
ContractYearMonth,
Floor,
ROW_NUMBER() OVER (
    PARTITION BY MainNumber, SubNumber, ComplexName, AreaSquareMeters 
    ORDER BY TransactionAmount ASC, ContractYearMonth ASC, Floor ASC
) AS RowNum
    FROM ANESTATEAPTALL
    WHERE (TransactionType = '중개거래' OR NOT EXISTS (SELECT 1 FROM ANESTATEAPTALL WHERE TransactionType = '중개거래'))
    AND CityCounty LIKE '{cityCountryText}%'
)
                SELECT 
    ROW_NUMBER() OVER () AS DescendingNumber,
    m.MainNumber,
    m.SubNumber,
    m.ComplexName,
    m.AreaSquareMeters AS AreaSizeMeters,
    m.TransactionAmount AS MAX_Amount,
    m.ContractYearMonth AS MAX_Date,
    m.Floor AS MAX_Floor,
    n.TransactionAmount AS MIN_Amount,
    n.ContractYearMonth AS MIN_Date,
    n.Floor AS MIN_Floor,
    (m.TransactionAmount - n.TransactionAmount) AS AliasCapitalGain,
         '{regionNM}'
FROM MaxTransaction m
JOIN MinTransaction n
    ON m.MainNumber = n.MainNumber
    AND m.SubNumber = n.SubNumber
    AND m.ComplexName = n.ComplexName
    AND m.AreaSquareMeters = n.AreaSquareMeters
WHERE m.Floor <> n.Floor
                AND m.ContractYearMonth <> n.ContractYearMonth
                AND m.TransactionAmount <> n.TransactionAmount
AND m.RowNum = 1
AND n.RowNum = 1
ORDER BY AliasCapitalGain ASC
LIMIT {limitSQLNumber};
";
#endif

 

index.html
0.02MB

  • (x1...) 표시는 SQLite가 인덱스를 생성하는 과정에서 발생하는 출력일 가능성이 높음.
 
4o

나의 말:

WITH MaxTransaction AS ( SELECT MainNumber, SubNumber, ComplexName, AreaSquareMeters, TransactionAmount, ContractYearMonth, Floor, ROW_NUMBER() OVER ( PARTITION BY MainNumber, SubNumber, ComplexName, AreaSquareMeters ORDER BY TransactionAmount DESC, ContractYearMonth DESC, Floor DESC ) AS RowNum FROM ANESTATEAPTALL WHERE (TransactionType = '중개거래' OR NOT EXISTS (SELECT 1 FROM ANESTATEAPTALL WHERE TransactionType = '중개거래')) AND CityCounty LIKE '인천광역시%' ), MinTransaction AS ( SELECT MainNumber, SubNumber, ComplexName, AreaSquareMeters, TransactionAmount, ContractYearMonth, Floor, ROW_NUMBER() OVER ( PARTITION BY MainNumber, SubNumber, ComplexName, AreaSquareMeters ORDER BY TransactionAmount ASC, ContractYearMonth ASC, Floor ASC ) AS RowNum FROM ANESTATEAPTALL WHERE (TransactionType = '중개거래' OR NOT EXISTS (SELECT 1 FROM ANESTATEAPTALL WHERE TransactionType = '중개거래')) AND CityCounty LIKE '인천광역시%' ) SELECT ROW_NUMBER() OVER () AS DescendingNumber, m.MainNumber, m.SubNumber, m.ComplexName, m.AreaSquareMeters AS 평형대, m.TransactionAmount AS MAX_금액, m.ContractYearMonth AS MAX_매매일자, m.Floor AS MAX_층수, n.TransactionAmount AS MIN_금액, n.ContractYearMonth AS MIN_매매일자, n.Floor AS MIN_층수, (m.TransactionAmount - n.TransactionAmount) AS AliasCapitalGain, '032' FROM MaxTransaction m JOIN MinTransaction n ON m.MainNumber = n.MainNumber AND m.SubNumber = n.SubNumber AND m.ComplexName = n.ComplexName AND m.AreaSquareMeters = n.AreaSquareMeters WHERE m.RowNum = 1 AND n.RowNum = 1 ORDER BY AliasCapitalGain ASC LIMIT 60; 위의 SQL를 보고 INDEX를 생성하고 싶습니다. sqlite3.exe 로 생성하고자 합니다. 생성하는 파일은 C:\Users\B210145_BK\Downloads\EstateDotNet\EstateStatisticsNodeSearch\RedisTickServer 디렉터리 2025-02-20 오후 12:18 414,756,864 database_all_total.db
 

ChatGPT의 말:

📌 SQLite에서 성능 최적화를 위한 INDEX 생성

현재 쿼리는 ANESTATEAPTALL 테이블에서 최고가/최저가 거래를 찾고, 이를 비교하여 차익을 계산하는 작업을 수행합니다.
특히 WHERE, JOIN, ORDER BY에 자주 사용되는 컬럼에 대한 인덱스를 추가하면 성능을 향상시킬 수 있습니다.


🔍 쿼리에서 중요한 조건

  1. WHERE 절에서 검색 조건이 사용되는 컬럼
    • TransactionType
    • CityCounty
  2. PARTITION BY 및 JOIN에 사용되는 컬럼 (동일한 기준으로 매칭 필요)
    • MainNumber
    • SubNumber
    • ComplexName
    • AreaSquareMeters
  3. ORDER BY에 사용되는 컬럼 (최고/최저 금액을 찾기 위한 정렬)
    • TransactionAmount
    • ContractYearMonth
    • Floor

INDEX 생성 쿼리 (SQLite)

아래 인덱스를 생성하여 쿼리 성능을 향상시킬 수 있습니다.

sql
복사편집
-- 1. 거래 유형(TransactionType)과 지역(CityCounty)에 대한 필터링 최적화 CREATE INDEX idx_anestateaptall_citycounty_transaction ON ANESTATEAPTALL (CityCounty, TransactionType); -- 2. PARTITION BY 및 JOIN에 사용되는 컬럼 최적화 CREATE INDEX idx_anestateaptall_partition ON ANESTATEAPTALL (MainNumber, SubNumber, ComplexName, AreaSquareMeters); -- 3. 최대 및 최소 거래 금액 검색 최적화 (ORDER BY 에 사용되는 컬럼 포함) CREATE INDEX idx_anestateaptall_transaction_sort ON ANESTATEAPTALL (TransactionAmount DESC, ContractYearMonth DESC, Floor DESC);

📌 인덱스 최적화 이유

  • 첫 번째 인덱스 (idx_anestateaptall_citycounty_transaction)
    → CityCounty LIKE '인천광역시%' 검색을 빠르게 수행
    → TransactionType 필터링을 최적화
  • 두 번째 인덱스 (idx_anestateaptall_partition)
    → PARTITION BY 및 JOIN에 사용되는 컬럼을 효율적으로 조회
  • 세 번째 인덱스 (idx_anestateaptall_transaction_sort)
    → ORDER BY TransactionAmount DESC, ContractYearMonth DESC, Floor DESC 최적화

🚀 인덱스 생성 방법 (sqlite3.exe)

  1. sqlite3 실행
  2. nginx
    복사편집
    sqlite3 "C:\Users\B210145_BK\Downloads\EstateDotNet\EstateStatisticsNodeSearch\RedisTickServer\database_all_total.db"
  3. 인덱스 생성 SQL 실행
  4. pgsql
    복사편집
    CREATE INDEX idx_anestateaptall_citycounty_transaction ON ANESTATEAPTALL (CityCounty, TransactionType); CREATE INDEX idx_anestateaptall_partition ON ANESTATEAPTALL (MainNumber, SubNumber, ComplexName, AreaSquareMeters); CREATE INDEX idx_anestateaptall_transaction_sort ON ANESTATEAPTALL (TransactionAmount DESC, ContractYearMonth DESC, Floor DESC);
  5. 인덱스 확인
  6. csharp
    복사편집
    PRAGMA index_list('ANESTATEAPTALL');
  7. 쿼리 실행 후 성능 확인
  8. pgsql
    복사편집
    EXPLAIN QUERY PLAN <위의 SELECT 문>;

📈 추가 최적화 가능성

  1. 거래 타입이 항상 '중개거래' 또는 없는 경우만 검색됨
    → TransactionType이 NULL일 가능성이 있다면,
    CREATE INDEX idx_anestateaptall_transactiontype ON ANESTATEAPTALL (TransactionType);
    추가 고려 가능
  2. 매매가 상승/하락 정렬 속도 향상
    → AliasCapitalGain 기준으로 ORDER BY 성능이 필요하다면,
    CREATE INDEX idx_anestateaptall_capitalgain ON ANESTATEAPTALL (TransactionAmount); 고려 가능

이렇게 인덱스를 추가하면 SELECT 속도가 빨라지고, 특히 최고가/최저가 검색 시 성능이 개선될 것입니다.
적용 후 쿼리 실행 속도가 어느 정도 개선되는지 확인해보면 좋을 것 같네요! 🚀

 
4o

나의 말:

C:\Users\B210145_BK\Downloads\sqlite-tools-win-x64-3480000>sqlite3 "C:\Users\B210145_BK\Downloads\EstateDotNet\EstateStatisticsNodeSearch\RedisTickServer\database_all_total.db" SQLite version 3.48.0 2025-01-14 11:05:00 Enter ".help" for usage hints. sqlite> CREATE INDEX idx_anestateaptall_partition ON ANESTATEAPTALL (MainNumber, SubNumber, ComplexName, AreaSquareMeters); C:\Users\B210145_BK\Downloads\sqlite-tools-win-x64-3480000> 프롬프트로 바로 빠져나와 버린다면?
 

ChatGPT의 말:

프롬프트에서 SQLite를 실행하고 CREATE INDEX 명령을 실행한 후 에러 메시지 없이 바로 종료되는 경우, 몇 가지 원인을 확인해야 합니다.


🔍 가능한 원인 및 해결 방법

1. SQLite 실행 중 오류로 인해 비정상 종료 (Crash)

  • 해결 방법:
    SQLite를 다시 실행하고, 데이터베이스가 정상적으로 열리는지 확인합니다.
    sh
    복사편집
    sqlite3 "C:\Users\B210145_BK\Downloads\EstateDotNet\EstateStatisticsNodeSearch\RedisTickServer\database_all_total.db"
    정상적으로 열리면 .tables 명령어를 입력하여 테이블 목록을 확인해 보세요.
    sql
    복사편집
    .tables
    → 만약 SQLite가 바로 종료된다면, 데이터베이스 파일이 손상되었을 가능성이 있습니다.
    (아래 "데이터베이스 손상 가능성" 해결 방법 참고)

2. 테이블이 존재하지 않음 (ANESTATEAPTALL이 없음)

  • CREATE INDEX 실행 시 대상 테이블이 존재하지 않으면 SQLite가 에러 없이 종료될 수도 있음
  • 해결 방법:
    SQLite 실행 후 테이블 존재 여부를 먼저 확인
    sql
    복사편집
    .tables
    또는
    sql
    복사편집
    SELECT name FROM sqlite_master WHERE type='table' AND name='ANESTATEAPTALL';
    → 결과가 없다면, 테이블이 존재하지 않는 것이므로 인덱스 생성이 불가능합니다.

3. 기존에 동일한 인덱스가 이미 존재함

  • SQLite에서 동일한 이름의 인덱스를 다시 생성하려고 하면 충돌이 발생할 수 있음.
  • 해결 방법:
    먼저 인덱스가 존재하는지 확인합니다.
    sql
    복사편집
    SELECT name FROM sqlite_master WHERE type='index' AND name='idx_anestateaptall_partition';
    → 결과가 있다면 기존 인덱스를 삭제하고 다시 생성할 수 있습니다.
    sql
    복사편집
    DROP INDEX idx_anestateaptall_partition; CREATE INDEX idx_anestateaptall_partition ON ANESTATEAPTALL (MainNumber, SubNumber, ComplexName, AreaSquareMeters);

4. 데이터베이스 파일이 손상됨

  • SQLite 데이터베이스 (database_all_total.db)가 크거나 손상된 경우,
    특정 명령어 실행 시 비정상 종료될 가능성이 있음.
  • 해결 방법:
    데이터베이스 무결성 검사 실행
    sql
    복사편집
    PRAGMA integrity_check;
    만약 손상되었다는 메시지가 나온다면, 백업 후 복구해야 합니다.
    백업 후 새 DB로 데이터 옮기기
    sh
    복사편집
    sqlite3 database_all_total.db ".dump" > backup.sql sqlite3 new_database.db < backup.sql

5. 인덱스 생성 중 메모리 부족

  • 데이터베이스 크기가 크거나 인덱스가 많은 경우,
    메모리 부족으로 SQLite가 종료될 가능성이 있음.
  • 해결 방법:
    SQLite 실행 후 설정을 늘려봅니다.
    sql
    복사편집
    PRAGMA cache_size = 100000; PRAGMA temp_store = MEMORY; PRAGMA synchronous = OFF;
    그리고 다시 CREATE INDEX 실행.

🔥 추천 해결 순서

1️⃣ SQLite 다시 실행 → .tables 확인
2️⃣ 테이블 존재 확인 (SELECT name FROM sqlite_master ...)
3️⃣ 기존 인덱스 존재 확인 (SELECT name FROM sqlite_master WHERE type='index' ...)
4️⃣ PRAGMA integrity_check 실행하여 데이터베이스 무결성 확인
5️⃣ 메모리 설정 조정 후 다시 시도

위 과정으로도 해결되지 않으면, 데이터베이스 손상 가능성이 크므로 백업 후 복구하는 것이 가장 확실한 방법입니다! 🚀

 
4o

나의 말:

sqlite> CREATE INDEX idx_anestateaptall_citycounty_transaction ON ANESTATEAPTALL (CityCounty, TransactionType); (x1...> (x1...> (x1...> 위의 "(x1...>" 표시는 무슨뜻인가요?
 

ChatGPT의 말:

SQLite 프롬프트에서 CREATE INDEX 실행 시 (x1...> 같은 메시지가 출력되는 것은 인덱스 생성 중에 진행 상황을 표시하는 SQLite의 내부 출력 형식일 가능성이 높습니다.

이것은 특히 데이터베이스가 크거나, 인덱스 생성에 시간이 오래 걸릴 때 나타날 수 있습니다.


🔍 원인

  1. SQLite가 대량의 데이터를 처리 중
    • CREATE INDEX는 테이블의 모든 데이터를 스캔하여 정렬 후 저장해야 하므로 시간이 걸릴 수 있습니다.
    • 이 과정에서 SQLite는 내부적으로 페이지를 읽고 쓰면서 (x1...) 같은 진행 상태를 표시할 수 있습니다.
    • 만약 데이터베이스가 크다면 몇 분~수십 분까지 걸릴 수도 있습니다.
  2. 터미널 출력 방식에 따른 현상
    • 특정 환경 (예: Windows 명령 프롬프트, Git Bash 등)에서는 SQLite 내부에서 버퍼링된 메시지를 이상한 형식으로 출력할 수도 있습니다.
    • 예를 들어, SQLite는 압축된 로그 출력을 사용할 수도 있으며, 일부 환경에서 올바르게 해석되지 않을 수 있습니다.

해결 방법

1. 진행 중이라면 기다리기

  • SQLite에서 특별한 오류 없이 인덱스를 생성하는 중일 가능성이 높으므로,
    CPU 사용량을 확인하면서 조금 더 기다려보세요.
  • database_all_total.db가 크다면 시간이 오래 걸릴 수 있습니다.

2. 인덱스 생성이 끝났는지 확인

  • SQLite가 아직 실행 중이라면, 다른 명령을 입력해보세요.
  • sql
    복사편집
    .tables
  • 만약 반응이 없다면, 인덱스 생성이 아직 진행 중일 가능성이 높습니다.
  • 또는 인덱스 목록을 확인하여 정상적으로 생성되었는지 체크합니다.
  • sql
    복사편집
    SELECT name FROM sqlite_master WHERE type='index';

3. 강제 종료 후 다시 시도

  • 만약 너무 오래 걸리거나 반응이 없다면, SQLite를 강제 종료 (Ctrl + C)하고 다시 실행할 수 있습니다.
  • 이후, 이미 생성된 인덱스가 있다면 삭제 후 다시 생성합니다.
    sql
    복사편집
    DROP INDEX IF EXISTS idx_anestateaptall_citycounty_transaction; CREATE INDEX idx_anestateaptall_citycounty_transaction ON ANESTATEAPTALL (CityCounty, TransactionType);

4. SQLite 실행 모드 변경 (Windows)

  • SQLite를 실행할 때, 명령 프롬프트(cmd) 대신 PowerShell을 사용하면 출력을 다르게 볼 수 있습니다.
  • 또는 SQLite를 "quiet mode"로 실행하여 불필요한 메시지를 줄일 수도 있습니다.
    sh
    복사편집
    sqlite3 -batch "C:\Users\B210145_BK\Downloads\EstateDotNet\EstateStatisticsNodeSearch\RedisTickServer\database_all_total.db"

🚀 결론

  • (x1...) 표시는 SQLite가 인덱스를 생성하는 과정에서 발생하는 출력일 가능성이 높음.
  • DB가 크면 시간이 오래 걸릴 수 있으므로 조금 더 기다리거나, 진행 상태를 확인할 것.
  • 너무 오래 걸리면 강제 종료 후 다시 실행하거나, 메모리 설정을 조정하여 성능을 개선할 것.

필요한 경우, 인덱스를 더 작은 부분부터 생성하면서 성능 테스트를 해볼 수도 있습니다. 🚀

 

SQLite 테이블에 인덱스 생성하기(.feat sqlite3.exe)
 
4o

 

CREATE TABLE ESTATENAVERALLINFOATTACH ( DATACLASS VARCHAR(2), INFOMARKETCLASS VARCHAR(3), TRANSACTIONTIME VARCHAR(14), COMPLEXNO VARCHAR(15), COMPLEXNAME VARCHAR(40), CORTARNO VARCHAR(20), REALESTATETYPECODE VARCHAR(20), REALESTATETYPENAME VARCHAR(20), USEAPPROVEYMD VARCHAR(20), CORTARADDRESS VARCHAR(400), MINPRICEBYLETTER VARCHAR(20), MAXPRICEBYLETTER VARCHAR(20), MINLEASEPRICEBYLETTER VARCHAR(20), MAXLEASEPRICEBYLETTER VARCHAR(20), MINPRICE VARCHAR(20), MAXPRICE VARCHAR(20), MINLEASEPRICE VARCHAR(20), MAXLEASEPRICE VARCHAR(20), LNBRMNNM VARCHAR(20), LNBRSLNO VARCHAR(20), ENDTEXT VARCHAR(1) ) SELECT DataClass,InfoMarketClass,TransactionTime,ComplexNo,CortarNo,RealEstateTypeCode,RealEstateTypeName,UseApproveYmd,CortarAddress,MinPriceByLetter,MaxPriceByLetter,MinLeasePriceByLetter,MaxLeasePriceByLetter,MinPrice,MaxPrice,MinLeasePrice,MaxLeasePrice FROM ESTATENAVERALLINFOATTACH WHERE CORTARADDRESS = '인천시 연수구 송도동' AND LNBRMNNM = '110' AND LNBRSLNO = '0' LIMIT 1; SQLite 쿼리인데, 테이블조회를 빠르게 하려면 인덱스를 생성하고 싶습니다. sqlite3.exe 를 이용해서 인덱스를 생성하는 방법은?
 

ChatGPT의 말:

SQLite에서 테이블 조회 속도를 높이려면 적절한 인덱스를 생성해야 합니다.
특히, WHERE 조건에서 자주 사용되는 컬럼(CORTARADDRESS, LNBRMNNM, LNBRSLNO)에 인덱스를 설정하면 조회 속도가 빨라집니다.

1. 인덱스 생성 (sqlite3.exe에서 실행)

먼저 SQLite 명령줄에서 sqlite3.exe를 실행한 후, 아래 SQL을 입력하세요.

sql
복사편집
CREATE INDEX idx_cortar_lnbr ON ESTATENAVERALLINFOATTACH (CORTARADDRESS, LNBRMNNM, LNBRSLNO);

2. 인덱스 확인

인덱스가 잘 생성되었는지 확인하려면 아래 명령을 실행하세요.

sql
복사편집
PRAGMA index_list(ESTATENAVERALLINFOATTACH);

3. 인덱스 사용 확인 (실행 계획 확인)

쿼리 실행 전에 인덱스를 사용하는지 확인하려면 EXPLAIN QUERY PLAN을 사용하세요.

sql
복사편집
EXPLAIN QUERY PLAN SELECT DataClass, InfoMarketClass, TransactionTime, ComplexNo, CortarNo, RealEstateTypeCode, RealEstateTypeName, UseApproveYmd, CortarAddress, MinPriceByLetter, MaxPriceByLetter, MinLeasePriceByLetter, MaxLeasePriceByLetter, MinPrice, MaxPrice, MinLeasePrice, MaxLeasePrice FROM ESTATENAVERALLINFOATTACH WHERE CORTARADDRESS = '인천시 연수구 송도동' AND LNBRMNNM = '110' AND LNBRSLNO = '0' LIMIT 1;

결과에 "USING INDEX idx_cortar_lnbr"와 같은 문구가 있으면 인덱스가 적용된 것입니다.

추가 최적화

  • ANALYZE; 명령을 실행하면 SQLite가 쿼리 최적화를 위해 통계를 수집합니다.
  • VACUUM; 명령을 실행하면 데이터베이스 파일을 최적화하여 성능을 높일 수 있습니다.

필요하면 추가 인덱스를 생성할 수도 있으니, 쿼리 실행 계획을 확인해보고 최적화하세요! 🚀

 
4o

나의 말:

C:\Users\B210145_BK\Downloads\EstateDotNet\EstateStatisticsNodeSearch\RedisTickServer 디렉터리 2025-02-18 오후 03:36 11,718,656 naver_attach_estate_info_file.db 위의 파일입니다. sqlite3.exe 를 이용해서 인덱스생성 방법을 자세히 설명해주세요
 

ChatGPT의 말:

SQLite3에서 sqlite3.exe를 사용하여 인덱스를 생성하는 과정을 자세히 설명해 드리겠습니다.


1. SQLite3 실행하기

먼저 **명령 프롬프트(cmd)**를 열고 sqlite3.exe를 실행합니다.

  1. 명령 프롬프트(cmd) 실행
    • 윈도우 + R 키 → cmd 입력 후 실행
  2. SQLite3 실행
    SQLite3가 설치된 디렉터리로 이동한 후, 데이터베이스를 엽니다.
    (예: sqlite3.exe가 C:\sqlite3\에 설치된 경우)참고: sqlite3.exe의 경로가 C:\sqlite3\sqlite3.exe라면 C:\sqlite3\sqlite3.exe를 직접 실행해도 됩니다.
  3. sh
    복사편집
    cd C:\sqlite3\ sqlite3 "C:\Users\B210145_BK\Downloads\EstateDotNet\EstateStatisticsNodeSearch\RedisTickServer\naver_attach_estate_info_file.db"

2. 데이터베이스 확인

데이터베이스가 정상적으로 열렸는지 확인합니다.

sql
복사편집
.tables

이 명령을 실행하면 ESTATENAVERALLINFOATTACH 테이블이 목록에 표시되어야 합니다.


3. 기존 인덱스 확인

기존에 생성된 인덱스가 있는지 확인합니다.

sql
복사편집
PRAGMA index_list(ESTATENAVERALLINFOATTACH);

만약 적절한 인덱스가 없다면 새로운 인덱스를 생성합니다.


4. 인덱스 생성

이제 CORTARADDRESS, LNBRMNNM, LNBRSLNO 컬럼을 이용해 인덱스를 생성합니다.

sql
복사편집
CREATE INDEX idx_cortar_lnbr ON ESTATENAVERALLINFOATTACH (CORTARADDRESS, LNBRMNNM, LNBRSLNO);

이제 인덱스가 생성되었습니다.


5. 인덱스 생성 확인

인덱스가 잘 생성되었는지 확인하려면 다시 PRAGMA index_list를 실행합니다.

sql
복사편집
PRAGMA index_list(ESTATENAVERALLINFOATTACH);

또한, 생성된 인덱스의 세부 정보를 확인하려면 아래 명령을 실행하세요.

sql
복사편집
PRAGMA index_info(idx_cortar_lnbr);

6. 인덱스 사용 여부 확인

쿼리가 인덱스를 사용하는지 확인하려면 EXPLAIN QUERY PLAN을 실행하세요.

sql
복사편집
EXPLAIN QUERY PLAN SELECT DataClass, InfoMarketClass, TransactionTime, ComplexNo, CortarNo, RealEstateTypeCode, RealEstateTypeName, UseApproveYmd, CortarAddress, MinPriceByLetter, MaxPriceByLetter, MinLeasePriceByLetter, MaxLeasePriceByLetter, MinPrice, MaxPrice, MinLeasePrice, MaxLeasePrice FROM ESTATENAVERALLINFOATTACH WHERE CORTARADDRESS = '인천시 연수구 송도동' AND LNBRMNNM = '110' AND LNBRSLNO = '0' LIMIT 1;

실행 결과에 "USING INDEX idx_cortar_lnbr" 같은 문구가 포함되어 있으면 인덱스가 적용된 것입니다.


7. 최적화 (선택 사항)

인덱스를 생성한 후 성능을 더 높이려면 아래 명령을 실행하세요.

sql
복사편집
ANALYZE; VACUUM;
  • ANALYZE; → 통계 정보를 업데이트하여 SQLite의 쿼리 최적화를 돕습니다.
  • VACUUM; → 데이터베이스 파일을 정리하여 크기를 줄이고 성능을 개선합니다.

요약

  1. SQLite3 실행: sqlite3 "파일 경로"
  2. 테이블 확인: .tables
  3. 기존 인덱스 확인: PRAGMA index_list(테이블명);
  4. 새 인덱스 생성: CREATE INDEX idx_cortar_lnbr ON 테이블명(컬럼1, 컬럼2, 컬럼3);
  5. 인덱스 확인: PRAGMA index_list(테이블명);
  6. 인덱스 적용 여부 확인: EXPLAIN QUERY PLAN SELECT ...
  7. 최적화 실행: ANALYZE; 및 VACUUM;

이제 sqlite3.exe를 이용해 인덱스를 빠르게 생성하고 최적화할 수 있습니다! 🚀

 
4o

나의 말:

SELECT CityCounty,LotNumber,TransactionAmount,Building,Buyer,Seller,ConstructionYear,RoadName,CancellationReasonDate,TransactionType,BrokerLocation,RegistrationDate FROM ANESTATEAPTALL WHERE MainNumber = '17' AND SubNumber = '5' AND ComplexName = '송도더샵하버뷰(D13)' AND AreaSquareMeters = '118.459' LIMIT 1 C:\Users\B210145_BK\Downloads\EstateDotNet\EstateStatisticsNodeSearch\RedisTickServer 디렉터리 2025-02-19 오후 03:07 344,907,776 database_all_total.db CREATE TABLE ANESTATEAPTALL ( Nnumber INTEGER, RepeatNumber INTEGER, CityCounty TEXT, LotNumber TEXT, MainNumber TEXT, SubNumber TEXT, ComplexName TEXT, AreaSquareMeters REAL, ContractYearMonth TEXT, ContractDate TEXT, TransactionAmount REAL, Building TEXT, Floor INTEGER, Buyer TEXT, Seller TEXT, ConstructionYear INTEGER, RoadName TEXT, CancellationReasonDate TEXT, TransactionType TEXT, BrokerLocation TEXT, RegistrationDate TEXT, HousingType TEXT ) 위의 테이블도 인덱스를 생성해주세요
 

ChatGPT의 말:

SQLite3를 이용한 인덱스 생성 (ANESTATEAPTALL 테이블)

1. SQLite3 실행

명령 프롬프트(cmd)에서 SQLite3을 실행하여 database_all_total.db 파일을 엽니다.

sh
복사편집
cd C:\sqlite3\ sqlite3 "C:\Users\B210145_BK\Downloads\EstateDotNet\EstateStatisticsNodeSearch\RedisTickServer\database_all_total.db"

2. 기존 인덱스 확인

이미 인덱스가 존재하는지 확인합니다.

sql
복사편집
PRAGMA index_list(ANESTATEAPTALL);

만약 적절한 인덱스가 없다면 아래와 같이 생성합니다.


3. 인덱스 생성

조회 성능을 향상시키기 위해 WHERE 조건에 자주 사용되는 컬럼(MainNumber, SubNumber, ComplexName, AreaSquareMeters)에 대해 인덱스를 생성합니다.

sql
복사편집
CREATE INDEX idx_apt_search ON ANESTATEAPTALL (MainNumber, SubNumber, ComplexName, AreaSquareMeters);

이제 인덱스가 생성되었습니다.


4. 인덱스 생성 확인

인덱스가 잘 생성되었는지 확인합니다.

sql
복사편집
PRAGMA index_list(ANESTATEAPTALL);

생성된 인덱스의 세부 정보를 보려면:

sql
복사편집
PRAGMA index_info(idx_apt_search);

5. 인덱스 사용 여부 확인

인덱스가 실제로 사용되는지 확인하기 위해 EXPLAIN QUERY PLAN을 실행합니다.

sql
복사편집
EXPLAIN QUERY PLAN SELECT CityCounty, LotNumber, TransactionAmount, Building, Buyer, Seller, ConstructionYear, RoadName, CancellationReasonDate, TransactionType, BrokerLocation, RegistrationDate FROM ANESTATEAPTALL WHERE MainNumber = '17' AND SubNumber = '5' AND ComplexName = '송도더샵하버뷰(D13)' AND AreaSquareMeters = '118.459' LIMIT 1;

결과에 "USING INDEX idx_apt_search"가 포함되어 있으면 인덱스가 적용된 것입니다.


6. 데이터베이스 최적화

인덱스를 추가한 후 성능을 최적화하려면 다음 명령을 실행하세요.

sql
복사편집
ANALYZE; VACUUM;
  • ANALYZE; → 테이블과 인덱스의 통계를 업데이트하여 SQLite의 쿼리 최적화를 돕습니다.
  • VACUUM; → 데이터베이스 파일을 정리하여 크기를 줄이고 성능을 향상시킵니다.

요약

  1. SQLite3 실행: sqlite3 "database_all_total.db"
  2. 기존 인덱스 확인: PRAGMA index_list(ANESTATEAPTALL);
  3. 새 인덱스 생성:
    sql
    복사편집
    CREATE INDEX idx_apt_search ON ANESTATEAPTALL (MainNumber, SubNumber, ComplexName, AreaSquareMeters);
  4. 인덱스 확인: PRAGMA index_list(ANESTATEAPTALL);
  5. 인덱스 적용 여부 확인: EXPLAIN QUERY PLAN SELECT ...
  6. 최적화 실행: ANALYZE; 및 VACUUM;

이제 ANESTATEAPTALL 테이블에서 빠르게 데이터를 조회할 수 있습니다! 🚀

 
4o

나의 말:

sqlite> CREATE INDEX idx_apt_search ON ANESTATEAPTALL (MainNumber, SubNumber, ComplexName); sqlite> sqlite> sqlite> sqlite> sqlite> PRAGMA index_list(ANESTATEAPTALL); 0|idx_apt_search|0|c|0 sqlite> PRAGMA index_info(idx_apt_search); 0|4|MainNumber 1|5|SubNumber 2|6|ComplexName sqlite> sqlite> 종료하는 명령어는?
 

ChatGPT의 말:

SQLite3에서 종료하는 명령어는 다음 중 하나를 사용하면 됩니다.

1. .exit 또는 .quit 명령어 사용 (권장)

sql
복사편집
.exit

또는

sql
복사편집
.quit

이 둘 중 하나를 입력하면 SQLite3이 종료됩니다.


2. Ctrl + D 키 사용 (Linux/macOS)

Linux 또는 macOS에서 SQLite3을 실행 중이라면 Ctrl + D 키를 눌러 종료할 수도 있습니다.


3. Ctrl + C 키 사용 (강제 종료)

만약 SQLite가 응답하지 않거나 즉시 종료하고 싶다면 **Ctrl + C**를 누르면 강제 종료됩니다.

이제 안전하게 SQLite를 종료할 수 있습니다! 😊

국토교통부 실거래가 매매가격 통계조회(조건추가)

조회조건)
1. 매매거래차이 DESC
2. 국토교통부 실거래가 매매가격 DESC
3. (최대매매-최소매매)/(최대매매)*100.0 - 같은아파트,같은평형 DESC
4. (최대매매-최소매매)/(최대매매)*100.0 - 같은아파트,같은평형 ASC

비고)화면이 늦게 나오므로, 인덱스생성

[2025-02-20 12:20:06]>SELECT CityCounty,LotNumber,TransactionAmount,Building,Buyer,Seller,ConstructionYear,RoadName,CancellationReasonDate,TransactionType,BrokerLocation,RegistrationDate FROM ANESTATEAPTALL WHERE MainNumber = '18' AND SubNumber = '10' AND ComplexName = '송도더샵하버뷰(D14)' AND AreaSquareMeters = '101.454' LIMIT 1
[2025-02-20 12:20:06]>SELECT DataClass,InfoMarketClass,TransactionTime,ComplexNo,CortarNo,RealEstateTypeCode,RealEstateTypeName,UseApproveYmd,CortarAddress,MinPriceByLetter,MaxPriceByLetter,MinLeasePriceByLetter,MaxLeasePriceByLetter,MinPrice,MaxPrice,MinLeasePrice,MaxLeasePrice FROM ESTATENAVERALLINFOATTACH WHERE CORTARADDRESS = '인천시 연수구 송도동' AND LNBRMNNM = '18' AND LNBRSLNO = '10' LIMIT 1;
[2025-02-20 12:20:06]>SELECT CityCounty,LotNumber,TransactionAmount,Building,Buyer,Seller,ConstructionYear,RoadName,CancellationReasonDate,TransactionType,BrokerLocation,RegistrationDate FROM ANESTATEAPTALL WHERE MainNumber = '21' AND SubNumber = '59' AND ComplexName = '인천송도힐스테이트3단지' AND AreaSquareMeters = '142.359' LIMIT 1
[2025-02-20 12:20:06]>SELECT DataClass,InfoMarketClass,TransactionTime,ComplexNo,CortarNo,RealEstateTypeCode,RealEstateTypeName,UseApproveYmd,CortarAddress,MinPriceByLetter,MaxPriceByLetter,MinLeasePriceByLetter,MaxLeasePriceByLetter,MinPrice,MaxPrice,MinLeasePrice,MaxLeasePrice FROM ESTATENAVERALLINFOATTACH WHERE CORTARADDRESS = '인천시 연수구 송도동' AND LNBRMNNM = '21' AND LNBRSLNO = '59' LIMIT 1;
Microsoft Windows [Version 10.0.19045.2965]
(c) Microsoft Corporation. All rights reserved.

>sqlite3 "naver_attach_estate_info_file.db"
SQLite version 3.48.0 2025-01-14 11:05:00
Enter ".help" for usage hints.
sqlite> .tables
ESTATENAVERALLINFOATTACH
sqlite> PRAGMA index_list(ESTATENAVERALLINFOATTACH);
sqlite> CREATE INDEX idx_cortar_lnbr ON ESTATENAVERALLINFOATTACH (CORTARADDRESS, LNBRMNNM, LNBRSLNO);
sqlite> PRAGMA index_list(ESTATENAVERALLINFOATTACH);
0|idx_cortar_lnbr|0|c|0
sqlite> PRAGMA index_info(idx_cortar_lnbr);
0|9|CORTARADDRESS
1|18|LNBRMNNM
2|19|LNBRSLNO

>sqlite3 "database_all_total.db"
SQLite version 3.48.0 2025-01-14 11:05:00
Enter ".help" for usage hints.
sqlite> PRAGMA index_list(ANESTATEAPTALL);
sqlite> CREATE INDEX idx_apt_search ON ANESTATEAPTALL (MainNumber, SubNumber, ComplexName, AreaSquareMeters);
sqlite> PRAGMA index_list(ANESTATEAPTALL);
0|idx_apt_search|0|c|0
sqlite> PRAGMA index_info(idx_apt_search);
0|4|MainNumber
1|5|SubNumber
2|6|ComplexName
sqlite> .exit

index.html
0.02MB

+ Recent posts