2008年6月19日

[KB][PLINQ]Parallel LINQ介紹(1)

隨著多核心的CPU逐漸成為主流,為了要充分利用CPU的效能,在去年大約七月的時候,微軟發佈了Microsoft Parallel Extensions to Framework 3.5,目前的版本為June 2008 CTP版本。其中的PLINQ是大家要注意的地方。

PLINQ可能是下一代.NET Framework 4.0 的內建功能(Parallel FX Library, PFX)之一,它包含了Parallel LINQ (PLINQ) and Task Parallel Library (TPL),再搭配F#,下一代能帶給程式設計師提升效能及減少程式複雜的好特性實在不少。

NextDotNet
從它的字義上,我們可以知道它是用來做平行處理。針對哪部分做處理呢?主要是針對LINQ to Objects以及LINQ to XML作並行的處理。它提供了並行處理的類別以及方法,讓你過去操作thread以及同步所需處理的複雜程式碼簡化。類別及方法在System.Threading這個組件中實作。

接下來,我以一個簡單的範例來作說明:

1. 首先,開啟一個Console專案,然後在專案中引用System.Threading 這個dll 組件。

2. 我們輸入下列的程式碼:


string[] words = new[] { "Hello", "World", "PLINQ", "IS", "Very", "NOT", "BAD", "!!", "Test", "GOOD" };
var MyQuery = from word in words select word;

foreach (string str in MyQuery)
{
Console.Write(str + '\n');
}

Console.Read();

然後,根據處理器循序處理的特性,我們可以看到輸出的結果的順序如下(如同在陣列中的順序):

seq

3. 變更成PLINQ的寫法:



string[] words = new[] { "Hello", "World", "PLINQ", "IS", "Very", "NOT", "BAD", "!!", "Test", "GOOD" };

var MyQuery = from word in words.AsParallel() select word;

MyQuery.ForAll(word => { Console.WriteLine(word); });

Console.Read();

然後我們去查看"單一個CPU"的呈現情形,看來是跟原來循序處理一樣。
seq1

如果我們把這個執行檔放到一個擁有雙核CPU的電腦上,執行的結果如下圖:seq2

我們可以看到,透過平行處理,把這個陣列分成兩部分處理,一部分是NOT, Hello, World, PLINQ, IS, Very,另一部分則是BAD, !!, Test, GOOD。

如果你再運行一次,你會發現執行的順序變得不一樣了,因為在平行處理時,會切割成兩部分(如果是雙核心CPU)作處理,但不是每次順序都一樣。
seq3

4. 如果放在四核心的CPU上執行,執行的順序就更複雜了。(執行了三次,順序都不一樣)
image

image

image

隨著硬體的功能提升,如何充分利用硬體來加速軟體? 微軟打算在下一代Framework中,透過平行運算充分的利用到硬體作加速及效能的提升。

未來這個系列將會介紹PLINQ的一些相關特性。

注意:基於是CTP版本,微軟在PLINQ功能上隨時仍會作調整。

2008年6月3日

[KB]How to find dependency in SQL server 2005

如果你是一個DBA,常常會有清理資料庫內不需要的物件的需求。

但是你又怕砍掉這些物件(Column、Table、View及Store Procedure等)會讓其他依賴這物件的物件變得沒有作用。你可以透過下列語法來建立一個Store Procedure來識別物件的Dependency。



USE master
GO
CREATE PROCEDURE sp_FindDependencies
(
@ObjectName SYSNAME,
@ObjectType VARCHAR(5) = NULL
)
AS
BEGIN
DECLARE @ObjectID AS BIGINT

SELECT TOP(1) @ObjectID = object_id
FROM sys.objects
WHERE name = @ObjectName
AND type = ISNULL(@ObjectType, type)

SET NOCOUNT ON ;

WITH DependentObjectCTE (DependentObjectID, DependentObjectName, ReferencedObjectName, ReferencedObjectID)
AS
(
SELECT DISTINCT
sd.object_id,
OBJECT_NAME(sd.object_id),
ReferencedObject = OBJECT_NAME(sd.referenced_major_id),
ReferencedObjectID = sd.referenced_major_id
FROM
sys.sql_dependencies sd
JOIN sys.objects so ON sd.referenced_major_id = so.object_id
WHERE
sd.referenced_major_id = @ObjectID
UNION ALL
SELECT
sd.object_id,
OBJECT_NAME(sd.object_id),
OBJECT_NAME(referenced_major_id),
object_id
FROM
sys.sql_dependencies sd
JOIN DependentObjectCTE do ON sd.referenced_major_id = do.DependentObjectID
WHERE
sd.referenced_major_id <> sd.object_id
)
SELECT DISTINCT
DependentObjectName
FROM
DependentObjectCTE c
END

建立完成後,為了讓這個SP可以在任何一個資料庫中使用,請使用sp_ms_marksystemobject來將這個SP註冊為系統物件。

EXECUTE sp_ms_marksystemobject 'sp_FindDependecies'


接下來,您就可以透過它來找物件的相依性。

exec sp_FindDependencies 'employees'

result

2008年6月2日

[Info]你知道嗎?Hotfix可以從網路下載了.

現在,你可以直接從KB文章中下載所需要的Hotfix。

apply_hotfix

 

過去總是要聯絡微軟技術支援中心,透過技術支援工程師協助才能順利下載,現在你可以直接從網路上下載。但是要注意到語系(ENG 、CHT...)、OS平台(x86、x64以及IA)的相容。完成填表後,不久你就可以收到包含下載連結的email。

save_hotfix

若您下載的是SQL Server的hotfix,從SQL Server 2000開始,hotfix具有向前相容的特性(就是後面的hotfix會包含前面hotfix的內容),所以當您找不到某個語言或平台的hotfix時,可以找後面版本的hotfix來作升級。

 

如何識別 SQL Server 的版本

可供 SQL Server 2000 SP 4 中的 Hotfix累計清單

在 SQL Server 2005 Service Pack 2 所修正錯誤的清單

[Info] 如何快速找到Fix it?

  台灣微軟目前提供了很多的Fix it,讓許多消費者可以不用看完整篇KB,只要按下一個按鈕,就可以幫使用者自動修正許多問題. 現在在Vista以及Windows 7上,微軟也提供了SideBar工具,讓你用最短的時間找到能修正您的電腦的Fix it.(目前為英文版本) ...