728x90

$(document).ready(function(){

  // code
});

브라우저에서 DOM 트리를 생성하고난 후에 실행되게 되는 코드입니다.(DOM is ready)

$(window).load(function(){
  // code
});

모든 include 되는 프레임들과 object들, 이미지까지 로드된 이후에 실행됩니다.

document가 ready된 시점에는 DOM에 대한 접근만이 자유롭겠지만
아직 브라우저에서 다른 객체들이나 이미지들을 로드하지 않은 상황이므로
어떤 페이지를 사용자가 접근할 때 이미지에 대한 가공을 하려한다면 실패하게 되겠죠.
    하지만, window를 로드하고난 이후에 실행되는 코드들은
모든 객체나 프레임들(외부 contents를 담는 프레임까지),
이미지까지 모두 로드한 이후에 실행되므로
document에서 제한된 작업을 진행할 수 있겠습니다.
다만, 그렇게된다면 페이지의 로드타임만큼 사용자는
오랜 시간을 모니터앞에서 답답하게 기다려야하겠죠.

 

 

우선 jquery의 load, ready 메소드간의 차이점을 꼽자면
jquery 에서 load는 외부자원 접근(images, scripts, frames, iframes 등)과 window 객체에 대해 적용되는 메소드이며
ready는 document 객체에 한해서만 적용되는 메소드입니다.

window와 document 객체의 차이점에 대해서 안내해드리자면
window는 document의 부모객체로서 브라우저 자체를 의미할 수 있으며
접근할 수 있는 자식객체로는 document, self, navigator, screen, forms, history, location 등이 있으며
 HTML5에 대해서는 관련 서적을 살펴봐야겠네요^^;;
(이는 HTML4.0 기준으로 집필된 서적에서 서술된 내용이거든요;;)
 document 객체는 트리형태의 HTML 을 접근할 수 있는 객체입니다.
따라서 document는 html의 요소들이나 속성들을 접근할 때 사용하는 객체입니다.

종합하자면, 외부자원(src= <- 이건 웹서버에 요청(http request)을 날리겟다는 것으로 외부자원입니다) 이나
window 객체가 모두 로드되었을 때에 그 자원들을 가공할 필요가 있다면 $(window).load() 를 쓰시고,

그것이 아닌 브라우저에서 보이게 될 html 코드들에 대해서만 가공할 필요가 있다면
$(document).ready()를 사용하셔야 할 것입니다. :)

출처 : http://creator1022.tistory.com/156

728x90

김연욱(Vichang)님의 Inside Query Performance - (1)

 

안녕하세요. 김대우 입니다. 더운 여름 잘 지내고 계신지요?

이번에 소개해 드릴 내용은 김연욱님이 이끌어 주시는 Inside Query Performance 입니다.

아주 좋은 SQL 쿼리 성능에 대한 연재글을 올려 주고 계시며 SQLER에 많은 도움을 주시는 분이지요.

이하 내용은 김연욱님이 SQLER 자유게시판에 올려주신 항목을 정리한 내용입니다.

언제나 많은 도움 주시는 김연욱님 감사 드리구요. 앞으로도 좋은... 더운 여름 더더욱 열나게 하는 ^_^;;;

좋은 글 부탁 드립니다. 감사합니다.

이하 김연욱님의 글입니다.


 

 

1. 문자컬럼에다가 숫자컬럼을 비교하면 인덱스를 타는가 ?

2. 숫자컬럼에다가 문자컬럼을 비교하면 인덱스를 타는가 ?

3. 문자컬럼에다가 datetime컬럼을 비교하면 인덱스를 타는가 ?

4. datetime컬럼에다가 문자컬럼을 비교하면 인덱스를 타는가 ?

 

밑에 결과 보지말구 그냥 5초만 생각보세요.

중수이상 되시는 분은 빨랑 백스페이스를 눌러서 나가주세용.

 

--tempdb에서 테스트
use tempdb
go


--있으면 지우고
drop table a
go


--테스트용 테이블 하나 만들고
create table a(id int identity, cha varchar(10))
go
 

--역시나 테스트용 데이터 넣구
set nocount on
go
declare @i int
set @i = 1
while (@i <= 10000)
begin
insert into a(cha) values (convert(varchar(10), @i))
set @i = @i + 1
end
go
set nocount off
go


