개발자가 되고 싶은 사람

181022_diff_between_count(*)_count(column_name)

|

count(*) and count(column_name) 사용의 차이

상황

  • 카우치디비로 데이터를 가져오는데, count(field_name)으로 가져오는 쿼리의 처리속도가 몇초가량이 나왔다..
  • 확인해보니 조건을 준 필드네임에 대해 인덱스가 걸린 것도 아니었고, count(*)로 바꾼 결과 처리속도가 몇ms로 월등이 향상되었다.

그래서, 차이가 났던 이유는?

  • 스택오버플로우에 많은 설명들이 있어서 가져와보았다.
  • COUNT(*) counts all rows in the result set (or group if using GROUP BY).
  • count(*) –> row를 센다.
  • COUNT(column_name) only counts those rows where column_name is NOT NULL. This may be slower in some situations even if there are no NULL values because the value has to be checked (unless the column is not nullable).
  • count(*) counts NULLs and count(column) does not
  • COUNT(1) is the same as COUNT(*) since 1 can never be NULL.
  • 단, 인덱스가 걸린 필드에 대해선 count(field)가 더 빠르고, 특히 해당 필드가 수치인 경우에 더 빠르다.

  • 예시 ``` create table #bla(id int,id2 int) insert #bla values(null,null) insert #bla values(1,null) insert #bla values(null,1) insert #bla values(1,null) insert #bla values(null,1) insert #bla values(1,null) insert #bla values(null,null)

select count(*),count(id),count(id2) from #bla

```

  • 결과 results 7 3 2

카우치디비에서의 경우…

  • 아무리 그래도, 한 버킷에서 로우가 몇백개 밖에 안되는데,,, 10몇초와 몇ms의 차이는 너무 심한 것 같아 구글링을 해보았다.
  • 내가 사용한 couchbase version : Community Edition 5.0.1 build 5003.
  • https://forums.couchbase.com/t/n1ql-count-slow-with-where/8921/5
  • 질문자의 카우치 버전과 내가 사용하는 버전차이가 있지만, count(field_name)로 했을때 느리다는 상황은 비슷한것 같다..
  • 그래서 카우치베이스쪽에서 어떻게 쿼리를 쓰고, 인덱스를 어떻게 주라는 답변이 써져 있는데,, 아무튼 이런 이슈가 있었고, 나는 count(*)를 써서 해결하였다.

결론

  • 특정 컬럼에 대해 인덱스를 줬다면 count(column_name)을 쓰고,
  • row를 전부 카운트해도 되는 조건이라면 그렇게 사용하기.
  • 그리고, 쿼리를 작성하면 항상 처리속도를 따져보자!!!

table 의 row수를 카운트하는법 (DBMS)

실시간으로 데이터를 가져와야하는 애플리케이션에서 select count(*) from tables와 같은 쿼리를 하면 데이터 건수가 적을 때에는 문제가 없지만 많아지면 많아질수록 성능상 문제가 커집니다. 그래서 일반적으로 전체 데이터 건수를 저장하기 위한 별도 테이블을 두어서 해결합니다. 예를 들어 게시판 애플리케이션에서는 게시판 목록을 가져오기 위해 게시판 건수 테이블을 만들어서 게시물을 insert할 때마다 +1을 하고, delete할 때 -1을 하는 식입니다. 그리고, 게시물 insert 쿼리와 건수 update 쿼리를 하나의 트랜잭션으로 묶어서 데이터 무결성을 보장해야 하구요.

