Odpovědi na dotazy ke 4. lekci Azure akademie

Jak jsme slíbili, přinášíme zodpovězené dotazy, které padly během čtvrté lekce naší Azure akademie. Otázky jsme si dovolili jazykově a stylisticky zkorigovat, stejně jako naše původní odpovědi, které jsme doplnili o další informace.

Dalibor a Michael

SQL Azure

Když pracuje worker role s SQL Azure (ve stejném regionu), za přenos dat se neplatí? A co za transakce?

Ne, neplatí se nic, pokud jsou data konzumována z aplikace ve stejném regionu. Transakce se u SQL Azure nepočítají. Měří se pouze velikost databáze a data přenesená ven/dovnitř datového centra.

V praxi existují transakce, které oprávněně běží déle než 5 minut. Není možnost jednorázově prodloužit tento čas?

V současné verzi tato možnost není.

Co je to Bulk Copy?

Možnost hromadného vložení dat – rychlejší alternativa klasického vkládání po řádcích. Více informací najdete v dokumentaci k SQL serveru – tato možnost je v něm již řadu let a je využitelná i proti SQL Azure.

Kdy je plánováno umožnění provádění klasického backup/restore databází?

V blízké době se objeví možnost vytvořit kopii databáze v definovaný okamžik, v příštím roce by měla přibýt možnost obnovy databáze do definovaných časových okamžiků. Funkčnost ekvivalentní příkazům BACKUP a RESTORE není v dohledné době plánována.

Uvažuje se o zprovoznění SQL Agenta?

V dohledné době ne. Musíte plánované úlohy spouštět sám. Existuje též vzorové řešení pro agenta pomocí worker role ve Windows Azure (třídílný seriál začíná zde), ale to je ekonomicky obhájitelné pouze pro velká řešení v cloudu.

Plánuje se podpora CLR (Common Language Runtime) v SQL Azure?

V dohledné době ne.

Pokud budu mít více databázi (serverů) v různých lokalitách, je možné využít linkovaných serverů a propojit tyto databázové instance?

Transakce proti SQL Azure je vždy limitována na databázi, ke které se prvotně připojíte. Funkce ekvivalentní linkovanému serveru není k dispozici.

Je plánována možnost nasazení databázové struktury z Visual Studia přímo na SQL Azure? Nyní je třeba postupovat "s mezikrokem" – nasadit na lokální SQL server a poté vygenerování skriptů s nastavenou cílovou platformou "SQL Azure".

Dosažení shodné funkce v nástrojích pro klasickou i Azure databázi je jednou z priorit. První vylepšení lze čekat v Service Packu 1 pro Visual Studio 2010 (na jaře), bližší detaily ale nebyly dosud oznámeny.

Podporuje SQL server partitioning?

V současné verzi ne.

Jak je na tom SQL s výkonem? Pochopil jsem, že se jedná v podstatě stále o jeden "malý" server zvládající adekvátní počet dotazů. Jaké jsou limity? Počet dotazů/sec? Lze to alespoň přibližně srovnat s ekvivalentem nějakého "normálního" serveru?

Podívejte se na tento odkaz https://blogs.msdn.com/b/kaci/archive/2010/10/15/jaky-je-vykon-sql-azure.aspx

Kdy bude umožněn přístup přes OLE DB?

V tuto chvíli se o implementaci uvažuje, ale v nejbližší vezi (Q1 2011) to není pravděpodobné.

Co použít pro aplikaci menší velikosti – SQL Azure nebo tabulku v Azure Storage?

Pokud bych neznaje konkrétní aplikaci řekl SQL Azure, prodával bych „zajíce v pytli“. Bez alespoň řádové znalosti aplikace (např. jednoduchý elektronický obchod apod.) je těžké vydat obecné rozhodnutí. Azure Storage má prakticky neomezenou škálovatelnost a kapacitu, ale má mnohem méně možností pro dotazování a manipulaci s daty. Navíc každá ze služeb má poněkud odlišný způsob měření spotřeby. To je také třeba vzít v úvahu. Podrobnější srovnání najdete v prezentaci z 2.lekce Azure akademie.

Je možno používat dočasné tabulky (#tabulka). Případně je databáze tempdb součástí placené služby?

Ano, je možné je používat. Příklad je např. zde https://blogs.msdn.com/b/sqlazure/archive/2010/05/04/10007212.aspx. SQL Azure má sice též tempdb databázi, ale nemůžete ji aktivně využívat. Není možné v ní vytvářet globální tabulky (začínající ##) ani k ní přistupovat jménem databáze tempdb.

Jak zjistit, zda dočasná tabulka existuje? Dotaz IF object_id('tempdb.#tbl') IS NOT NULL DROP TABLE tempdb.#tbl pochopitelně selže kvůli tečkově odkazované tempdb.

Není možné používat 3- a 4-jmenná názvy objektů. Tabulka je každopádně zrušena při uzavření databázového spojení - je to jenom lokální tabulka. Můžete též zvážit použití tzv. Table Variables (viz např. https://www.sqlservercurry.com/2010/07/temp-table-vs-table-variable-in-sql.html).

Dá se říct co je rychlejší, jestli SELECT/UPDATE/INSERT v SQL Azure anebo tabulka v Azure Storage?

Vždy bude záležet na konkrétním scénáři. Většinou bude zřejmě rychlejší relační databáze SQL Azure – má optimalizovaný binární protokol a minimální režii, zatímco u Azure Storage používáte HTTP, je třeba parsovat XML atd. – režie je tedy typicky větší.

Ostatní dotazy

Je možné k jednomu systému provozovanému v rámci Windows Azure přiřadit větší množství domén? Jak na to, kdybych vytvořil SaaS na tvorbu webových stránek a chtěl uživatelům umožnit ke svému webu přiřadit vlastní doménu?

Na svůj web můžete přesměrovat kolik domén chcete prostřednictvím vámi vlastněných DNS záznamů. V aplikaci si budete muset ošetřit URL příchozího požadavku a podle toho se zařídit.

Bylo by nějak možné zjistit, jak jste hodnotili moje úkoly? Protože teď zjišťuji, že kvůli přehlednutí slova se mi úplně změnil význam otázky...

Úkoly nehodnotíme exaktně jako ve škole. Pokud vidíme, že "student" tomu věnoval dostatečnou snahu a odpovědi dávají smysl, uděláme "čárku". Zatím jsme nikomu nedali pomyslnou " Nemějte starost, domácí úlohy jsou hlavně pro vás, ne pro nás.

Lze psát worker role v nativním kódu či využívat nativních knihoven psaných v C++?

Ano, lze. Můžete psát i non-managed kód a používat nativní knihovny. Pak v .NETu napíšete pouze jedinou třídu, která spustí váš kód – role musí mít nastavenou úroveň důvěry Full Trust.

Pokud v Run () spustím nekonečný cyklus, který nebude reagovat na žádné přerušení (tedy pouze while(true)) jako test neodpovidání aplikace - mám možnost tuto roli zastavit? Tedy totožná možnost jako běh na lokálním serveru, kde mohu provést zastavení daného threadu?

Co bude dělat worker role je na vás. Typicky čeká na nějaké zprávy z fronty, ale může i dělat nějaký nekonečný výpočet, jehož výsledky bude někam posílat. Co dělá metoda Run, nemá vliv na to, jak se tato role zastaví. Pokud vydáte příkaz "Suspend" z nějakého nástroje pro správu, vyvolá se událost OnStop() a pokud váš thread neukončíte, je ukončen násilně. Jinak zastavit thread běžící Run se programové asi nedá. Není totiž odkud – je to první thread aplikace.