--인덱스 만들구
create index idx on a (cha)
create index idx2 on a (id)
go

--테스트를 위해 io량을 보고, 실행계획을 보기위해 설정
set statistics io on
set statistics profile on
go

 


 

 

--어떤경우에 인덱스를 쓸까 ?
--1. 그냥한번 풀로 읽어보면
select * from a

 

|--Table Scan(OBJECT:([tempdb].[dbo].[a]))

'a' 테이블. 스캔 수 1, 논리적 읽기 수 28
 

 

--2. 정상적으로 컬럼형식을 맞춰서 검색하면 ?
select * from a where id = 1

 


|--Bookmark Lookup(BOOKMARK:([Bmk1000]), OBJECT:([tempdb].[dbo].[a]))
       |--Index Seek(OBJECT:([tempdb].[dbo].[a].[idx2]), SEEK:([a].[id]=Convert([@1])) ORDERED FORWARD)

'a' 테이블. 스캔 수 1, 논리적 읽기 수 3

 

 

select * from a where cha='1'

 

|--Bookmark Lookup(BOOKMARK:([Bmk1000]), OBJECT:([tempdb].[dbo].[a]))
       |--Index Seek(OBJECT:([tempdb].[dbo].[a].[idx]), SEEK:([a].[cha]='1') ORDERED FORWARD)

'a' 테이블. 스캔 수 1, 논리적 읽기 수 3
--제대로 3페이지만 인덱스를 사용하여 검색

 

 

--3. 그럼 숫자컬럼에다가 문자를 비교하면 ?
select * from a where id = '1'

 


|--Bookmark Lookup(BOOKMARK:([Bmk1000]), OBJECT:([tempdb].[dbo].[a]))
       |--Index Seek(OBJECT:([tempdb].[dbo].[a].[idx2]), SEEK:([a].[id]=Convert([@1])) ORDERED FORWARD)

'a' 테이블. 스캔 수 1, 논리적 읽기 수 3

 

 

--4. 문자컬럼에다가 숫자를 비교하면 ?
select * from a where cha=1

 


  |--Table Scan(OBJECT:([tempdb].[dbo].[a]), WHERE:(Convert([a].[cha])=Convert([@1])))

'a' 테이블. 스캔 수 1, 논리적 읽기 수 28

--웬 테이블 스캔....

생각하신대로 결과가 나왔나요 ?


그럼 이번에는 많이 사용하는 datetime 컬럼을 테스트해보자.

 

--다른 샘플을 만들기 위해 잠시 off시키고
set statistics io off
set statistics profile off
go
 

--있으면 지우고
drop table b
go
 

--테스트용 테이블 하나 만들고
create table b(dt1 datetime, dt2 char(8))
go
 

--역시나 테스트용 데이터 넣구
set nocount on
go
declare @i datetime
set @i = '2000-01-01'
while (@i <= '2003-12-31')
begin
insert into b values (@i, convert(varchar(8), @i, 112))
set @i = dateadd(dd, 1, @i)
end
go
set nocount off
go
 

--인덱스 만들구
create index idx on b (dt1)
create index idx2 on b (dt2)
go

--테스트를 위해 io량을 보고, 실행계획을 보기위해 설정
set statistics io on
set statistics profile on
go

 



 

 

--어떤경우에 인덱스를 쓸까 ?
--1. 그냥한번 풀로 읽어보면
select * from b

 


|--Table Scan(OBJECT:([tempdb].[dbo].[b]))

'b' 테이블. 스캔 수 1, 논리적 읽기 수 5

 

 

--2. 정상적으로 컬럼형식을 맞춰서 검색하면 ?
declare @dt1 datetime
set @dt1 = '2003-05-05'
select * from b where dt1 = @dt1

 


|--Bookmark Lookup(BOOKMARK:([Bmk1000]), OBJECT:([tempdb].[dbo].[b]))
       |--Index Seek(OBJECT:([tempdb].[dbo].[b].[idx]), SEEK:([b].[dt1]=[@dt1]) ORDERED FORWARD)

'b' 테이블. 스캔 수 1, 논리적 읽기 수 3

 

 

declare @dt2 char(8)
set @dt2 = '20030505'
select * from b where dt2 = @dt2

 


