Úterý, listopad 18, 2008

Potíže s MS SQL Server Management Studiem

Jak jsem již psal, nainstaloval jsem novou Microsoft SQL databází verze 2008. Jde o zdarma šířenou verzi Express. Malá poznámka pro ty, kteří Management Studio nepoužívají: je to aplikace, která zajišťuje velkou část administrace Microsoft SQL serveru a interaktivní práci s jeho daty. Je poměrně náročná na hardware, ale celkem dobře se s ní pracuje.

MS SQL Management Studio mohu porovnávat například s aplikací SQLyog , která provádí podobné činnosti jako Management Studio, ale pro SQL databázi MySql. V tomto porovnání Microsoft prohrává. Je pomalejší, pomaleji startuje a SQLyog Community Edition je stejně zdarma jako MS SQL Management Studio. SQLyog má mnohem vícefunkcí a méně chyb.

Nejvíce mě na Management Studiu vadí tyto věci:

  • Nepodařilo se mi ho přesvědčit, aby přesunulo sloupce v tabulce tak jak potřebuji. Po této operaci, kterou Designer tabulky viditelně umí, dojde při uložení změn v tabulce k chybě, která se hlásí jako "Název změněné tabulky" . Ano, nepletu se. Tak se chyba opravdu hlásí. Chybu jsem vyřešil tak, že tuto operaci provádím pomocí Visual Studia, které toto zvládá bez problémů.
  • Velmi často při uložení změn v tabulce dojde k chybě ukládání. Netuším o jakou chybu jde, protože se hlásí stejně jako chyba předchozí. Možná jde dokonce o stejnou chybu? V každém případě to dost obtěžuje. Chybu opět řeším změnami tabulek v databázi přes Visual Studio. Ještě, že ho máme...
  • Strukturu databáze a data určená pro vývoj ukládám na Subversion server Assembla.com. Slouží mi o pro správu verzí struktury a dat SQL serveru. Na Subversion je ovšem lepší ukládat textové soubory a to rozhodně záloha MS SQL serverů není. Textový soubor si tedy vyrábím v Management Studiu pomocí Generate Scripts. Jsem rád, že to Microsoft umí. Bohužel průvodce neumím zkrátit a nastavené volby si nepamatuje. Je to velmi zdlouhavé, zdržující a protivé. řešení neznám.
  • Potřebuji se často podívat, jaký vlastně přesně příkaz nebo dotaz včetně hodnot SQL server zpracovává. To bych považoval za běžný požadavek, který už umělo bez problémů i FoxPro. SQL 2008 toto nezvládá. Není to sice snad ani tolik chyba Management studia, ale někde si postěžovat musím. Placené verze MS SQL serveru obsahují v Management Studiu profiler, který mimo jiné zvládá i zobrazování příkazů, které SQL server zpracovává. Je to mocný a jasný nástroj. Plně chápu, že v Express verzi, která je k dispozici zdarma, tato schopnost nemusí být obsažena. Na druhé straně by mohla být nahrazena například prostým logováním provedených příkazů do souboru. Bez toho je to špatné. Samozřejmě existují na toto nějaké náhradní berličky. Jedna z nich, která se jeví velmi dobře, je Open Source program SQL Server 2005 Express Profiler. Ten ovšem, jak je zřejmé již podle názvu, pracuje pouze pod verzí 2005 SQL serveru. Pod SQL 2008 se mi ho bohužel nepodařilo rozchodit. Samozřejmě je možné použít například log LINQ to SQL. Tento způsob ovšem není moc obratný a navíc není schopen ukázat všechny příkazy. Dobré řešení jsem zatím nenašel.
Nemohu samozřejmě vyloučit, že všechny výše uvedené nedostatky jsou zaviněny pouze mojí neznalostí. Nejsem na MS SQL žádný guru. Přesto jsem z SQL 2008 Express dost rozladěn.

Velmi zajímavá a užitečná reakce na tento článek od Jardy Jiravy.

Úterý, listopad 04, 2008

Hlasování: co by jste vybral(a) pro vývoj web aplikace?

Nechal jsem na tomto weblogu probíhat hlasování o otázce "Co by jste vybral(a) pro vývoj web aplikace?". K dispozici bylo tyto možnosti:
  • ASP.NET
  • Java (servlety, JSP, JSF,...)
  • PHP
  • Python (Django, TG,...)
  • Perl
  • RoR
  • Něco jiného