출처

  • https://stackoverflow.com/questions/59294/in-sql-whats-the-difference-between-countcolumn-and-count
  • https://stackoverflow.com/questions/2876909/count-and-countcolumn-name-whats-the-diff
  • (table 의 row수를 카운트하는법)[https://hashcode.co.kr/questions/1828/table-%EC%9D%98-row%EC%88%98%EB%A5%BC-%EC%B9%B4%EC%9A%B4%ED%8A%B8%ED%95%98%EB%8A%94%EB%B2%95]

jekyll Page build failure:Liquid syntax error 에러 해결

|

jekyll Page build failure error message - Liquid Exception: Liquid syntax error

  • GitHub Pages is designed to host your personal, organization, or project pages from a GitHub repository. Your site is having problems building: Page build failed. For more information, see https://help.github.com/articles/troubleshooting-github-pages-builds/.

  • trouble shooting 가이드를 따라가다가 이해가 안가서,
  • 집에 도착해 빌드에러가 나던 페이지를 jekyll build후 jekyll serve를 돌려보니 아레의 에러를 확인할 수 있다..

    Liquid Exception: Liquid syntax error (line 19): ‘end’ is not a valid delimiter for highlight tags. use endhighlight in C:/Ruby23-x64/bin/blog/_posts/2018-06-11-180611-bitblog/_posts/2018-06-11-180611-bitcoin-cli-1.md jekyll 3.7.3 | Error: Liquid syntax error (line 19): ‘end’ is not a valid delimiter for highlight tags. use endhighlight PS C:\Ruby23-x64\bin\blog> jekyll serve Configuration file: C:/Ruby23-x64/bin/blog/_config.yml Source: C:/Ruby23-x64/bin/blog Destination: C:/Ruby23-x64/bin/blog/_site Incremental build: disabled. Enable with –incremental Generating… Liquid Exception: Liquid syntax error (line 73): ‘end’ is not a valid delimiter for highlight tags. use endhighlight in C:/Ruby23-x64/bin/blog/_posts/2018-06-11-180611-bitcoin-cli-1.md

  • 결국 오타가 문제였다…^^ㅎ

What is the difference between accounts and addresses?

|

|

lombok

@JsonInclude(Include.NON_NULL)

  • Java의 json library jackson 사용법
  • Springframework를 사용할때, @ResponseBodyFH json형식으로 출력 중 값이 null인 항목을 제거하기 위한 방법.
  • 우리 소스에선 데이터를 response받을 때 처리할 때 사용

@JsonInclude(Include.NON_NULL) :

@Setter(AccessLevel.NONE) : AccessLevel.NONE 설정으로 특정 필드 등에 대한 자동 메소드 생성을 막을 수 있다.

  • pageurl이나, api등에 처리.

@ResponseBody로 json 형식으로 출력 중 값이 null인 항목 제거

  • 자바 직렬화, 병렬화, 역직렬화…

  • 직렬화라는 개념을 알아야 한다…
  • 이걸 왜 이렇게 처리하지?? json처리를 위해 하는것 같은데, 왜 이렇게 하지?? 이렇게 하는거 처음보는것 같은데…
  • json은 이기종간의 데이터를 쉽게, 빠르게 처리하게 해준다.
    • 여기서 이기종간이란 말은?
    • 데이터를 빠르고 쉽게 처리해준다는 말은?

출처

180611_bitcoin-cli-2

|

bitcoin-cli 2차 분석

Rawtransactions 부분

combinerawtransaction [“hexstring”,…]

  • 부분적으로 서명된 여러 트랜잭션을 하나의 트랜잭션으로 결합. 결합 된 트랜잭션은 부분적으로 서명된 다른 트랜잭션 또는 완전히 서명 된 트랜잭션 일 수 있다.

createrawtransaction

  • createrawtransaction [{"txid":"id","vout":n},...] {"address":amount,"data":"hex",...} ( locktime ) ( replaceable )
  • 주어진 입력을 소비하고 산출물을 생성하는 트랜잭션을 생성.
  • 출력은 주소 또는 데이터가 될 수 있다.
  • return : 16진수로 인코딩된 원시 트랜잭션을 반환한다. 거래의 입력은 서명되지 않았으며, 지갑에 저장되거나 네트워크로 전송되지 않는다.

decoderawtransaction “hexstring”

  • return : 직렬화되고 16진수로 인코딩된 트랜잭션을 나타내는 json object 반환

decodescript “hexstring”

  • 16진수로 인코딩 된 스크립트를 디코딩함.

fundrawtransaction “hexstring” ( options )

  • 요금을 계산하고 입력 사항을 추가하고 변경한다.(먼저, createrawtransaction를 사용해 원하는 출력값은 있고 입력이 없는 트랜잭션을 생성한다. 그 다음, fundrawtransaction를 사용해 요금을 계산하고 입력 사항을 변경..)
  • result : hex (string) : raw 트랜잭션의 결과(16진수 인코딩 문자열), fee (numeric) : 결과 거래가 지불하는 btc의 수수료, changepos (numeric) : 추가 된 변경 출력의 위치, 또는 -1

sendrawtransaction “hexstring” ( allowhighfees )

  • 원시 트랜잭션(직렬화, 16진수 인코딩)을 로컬 노드 및 네트워크에 제출한다.
  • createrawtransaction 및 signrawtransaction 호출도 참조.
  • return : hex (string) : 16진수의 트랜잭션 해시값.

signrawtransaction

  • signrawtransaction "hexstring" ( [{"txid":"id","vout":n,"scriptPubKey":"hex","redeemScript":"hex"},...] ["privatekey1",...] sighashtype )
  • 원시 트랜잭션(직렬화, 16진수 인코딩)에 대한 입력에 서명.
  • 두번째 인수 (선택적) : (null 가능) 이전 트랜잭션 출력의 배열. 이 거래는 블록체인에 달려 있지만 아직 블록체인에 없을 수도 있다.
  • 세번째 인수 (선택적) : (null 가능) base58로 encode 된 private키가 주어진 경우 트랜잭션 서명에 사용되는 유일한 키.

Util 부분

createmultisig nrequired [“key”,…]

  • m키의 n개의 서명이 필요한 다중 서명 주소를 만든다. 이는 주소와 redeemScript를 가진 json객체를 반환한다.

estimatefee nblocks(DEPRECATED)

  • deprecated.
  • estimatemartfee를 사용하기.
  • 거래 시작에 필요한 킬로바이트당 대력적인 비용 예상.

estimatesmartfee conf_target (“estimate_mode”)

  • 거래 시작에 필요한 킬로바이트 당 대략적인 비용을 예상.
  • 가능한 경우 conf_target 블록 내에서 확인하고 블록 수를 반환한다.
  • result :
    • feerate (numeric, optional) 킬로바이트 당 추정비용,
    • errors (json array of strings, optional) : 처리중 직면한 에러들,
    • blocks (numeric) 견적을 찾은 블록 번호.
  • ex :

    bitcoin-testnet~$ bitcoin-cli estimatesmartfee 6 { “feerate”: 0.00001000, “blocks”: 6 }

signmessagewithprivkey “privkey” “message”

  • 주소의 개인 키로 메시지 서명.
  • result : signature (string) base 64로 인코딩 된 메시지 서명

verifymessage “address” “signature” “message”

  • 서명된 메시지 확인.
  • result : ture false (boolean) 서명이 검증되었는지의 여부.

== Wallet ==

abortrescan

  • 예를 들어 현재 지갑 재검사를 중지합니다. importprivkey 호출에 의해.

addmultisigaddress nrequired [“key”,…] ( “account” )

  • nrequired-to-sign 다중 서명 주소를 지갑에 추가.
  • 각 키는 Bitcoin 주소 또는 16 진수로 인코딩 된 공개 키.
  • ‘account’가 지정되면 (DEPRECATED) 주소를 해당 계정에 할당.

addwitnessaddress “address”

  • 스크립트의 목격자 주소를 추가(pubkey 또는 redeemscript가 알려져 있음). 감시 스크립트를 반환.

backupwallet “destination”

  • 현재 Wallet 파일을 목적지에 안전하게 복사합니다.이 위치는 디렉토리 또는 파일 이름이있는 경로가 될 수 있습니다.

bumpfee “txid” ( options )

  • opt-in-RBF 거래 T의 수수료를 Bump로 대체하여 새로운 거래 B로 대체.주어진 txid를 가진 옵트 인 RBF 트랜잭션은 지갑에 있어야한다.
  • 명령은 변경 출력을 줄이거 나 제거하여 추가 비용을 지불한다.변경 출력이 증가 된 수수료를 충당 할 정도로 크지 않으면 명령이 현재 실패. 대신 새로운 입력을 추가하여 보상.

dumpprivkey “address”

  • ‘주소’에 해당하는 개인 키를 표시합니다. 그런 다음 importprivkey를이 출력과 함께 사용할 수 있습니다.

dumpwallet “filename”

  • 모든 지갑 키를 사람이 읽을 수있는 형식으로 덤프합니다.

encryptwallet “passphrase”

  • ‘passphrase’로 지갑을 암호화합니다. 이것은 처음 암호화 용입니다. 이 후에는 개인 키와 상호 작용하는 모든 호출(예 : 보내기 또는 서명)을 하기 전에 암호를 설정해야합니다.

getaccountaddress “account”

  • DEPRECATED.
  • replace : getlabeladdress
  • return : 이 계정으로 지불을 받기위한 현재 bitcoin 주소를 반환.

getwalletinfo

  • return : 다양한 지갑 상태정보가 포함된 객체를 반환.

getrawchangeaddress

  • return : 변경을 수신하기 위한 새 bitcoin 주소를 반환. 이것은 원시 트랜잭션과 사용하기 위한 것.

getreceivedbyaccount “account” ( minconf )

  • DEPRECATED.
  • replace : getreceivedbylabel
  • return : 적어도 [minconf]확인이있는 거래에서 가 있는 주소로받은 총 금액을 반환.

getreceivedbyaddress “address” ( minconf )

  • return : 최소 minconf확인이 있는 트랜잭션에서 주어진 주소로 수신한 총 금액을 반환.

getunconfirmedbalance

  • return : 서버의 미확인 balance 총계를 반환.

importaddress “address” ( “label” rescan p2sh )

  • 지갑에 있는 것처럼 보일 수 있지만 지출에 사용할 수 없는 스크립트 (16진수) 또는 주소를 추가한다.

importmulti “requests” ( “options” )

  • 주소 / 스크립트 가져 오기 (비공개 또는 공개 키 사용, 스크립트 (P2SH) 사용), 모든 주소를 한 번에 다시 검색 (옵션을 통해 다시 검색을 비활성화 할 수 있음)

importprivkey “bitcoinprivkey” ( “label” ) ( rescan )

  • dumpprivkey가 반환 한 개인 키를 지갑에 추가합니다.

importprunedfunds

  • 다시 스캔하지 않고 자금을 가져옵니다. 해당 주소 또는 스크립트는 이전에 지갑에 포함되어 있어야합니다. 가지 치기 한 지갑을 목표로합니다. 최종 사용자는 추가 트랜잭션을 가져 와서 가져온 출력을 나중에 소비하거나 트랜잭션이 포함 된 블록 체인 지점 이후에 다시 스캔 할 책임이 있습니다.

importpubkey “pubkey” ( “label” rescan )

  • 지갑에있는 것처럼 보일 수 있지만 지출에 사용할 수없는 공개 키 (16 진수)를 추가합니다.
  • 참고 : 이 호출은 재검색이 완료되면 완료하는데 몇 분이 걸릴 수 있다.

importwallet “filename”

  • Wallet 덤프 파일에서 키를 가져옵니다 (dumpwallet 참조).

keypoolrefill ( newsize )

  • keypool을 채운다.

listaccounts ( minconf include_watchonly)(DEPRECATED)

  • DEPRECATED.
  • replace : listlabels
  • return : 계정 이름을 키로, 계정 잔액을 값으로 갖는 개체를 반환.
  • account가 더이상 사용되지 않고 label로 대채되는 중???

listaddressgroupings

  • 공통 소유권을 가진 주소 그룹을 나열.
  • 입력으로 사용되거나 과거 거래에서 결과로 발생하는 변경으로 공용으로 사용된다.

listlockunspent

  • 일시적으로 추가 할 수 없는 출력 목록을 반환.
  • 지출을위한 트랜잭션 잠금 및 잠금 해제에 대해서는 lockunspent 호출을 참조

listreceivedbyaccount ( minconf include_empty include_watchonly)

  • DEPRECATED
  • replace : listreceivedbylabel
  • 계정별로 잔액을 나열.

listreceivedbyaddress ( minconf include_empty include_watchonly)

  • 수신 주소로 잔액 나열.
  • ex :

    bitcoin-testnet~$ bitcoin-cli listreceivedbyaddress 6 true [ { “address”: “mfbNCrQM4jkPXARW1jobixLW2RKVva4Z5z”, “account”: “abc”, “amount”: 0.00000000, “confirmations”: 0, “label”: “abc”, “txids”: [ ] }, …

listsinceblock ( “blockhash” target_confirmations include_watchonly include_removed )

  • [blockhash] 블록 이후의 모든 트랜잭션을 블록에서 가져 오거나, 생략 된 경우 모든 트랜잭션을 가져온다.
  • “blockhash”가 더 이상 주 체인의 일부가 아닌 경우, 분기 지점 이후의 트랜잭션이 포함.
  • 또한 include_removed가 설정된 경우, 제거 된 지갑에 영향을주는 트랜잭션이 “제거 된”배열에 반환

listtransactions ( “account” count skip include_watchonly)

  • ‘account’계정의 ‘from’트랜잭션을 건너 뛰는 가장 최근의 트랜잭션을 ‘count’
  • ex :

    bitcoin-cli listtransactions “* “ 20 100 { “account”: “evatransaction”, “category”: “move”, “time”: 1512092500, “amount”: 0.10000000, “otheraccount”: “7ebffe5e33d2455daaa246d65fb2dedd”, “comment”: “” }, …. ]

listwallets

  • return : 현재 로드된 지갑 목록.
  • 지갑에 대한 전체 정보를 보려면 “getwalletinfo”

lockunspent unlock ([{“txid”:”txid”,”vout”:n},…])

  • 임시로 출력 할 수 없는 출력 목록을 업데이트.
  • 지정된 트랜잭션 출력을 잠금 (unlock = false) 또는 잠금 해제 (unlock = true).

removeprunedfunds “txid”

  • 지갑에서 지정된 트랜잭션을 삭제한다.

sendmany

  • sendmany "fromaccount" {"address":amount,...} ( minconf "comment" ["address",...] replaceable conf_target "estimate_mode")
  • 여러 번 보낼때 사용. 양은 배정 밀도 부동 소수점 숫자입니다.

setaccount “address” “account” (DEPRECATED)

  • replace : setlabel
  • 주어진 주소와 관련된 계정을 설정

settxfee amount

  • kB 당 거래 수수료를 설정. paytxfee 매개 변수를 덮어 쓴다.
  • result : true false (boolean) 성공적으로 수행되면 true를 리턴.