|--Bookmark Lookup(BOOKMARK:([Bmk1000]), OBJECT:([tempdb].[dbo].[b]))
       |--Index Seek(OBJECT:([tempdb].[dbo].[b].[idx2]), SEEK:([b].[dt2]=[@dt2]) ORDERED FORWARD)

'b' 테이블. 스캔 수 1, 논리적 읽기 수 3

 

 

--3. datetime 컬럼에다가 문자를 비교하면 ?
declare @dt2 char(8)
set @dt2 = '20030505'
select * from b where dt1 = @dt2

 


|--Bookmark Lookup(BOOKMARK:([Bmk1000]), OBJECT:([tempdb].[dbo].[b]))
       |--Index Seek(OBJECT:([tempdb].[dbo].[b].[idx]), SEEK:([b].[dt1]=Convert([@dt2])) ORDERED FORWARD)

'b' 테이블. 스캔 수 1, 논리적 읽기 수 3

 

 

--4. 문자컬럼에다가 datetime을 비교하면 ?
declare @dt1 datetime
set @dt1 = '2003-05-05'
select * from b where dt2 = @dt1

 


|--Table Scan(OBJECT:([tempdb].[dbo].[b]), WHERE:(Convert([b].[dt2])=[@dt1]))

'b' 테이블. 스캔 수 1, 논리적 읽기 수 5


--웬 테이블 스캔....

 

생각하신대로 결과가 나왔나요 ?
 



결론, 문자대 숫자의 비교는 무조건 문자를 숫자로 변환후, 또는 문자를 datetime형으로

변환후 비교할려구 한다.(자동형변환에 의하야 - 무조건 형식을 맟춰서 사용해야하겠네요.)

프로그램 개발시 주의하세요 !!!

난이의 밥벌이에 대해서 좀더 알아 보도록 하겠습니다. ^_^

 


김연욱(Vichang)님의 Inside Query Performance - (1)

 

저작권 : 이 홈페이지의 내용은 모두 자유롭게 사용하실 수 있습니다.

728x90
Cross-Tab 쿼리 생성시 대개 SP에서 처리(Temp테이블 이용)하는것과 동일한
결과 내는 방법입니다.
(Pubs DB이용)
방법1>
SELECT DatePart(yy, Ord_date)년도, SUM( Qty) AS Total,
  SUM(CASE DATEPART(qq,  Ord_date) WHEN 1 THEN  Qty  ELSE 0 END) AS [1분기],
  SUM(CASE DATEPART(qq,  Ord_date) WHEN 2 THEN  Qty  ELSE 0 END) AS [2분기],
  SUM(CASE DATEPART(qq,  Ord_date) WHEN 3 THEN  Qty  ELSE 0 END) AS [3분기],
  SUM(CASE DATEPART(qq,  Ord_date) WHEN 4 THEN  Qty   ELSE 0 END) AS [4분기]
FROM Sales 
GROUP BY DatePart(yy, Ord_date )
Order by 1 

방법2>
SELECT DatePart(yy, Ord_date)년도,  SUM( Qty) AS Total,
  SUM(Qty * (1-ABS(SIGN(DatePart(qq, Ord_date)-1)))) AS [1분기],
  SUM(Qty * (1-ABS(SIGN(DatePart(qq, Ord_date)-2)))) AS [2분기],
  SUM(Qty * (1-ABS(SIGN(DatePart(qq, Ord_date)-3)))) AS [3분기],
  SUM(Qty * (1-ABS(SIGN(DatePart(qq, Ord_date)-4)))) AS [4분기]
From Sales
Group by DatePart(yy, Ord_date)
Order by 1

--------------------------------------------------------
결과 >

년도         Total         1분기         2분기        3분기         4분기
------------------------------------------------------------
1992 80 0 80 0 0
1993 250 60 165 0 25
1994 163 0 0 163 0


* 방법1은 간단한 CASE~WHEN문으로 보시면 아실것 같고,
  방법2의 경우는
(1-ABS(SIGN(DatePart(qq, Ord_date)-1))) 의 경우
각 분기외의 부분은 0으로 처리되어 (Qty * 0), 각분기별로 컬럼이 생성되고
이 컬럼들을 SUM시키게 됩니다.
- ABS와 SIGN 함수는 시퀄내장 함수이므로, 추가적인 사항은
  SQL도움말을 참조하시면 될듯 합니다. 

+ Recent posts