Přesné výsledky jsou k dispozici na obrázku. Hlasování se zúčastnilo celkem 143 lidí. Na jedné straně se to zdá dost málo. Na druhé je to zajímavý výsledek v tom, že se ho zúčastnili lidé, kteří čtou tento odborný weblog a tedy mají o problematice dobré znalosti. S přehledem zvítězila možnost ASP.NET s 37 procenty hlasů. Na druhém místě je PHP (26 procent) a Java (25 procent). Naopak o poslední místo se dělí Perl a RoR.

Vítězství ASP.NET i nad PHP je myslím důkazem toho, že Microsoft technologie .NET a především ASP.NET je opravdu kvalitní a Microsoftu se povedlo vytvořit velmi kvalitní technologii. Bohužel to tak neplatí vždy, například MS SQL 2008 je krásným příkladem nedotaženého produktu.

Zúčastněte se prosím aktuálního hlasování. Jde o podobně odbornou otázku a výsledky tohoto hlasování budou určitě stejně zajímavé.

Úterý, říjen 21, 2008

Test rychlosti SQL procedur: MySql a MS SQL 2008

Na základě připomínky k mému článku Rychlejší je zápis do souboru nebo do databáze? jsem se rozhodl otestovat z manuálů známé tvrzení, že je rychlejší používat vložené SQL procedury proti přímému volání SQL příkazů. Vytvořil jsem tabulky a plnil ji 100000 záznamy. Nejprve byla tabulka bez indexů a pak s indexy. Tabulku jsme plnil nejdříve klasickým SQL INSERT příkazem, potom pomocí SQL procedury.

Použil jsem tabulku:
CREATE TABLE `tableinsert2` (
 `cislo` int(11) NOT NULL,
 `datum` datetime NOT NULL,
 `retezec` varchar(255) NOT NULL
)  
Pro přístup k MySql 5.1 byl použit .NET connector od MySql verze 5.2.3. Databáze MySql je verze 5.1.25. MS SQL 2008 Express je verze 10.0.1600.22. Protože jsem testoval jak MySql, tak MS SQL, je tedy opět možné porovnat rychlost těchtodvou databází.

MySql procedura

DELIMITER $$
DROP PROCEDURE IF EXISTS `test`.`insert2tableinsert2`$$
CREATE DEFINER=``@`` PROCEDURE `insert2tableinsert2`(IN pcislo INT, IN pdatum DATETIME, IN pretezec VARCHAR(255))
BEGIN
 insert into TableInsert2 (cislo,datum,retezec) values (pcislo,pdatum,pretezec);
END$$
DELIMITER ;

MS SQL procedura

ALTER PROCEDURE [dbo].[insert2tableinsert2]
 @pCislo int,
 @pDatum datetime,
 @pRetezec nvarchar(255)
AS
BEGIN
 SET NOCOUNT ON;
 insert into dbo.TableInsert2 (cislo,datum,retezec) values (@pCislo, @pDatum,@pRetezec);
END

Vlastní testovací kód

