相信很多時候大家會用字串組成動態的SQL語法然後再用Execute來塞入到資料表中
,或是將一些SP回傳資料寫入到資料表後再作運用。但這樣的作法會耗費較多資源歐
日前寫了一些TSQL用來搬資料到Temp Table然後再做後續交易處理。由於只搬3萬多
筆資料,依照以往的經驗應該在4秒內可以完成,但卻花了9秒左右。由於需動態產生
SQL語法再透過該語法的回傳資料寫入Temp Table,所以我用了Execute的方式。
例 :
DECLARE @i INT;
DECLARE @SQL VARCHAR(1000);
SET @i=1;
SET @SQL='SELECT * FROM TABLE WHERE NO=' + @i;
INSERT INTO #TMP EXECUTE(@SQL);
由於搬3萬筆資料花了我2倍時間,所以我做個小LAB來看看用Execute跟不用的差異
有多少呢?本實驗我用AdventureWorks2012資料庫的Person資料表來測試。
以下語法是用 Execute :
CREATE TABLE #tmp(
[BusinessEntityID] [int] NOT NULL,
[PersonType] [nchar](2) NOT NULL,
[NameStyle] [BIT] NOT NULL,
[Title] [nvarchar](8) NULL,
[FirstName] [nvarchar](50) NOT NULL,
[MiddleName] [nvarchar](50) NULL,
[LastName] [nvarchar](50) NOT NULL,
[Suffix] [nvarchar](10) NULL,
[EmailPromotion] [int] NOT NULL,
[AdditionalContactInfo] [xml],
[Demographics] [xml] NULL,
[rowguid] [uniqueidentifier] ROWGUIDCOL NOT NULL,
[ModifiedDate] [datetime] NOT NULL );
GO
SET STATISTICS IO,TIME ON;
GO
Insert Into #tmp Exec('select * from person.person');
GO
SET STATISTICS IO,TIME OFF;
GO
DROP TABLE #tmp;
GO
上述的TSQL執行耗費的資源如下圖,看起來SQL會先將Execute的結果暫存,然後再塞入Temp Table,
形同做兩次工。
下面語法是不要用 Execute :
CREATE TABLE #tmp(
[BusinessEntityID] [int] NOT NULL,
[PersonType] [nchar](2) NOT NULL,
[NameStyle] [BIT] NOT NULL,
[Title] [nvarchar](8) NULL,
[FirstName] [nvarchar](50) NOT NULL,
[MiddleName] [nvarchar](50) NULL,
[LastName] [nvarchar](50) NOT NULL,
[Suffix] [nvarchar](10) NULL,
[EmailPromotion] [int] NOT NULL,
[AdditionalContactInfo] [xml],
[Demographics] [xml] NULL,
[rowguid] [uniqueidentifier] ROWGUIDCOL NOT NULL,
[ModifiedDate] [datetime] NOT NULL );
GO
SET STATISTICS IO,TIME ON;
GO
Insert Into #tmp Select * From person.person;
GO
SET STATISTICS IO,TIME OFF;
GO
DROP TABLE #tmp;
GO
上述語法執行耗費資源如下,可以看見時間花費少了一半,IO更是大大的降低。
經過簡單的測試,相信如果可以不用Execute來處理交易就盡量不要吧,但有時候就是得這樣才能Work
那也沒辦法囉,自己筆記一下。
我是ROCK
rockchang@mails.fju.edu.tw