2011年7月21日 星期四
SQL語法效能提升
一般來說大家都會推薦利用join
但是用join 有一個條件要特別注意就是其中一個table資料筆數應該盡量少
例如 select a inner join b on a.date=b.date and a.Country=b.Counrty and a.City=b.City and a.Product=b.Product
a---10000000筆資料
b---1000筆資料
這樣會比
select * from a where ....快
但是如果b有三四萬筆的資料時,而其中date, Counrty在一萬筆中多半為一致的情形下
此時就應該減少b跟a join 的條件,而是在最後JOIN出來的結果處再下where 處理
這樣效能會好很多
修改後變成
select * from a inner join b on a.City=b.City and a.Product=b.Product where a.Date='991201' and a.Country='Taiwan'
這樣會比
select * from a inner join b on a.City=b.City and a.Product=b.Product and a.date=b.date and a.Counrty=b.Counrty
更快
但是用join 有一個條件要特別注意就是其中一個table資料筆數應該盡量少
例如 select a inner join b on a.date=b.date and a.Country=b.Counrty and a.City=b.City and a.Product=b.Product
a---10000000筆資料
b---1000筆資料
這樣會比
select * from a where ....快
但是如果b有三四萬筆的資料時,而其中date, Counrty在一萬筆中多半為一致的情形下
此時就應該減少b跟a join 的條件,而是在最後JOIN出來的結果處再下where 處理
這樣效能會好很多
修改後變成
select * from a inner join b on a.City=b.City and a.Product=b.Product where a.Date='991201' and a.Country='Taiwan'
這樣會比
select * from a inner join b on a.City=b.City and a.Product=b.Product and a.date=b.date and a.Counrty=b.Counrty
更快
2011年7月17日 星期日
查SQL最耗費CPU以及時間的語法
先清除暫存
dbcc freeProcCache
再下SQL
SELECT TOP 10
total_worker_time/1000000 AS [总消耗CPU 时间(s)],execution_count [运行次数],
qs.total_worker_time/qs.execution_count/1000000. as [平均消耗CPU 时间(s)],
SUBSTRING(qt.text,qs.statement_start_offset/2+1,
(case when qs.statement_end_offset = -1
then DATALENGTH(qt.text)
else qs.statement_end_offset end -qs.statement_start_offset)/2 + 1)
as [使用CPU的语法], qt.text [完整语法],
qt.dbid, dbname=db_name(qt.dbid),
qt.objectid,object_name(qt.objectid,qt.dbid) ObjectName
FROM sys.dm_exec_query_stats qs
cross apply sys.dm_exec_sql_text(qs.sql_handle) as qt
ORDER BY
total_worker_time DESC
dbcc freeProcCache
再下SQL
SELECT TOP 10
total_worker_time/1000000 AS [总消耗CPU 时间(s)],execution_count [运行次数],
qs.total_worker_time/qs.execution_count/1000000. as [平均消耗CPU 时间(s)],
SUBSTRING(qt.text,qs.statement_start_offset/2+1,
(case when qs.statement_end_offset = -1
then DATALENGTH(qt.text)
else qs.statement_end_offset end -qs.statement_start_offset)/2 + 1)
as [使用CPU的语法], qt.text [完整语法],
qt.dbid, dbname=db_name(qt.dbid),
qt.objectid,object_name(qt.objectid,qt.dbid) ObjectName
FROM sys.dm_exec_query_stats qs
cross apply sys.dm_exec_sql_text(qs.sql_handle) as qt
ORDER BY
total_worker_time DESC
訂閱:
文章 (Atom)