public class TestRychlostiSqlProcedur {
public void RychlostSqlProcedur() {
const uint POCET_ZAZNAMU = 100000;
zaznam z;
DateTime cas;
System.TimeSpan sts;

// ulozeni do databaze MySql
/*
MySqlConnection mc = new MySqlConnection("Database=test;Data Source=localhost");

MySqlCommand commInsert = new MySqlCommand();
commInsert.Connection = mc;
mc.Open();

// vymazani obsahu tabulky z predchozich testu
commInsert.CommandText = "TRUNCATE TABLE tableinsert2";
commInsert.ExecuteNonQuery();

// Ulozeni do databaze primo
cas = System.DateTime.Now;

for (uint k = 0; k < POCET_ZAZNAMU; k++) {
 z = novyZaznam(k);
 commInsert.CommandText = "INSERT INTO tableinsert2 (cislo,datum, retezec) Values ("
  + z.cislo + ",'"
  + OtherMetod.DateTime2IsoDateTime(z.datum) + "','"
  + z.retezec + "')";
 commInsert.ExecuteNonQuery();
}
sts = DateTime.Now - cas;
Console.WriteLine(cas + " --> " + DateTime.Now);
Console.WriteLine("Ukladani do databaze MySql primo (ms): " + sts.TotalMilliseconds);

// vymazani obsahu tabulky z predchozich testu
commInsert.CommandText = "TRUNCATE TABLE tableinsert2";
commInsert.ExecuteNonQuery();

cas = System.DateTime.Now;

// Priprava procedury
commInsert.CommandText = "insert2tableinsert2";
commInsert.CommandType = System.Data.CommandType.StoredProcedure;

for (uint k = 0; k < POCET_ZAZNAMU; k++) {
 z = novyZaznam(k);
 commInsert.Parameters.Clear();
 commInsert.Parameters.AddWithValue("@pcislo",z.cislo);
 commInsert.Parameters.AddWithValue("@pdatum", OtherMetod.DateTime2IsoDateTime(z.datum));
 commInsert.Parameters.AddWithValue("@pretezec", z.retezec);
 commInsert.ExecuteNonQuery();
}

sts = DateTime.Now - cas;
Console.WriteLine(cas + " --> " + DateTime.Now);
Console.WriteLine("Ukladani do databaze MySql pres proceduru (ms): " + sts.TotalMilliseconds);

mc.Close(); // uzavreni databaze
*/


// ulozeni do databaze MS SQL pres INSERT -----------------------------------------------------------------------
SqlConnection conn = new SqlConnection("server=CORE2-DUO-18\\SQLEXPRESS2008;database=test;trusted_connection=yes");
conn.Open();
SqlCommand sqlCom = new SqlCommand();
sqlCom.Connection = conn;
// vymazani obsahu tabulky z predchozich testu
sqlCom.CommandText = "DELETE FROM tableinsert2";
sqlCom.ExecuteNonQuery();

cas = System.DateTime.Now;
for (uint k = 0; k < POCET_ZAZNAMU; k++) {
 z = novyZaznam(k);
 sqlCom.CommandText = "INSERT INTO tableinsert2 (cislo,datum, retezec) Values ("
  + z.cislo + ",'"
  + OtherMetod.DateTime2IsoDateTime(z.datum) + "','"
  + z.retezec + "')";
 sqlCom.ExecuteNonQuery();
}
sts = DateTime.Now - cas;
Console.WriteLine(cas + " --> " + DateTime.Now);
Console.WriteLine("Ukladani do databaze MS SQL pres INSERT (ms): " + sts.TotalMilliseconds);

// ulozeni do databaze MS SQL pres proceduru -----------------------------------------------------------------

// vymazani obsahu tabulky z predchozich testu
sqlCom.CommandText = "DELETE FROM tableinsert2";
sqlCom.ExecuteNonQuery();

cas = System.DateTime.Now;
// Priprava procedury
sqlCom.CommandText = "insert2tableinsert2";
sqlCom.CommandType = System.Data.CommandType.StoredProcedure;

for (uint k = 0; k < POCET_ZAZNAMU; k++) {
 z = novyZaznam(k);
 sqlCom.Parameters.Clear();
 sqlCom.Parameters.AddWithValue("@pCislo", (int) z.cislo);
 sqlCom.Parameters.AddWithValue("@pdatum", OtherMetod.DateTime2IsoDateTime(z.datum));
 sqlCom.Parameters.AddWithValue("@pretezec", z.retezec);
 sqlCom.ExecuteNonQuery();
}

sts = DateTime.Now - cas;
Console.WriteLine(cas + " --> " + DateTime.Now);
Console.WriteLine("Ukladani do databaze MS SQL pres proceduru (ms): " + sts.TotalMilliseconds);

conn.Close();

}

struct zaznam {
 public DateTime datum;
 public uint cislo;
 public string retezec;
}

private zaznam novyZaznam(uint cislo) {
 zaznam nzaznam = new zaznam();
 nzaznam.datum = DateTime.Now.AddHours(cislo);
 nzaznam.cislo = cislo;
 nzaznam.retezec = nzaznam.datum.ToString() + "|" + cislo + "|" + nzaznam.datum.ToString();

return nzaznam;
}
}

Výsledky

Databáze Operace Čas (ms) Koeficient
Indexy 3) Mysql text 1) INSERT 26 594 1,00
procedura 31 141 1,17
MySql parameters 2) INSERT 27 109 1,02
procedura 37 503 1,41
MS SQL 2008 INSERT 55 447 2,08
procedura 38 091 1,43
Bez indexů Mysql text 1) INSERT 22 360 1,00
procedura 25 169 1,13
MySql parameters 2) INSERT 23 359 1,04
procedura 31 816 1,42
MS SQL 2008 INSERT 49 347 2,21
procedura 36 616 1,64

1) parametry jsou proceduře předány vytvořením textového příkazu. např. commandtext="call nazevprocedury(10,'jedna'");. 2) parametry jsou proceduře předány pomocí volání metody Parameters.AddWithValue (doporučovaný přístup) 3) Indexy jsou vytvořeny nad každým sloupcem. Tedy celkem tři indexy nad tabulkou.

Výsledky jsou zajímavé. Je zde několik závěrů na které stojí za to upozornit:
  • MS SQL 2008 je pomalejší než MySql. V některých případech je čas více jak dvojnásobný proti MySql.
  • U MySql je rychlejší použít přímo příkaz INSERT než SQL proceduru. Naopak u MS SQL 2008 je rychlejší použít SQL proceduru. Domnívám se, že chování MS SQL je logičtější a MySql musí procedury ještě vylepšit.
  • U MySql je k mému překvapení rychlejší proceduru volat pomocí textového volání než používat doporučovaný způsob volání Parameters.AddWithValue. Platí samozřejmě pro testovanou verzi. V příštích verzích databáze se toto může a mělo by upravit.
  • Rozdíl mezi tabulkou s indexy a tabulkou bez indexů je mnohem menší, než jsem předpokládal.
  • U MySql jsem použil tabulky typu MyISAM. Podle mého minulého testu jsou totiž tabulky InnoDb při vkládání záznamů neuvěřitelně pomalé. Proto jsem je v tomto případě vůbec netestoval.

Moje interpretace výsledků je taková, že MySql je rychlejší a není moc podstatné, zda použijete u obou databází uložené procedury nebo budete SQL příkazy zadávat přímo. Sice existují určité rozdíly mezi těmito dvěmi způsoby, ale nejsou podstatné. Je nutné vzít v úvahu, že šlo o test, kde se zadávalo 100000 záznamů. Tímto testech nechci nijak naznačovat, že SQL procedury není vhodné používat. Jenom argumentace, že jsou jednoznačně rychlejší není správná. Rychlejší jsou podle tohoto testu u MS SQL 2008. Navíc rozdíl v rychlosti není nijak závratný. U plně indexované tabulky 0,69x a u neidexované tabulky 0,74x. V průměru tedy jsou u aktuální MS SQL databáze SQL procedury rychlejší 0,72x.

Úterý, říjen 14, 2008

Děkuji virům a podobné havěti

Chtěl bych tady veřejně poděkovat všem virům, trojanům, malware, botnety, spyware, rootkitům a další příbuzné podobné havěti. Vím, že je to jako bych děkoval chřipce nebo dokonce rakovině. Ale proti nemocem je počítačová havěť také něčím užitečná. Čím? Provádí přirozený výběr a významně vylepšuje jednotlivé programy a celý koncept informačních technologií. Bez počítačové havěti bychom na tom byli mnohem hůře.

Za prvé by operační systém MS Windows všech typů a generací byl mnohem děravější a křehčí než je dnes. Útočníci a zloději dat by měli mnohem snazší cestu a existovalo by mnohem méně integrovaných ochran a nástrojů než dnes.

Za druhé a především by se asi dále rozvíjela koncepce velmi výkonných osobních počítačů na které je nutné instalovat další a další programy a jejich aktualizace. Dnes zřejmě pomalu tato éra končí, pokud nedojde k nějaké významné změně. Viníkem jsou kriminální živly, které produkují tolik počítačové havěti, že včasná obrana proti nim je nemožná. Není možné ochrany tak často a intenzivně aktualizovat a jejich práce tak zatěžuje počítače, že nakonec nebude možné na osobním počítači dělat nic jiného, než ho kontrolovat, zda není napaden. Samozřejmě trochu přeháním, ale jenom trochu. Podle společnosti Symantec existuje více škodlivého software než toho prospěšného.

Proti tomu lze nasadit jedinou účinnou strategii: povolit běh na počítači pouze schváleným programům. Dnes ochranné programy kontrolují každý spouštěný program a hledají v něm znaky z databází známých škůdců. Strategie bude zřejmě muset být opačná. Kdo ovšem bude tou autoritou, která bude programy schvalovat? To si nedovedu představit ani technicky, ani organizačně a ani právně. Jediné co by mohlo fungovat a již funguje, je vrátit se zpět ke kořenům informačních technologií. Myslím tím koncept tenkého klienta na kterého se nic moc neinstaluje. Mám pár známých a příbuzných a pro ty všechny by stačil. Občas zpracují fotku, přečtou pár emailů, občas email napíší, vyhledají si něco na internetu, poslechnou hudbu a napíší fakturu. To je střelením od boku tak 95 procent dnešních uživatelů počítačů. Děti navíc hrají hry a klábosí přes kecálky. Mimo her by tenký klient na bázi internetového prohlížeče obsahujícího multimediální doplňky tohle všechno zvládl. Co se týká her, tak stejně se nás Sony, Microsoft a Nintendo snaží přesvědčit, že patří na konzole. Tak to asi také nemusí být problém. Velmi se mi líbí myšlenka osobního počítače, který má všechen software uložen v BIOSu včetně operačního systému (asi Linuxu) a aplikace si spouští na intermetu. Výrobce BIOSu nebo základní desky a umožní jednou za čas provést automatický upgrade a to je vše. Pouze se nakonfiguruje automaticky sít a spustí je prohlížeč. To není žádné sci-fi, to je současnost. Mě se to líbí a počítačová havěť na tom má svůj podíl. Tedy děkuji. I když to tak nakonec masově nedopadne, je to hezká naděje.

Úterý, říjen 07, 2008

Kniha: Mistrovství v MySql 5 (Kofler Michael)

Kniha je překladem originálního titulu The Definitive Guide to MySql 5 z roku 2005. Překlad sice není žádná sláva, ale v tomto případě to není moc velký problém. Kniha má podtitul "kompletní průvodce webového vývojáře". Myslím, že značně přehání. Kniha je totiž určena pro začátečníky a pouze první seznámení s MySql. To se ovšem nikde nedočtete. Jakmile chcete nějaké podrobnější zajímavější informace, tak je v knize bohužel nenajdete. Obsahuje sice kapitoly Programování s databází (PHP, Perl, Java, Jazyk C, Visual Basic 6 a .NET), ale příklady v nich jsou velmi krátké a povrchní. Dají se sice použít, ale pro programování jsou nedostatečné. Kapitola Referenční příručka zní velmi slibně. Ovšem pouze do té doby, než zjistíte, že je dlouhá pouze necelých třicet stran. Navíc těchto třicet stran obsahuje API pro všechny výše uvedené jazyky. Kniha také obsahuje kapitolu Uložené procedury a triggery. Těšil jsem se na ní, ale jenom do doby než jsem zjistil, že je dlouhá také pouze necelých třicet stránek a většina z nich se věnuje postupům jak s procedurami a triggery pracovat, ale ne jak je naprogramovat. Co tedy obsahuje těch 805 stránek knihy? Hodně prostoru je věnováno nástrojům pro správu MySql jako MySql Adminsitrator a Query Browser, phpMyAdmin a podobným věcem. Pokud potřebujete MySql trochu odborněji spravovat, tak Vám kniha také ale k ničemu nebude. Některé nástroje pro správu jsou sice popsány, ale opět velmi povrchně. Myslím, že autor si přesně neujasnil co píše. Možná chtěl napsat všechno, ale to by potřeboval nejméně 3x tolik prostoru. Kdo by si ovšem koupil knihu o 2500 stránkách? Tak je tam vše a současně nic. Knihu nedoporučuji. Připadá mi, že autor pouze trochu upravil volně dostupný manuál k MySql a vyškrtl z něj většinu odbornějších částí. Chápu důvody pro vydavatel Computer Press zařadil knihu do úspěšné edice "Mistrovství v...". Kniha se měla svézt na úspěšné edici. Vydavatel by si ale také měl uvědomit, že zařadit nekvalitní knihu do edice může také znamenat, že čtenář si již z této edice nic nekoupí, protože všechny ostatní knihy z edice bude považovat za stejně špatné. Český trh na dobrou odbornou knihu o MySql čeká. MySql programátoři mohou pouze závidět programátorům pro MS SQL kvalitní knihu od J.Sacka, kterou jsem popisoval dříve. Mistrovství v MySql; Michael Kofler; 805 stran; 890,- Kč; www.cpress.cz; datum vydání únor 2007

Úterý, září 30, 2008

SmartSVN 4 - kvalitní subversion klient

Již delší dobu používám subversion server. Pro neznalé jde o systém pro správu a verzování souborů. Subversion postupně nahrazuje zastaralý CVS a je stejně jako CVS k dispozici i v kvalitní Open Source implementaci.

Používám především veřejný subversion na Assembla.com, který jsem popisoval již dříve. K přístupu k CVS systémům raději používám samostatné klienty, než ty integrované do vývojového prostředí. Lépe se mi s tím pracuje a je tak možno využít většiny nebo dokonce všech vymožeností příslušeného systému. Již delší dobu spokojeně používám program SmartSVN od firmy Syntevo. Dnes jsem nainstaloval novou verzi 4.0.4.

SmartSVN je multiplatformní klient subversion správy verzí, který je plně napsaný v Javě. Na dnešních počítačích není Java žádný problém a start programů v Javě je zhruba stejně dlouhý jako programů napsaných v .NET. Grafické prostředí je velmi pěkné a je důkazem, že v Javě lze napsat velmi přehledný a hezký program.

Mezi základní vlastnosti patří: přístup k úložišti pomocí svn, http, https, http+proxy a svn+ssh. Není podporován protokol file. Program je odzkoušen na MS Windows NT a vyšších, Mac OS X a Linuxu. K dispozici jsou všechny subversion příkazy včetně zamykání a odemykání souborů. Složitější akce se provádějí pomocí průvodců. Velmi pěkně jsou označeny změněné soubory a dobře lze řešit nebo předcházet konfliktům ve verzích souborů. Zaujalo mě i dobře zpracované slučování souborů. SmartSVN se může integrovat přímo do Shellu MS Windows Explorer nebo Mac OS X Finderu. Transakční pohledy umí automaticky zobrazit nové revize v repozitáři. Repositiory Browser umí procházet strukturu úložiště a mimo jiné zobrazit soubory v různých verzích; vytvořit nový adresář; přesunout nebo přejmenovat soubor nebo adresář. Poslední verze mě při každém startu obtěžovala dotazem na heslo, které mělo zajistit přístup k ostatním heslům. Nová verze už neobtěžuje a to mě potěšilo. SmartSVN používá vlastní Repository Access Layer.

Program je k dispozici v "komunitní" verzi (Foundation), která je k dispozici zdarma a ve verzi placené (Professionali). Ta stojí pro jednoho uživatele s 90 USD a denní podporou 79 USD. Česká verze není k dispozici, ale pokud uživatel někdy pracoval s nějakým systémem pro správu verzí a angličtinu už někdy viděl, není problém s programem pracovat. Program mohu doporučit, používám verzi Foundation. Pro mne je zcela dostačující.

Úterý, září 23, 2008

MSDN Library pro Visual Studio 2008 SP1

Microsoft společně se Service Packem 1 pro Visual Studio 2008 uvolnil i novou verzi MSDN Library. Stáhnout ji lze ze z webu Microsoftu. K dispozici je jako ISO obraz soubor VS2008SP1MSDNENUX1506188.iso o velikosti 2209.5 MB. Kde na ty názvy Microsoft chodí? Proč název není například MSDN-Library-2008-08.iso?! Tomu by snad rozuměl každý. Také moc nerozumím tomu, proč si Microsoft tolik oblíbil ISO obrazy. Není úplně jednoduché je rozbalit a kdo si to potřebuje vypálit na CD/DVD, tak ten by to určitě uměl i například ze ZIP archivu. Naopak právě se ZIP archivem se mnohem lépe pracuje, než s ISO obrazem.

Mnohem raději bych tak velký soubor stahoval jako torrent, ale tuto variantu také bohužel Microsoft nepodporuje. Torrent je podle mého v tomto případě mnohem výhodnější, protože tak nezatěžuje mezinárodní linky a stahování lze kdykoliv přerušit potom bez problémů kdykoliv ve stahování pokračovat. ISO obraz obsahuje celkem 158 souborů. Po spuštění klasického setup.exe se spustí instalace. Ta jako obvykle trvá desítky minut. Jde přece jen o gigabyty dat. Je zajímavé, že po instalaci zabrala knihovna méně, než byl distribuční balík, tj. 1.55 GB. Samozřejmě k žádným podstatným změnám nedošlo. Document Explorer je stejný jako před tím a stejně jako před tím se často lze výsledku mnohem rychleji dobrat pomocí Google, než pomocí lokální i on line MSDN nápovědy Microsoftu. Jak je to možné netuším, ale je to má dlouholetá zkušenost. Nedivím se, že Microsoft vyhledávání Live.com je tak málo oblíbené. Pokud používá obdobné algoritmy jako MSDN Library, tak to nemůže být jinak.