Sdružování připojení v .NET / SQL Server?




Je to nezbytné nebo výhodné pro psaní vlastního kódu sdružování připojení při vývoji aplikací v .NET s databází SQL Server? Já vím, že ADO.NET vám dává možnost povolit / zakázat sdružování připojení - to znamená, že je to postavené do rámce a nemám potřebu se starat o to? Proč lidé mluví o psaní vlastní sdružování připojení software a jak je to jiné, než to, co je zabudován do ADO.NET?
Sdílení připojení k zabudování do ADO.NET je robustní a zralé. Doporučuji proti pokusu napsat svůj vlastní verzi.
<h2>souhrn</h2><p>nechte propojený server dělat co nejvíce.<br> je <em> nemožné </em> pro sql server optimalizovat dotaz na propojeném serveru, dokonce i na jiném serveru sql</p><h2>dlouho</h2><p>klíčovým faktorem je <em> kde </em> je dotaz spuštěn.</p><p>v tomto případě se jedná o triviální výběr, takže všechny řádky z tabulky budou odeslány po drátu. nezáleží na tom.</p><p>když přidáte připojení a kde, pak na tom může záležet. chcete, aby sql server umožnil propojenému serveru provést co největší filtrování, aby se zmenšila velikost dat přicházejících po síti.</p><p>například druhý případ by zde měl být efektivnější.</p><pre><code>select * from openquery(&lt;linked server&gt;, 'select &lt;column list&gt; from mytable') t1 join somelocaltable t2 on ... where t1.foo = 'bar' select * from openquery(&lt;linked server&gt;, 'select &lt;column list&gt; from mytable where foo = ''bar''') join somelocaltable t2 on ... </code></pre><p>omezení openquery je v tom, že nemůžete parametrizovat: proto potřebujete dynamický sql, abyste mohli přidat klauzule where atd.</p><p>výkon propojených serverů může být ovlivněn <a href="http://msdn.microsoft.com/en-us/library/ms178532.aspx"><code>sp\_serveroption</code></a> . nastavení <code>collation compatible</code> říká vše</p><blockquote> <p>pokud je tato možnost nastavena na true, sql server předpokládá, že všechny znaky na propojeném serveru jsou kompatibilní s místním serverem, pokud jde o znakovou sadu a pořadí řazení (nebo pořadí řazení). to umožňuje serveru sql server odesílat porovnání sloupců znaků zprostředkovateli. pokud tato možnost není nastavena, sql server vždy vyhodnocuje porovnání na sloupcích znaků místně.</p> </blockquote><p>to znamená, zkuste nenechat sql server zpracovat data místně.</p><p>poznámka: na mé <code>foo = 'bar'</code> druhý příklad výše je filtr odeslán na propojený server, protože je to pouze řetězcová konstanta na sql server. skutečná klauzule where v prvním příkladu může nebo nemusí být zaslána vzdáleně.</p><p>nakonec jsem také zjistil, že rozložení dat do dočasné tabulky a jejich připojení k místním tabulkám je často lepší než připojení přímo k openquery.</p> Často toto je provedeno pomocí [„Data Driven odběry“](https://msdn.microsoft.com/en-us/library/ms169673.aspx) , ale tato funkce je k dispozici pouze v některých SQL vydáních: Enterprise a Business Intelligence, ale ne v normě.


Takže existuje celá řada kreativních řešení. Ale nemám rád žádné z nich, a všechny vyžadují spravedlivý trochu práce mimo SSRS.


Mezi řešení, které jsem viděl, patří: Vytvoření odběr a potom zakázání nebo povolení SQL úlohu, kterou odešle předplatné (identifikovatelné podle GUID).


Vytvořte si .NET obálky exe zvládnout odeslání e-mailu. Je možné spustit dotaz nejprve zjistit, kolik se vrací řádky, a pak v případě potřeby generovat zprávu a zahrnout do e-mailu. V současné době jsou v kurzu SQL dartabáze. Takže pokud se chceš uplatnit, tak MS-SQL, Interbase, ORACLE, popř. nějaké ty internetové jako např. MySQL, PostgreeSQL apod. Každá databáze má vlastní programovací jazyk pro uložené procedury, vlastní datové typy apod.Program, ve kterém budeš vyvíjet soft je opět něco jiného. Ten většinou je univerzální a umí přistupovat k jakékoliv databázi.V současné době, pokud bych začínal, tak bych se orientoval směrem .NET a C#. <p>protože ostatní odpovědi již naznačují, sql server může nebo nemusí explicitně zajistit, že řádky jsou seřazeny v pořadí seskupených indexů před <code>insert</code>.</p><p>to závisí na tom, zda má klastrovaný indexový operátor v plánu sadu vlastností <code>dmlrequestsort</code> (což zase závisí na odhadovaném počtu řádků, které jsou vloženy).</p><p>pokud zjistíte, že sql server to z jakéhokoli důvodu podceňuje, můžete mít prospěch z přidání explicitního <code>order by</code> k dotazu <code>select</code> k minimalizaci rozdělení stránek a následné fragmentaci z operace <code>insert</code></p><p><strong> příklad: </strong></p><pre><code>use tempdb; go create table t(n int primary key,filler char(2000)) create table t2(n int primary key,filler char(2000)) go declare @t table (u uniqueidentifier primary key default newid(),n int) insert into @t(n) select number from master..spt\_values where type = 'p' and number between 0 and 499 /*estimated row count wrong as inserting from table variable*/ insert into t(n) select t1.n*1000 + t2.n from @t t1, @t t2 /*same operation using explicit sort*/ insert into t2(n) select t1.n*1000 + t2.n from @t t1, @t t2 order by t1.n*1000 + t2.n select avg\_fragmentation\_in\_percent, fragment\_count, page\_count, avg\_page\_space\_used\_in\_percent, record\_count from sys.dm\_db\_index\_physical\_stats(2, object\_id('t'), null, null, 'detailed') ; select avg\_fragmentation\_in\_percent, fragment\_count, page\_count, avg\_page\_space\_used\_in\_percent, record\_count from sys.dm\_db\_index\_physical\_stats(2, object\_id('t2'), null, null, 'detailed') ; </code></pre><p>ukazuje, že <code>t</code> je masivně roztříštěný</p><pre><code>avg\_fragmentation\_in\_percent fragment\_count page\_count avg\_page\_space\_used\_in\_percent record\_count      99.3116118225536 92535 92535 67.1668272794663 250000 99.5 200 200 74.2868173956017 92535 0 1 1 32.0978502594514 200 </code></pre><p>ale pro <code>t2</code> fragmentace je minimální</p><pre><code>avg\_fragmentation\_in\_percent fragment\_count page\_count avg\_page\_space\_used\_in\_percent record\_count      0.376 262 62500 99.456387447492 250000 2.1551724137931 232 232 43.2438349394613 62500 0 1 1 37.2374598468001 232 </code></pre><p>naopak někdy budete chtít donutit sql server, aby podceňoval počet řádků, když víte, že data jsou již předem roztříděna a chcete zabránit zbytečnému třídění. jedním z pozoruhodných příkladů je vložení velkého počtu řádků do tabulky pomocí seskupeného indexového klíče <code>newsequentialid</code>. <a href="https://connect.microsoft.com/sqlserver/feedback/details/668540/unnecessary-sort-operation-for-insert-into-clustered-index-with-newsequentialid-key">ve verzích sql serveru před denali sql server přidává zbytečnou a potenciálně nákladnou operaci řazení</a> . tomu lze zabránit</p><pre><code>declare @var int =2147483647 insert into foo select top (@var) * from bar </code></pre><p>sql server poté odhadne, že bude vloženo 100 řádků bez ohledu na velikost <code>bar</code>, která je pod prahem, při kterém je do plánu přidáno řazení. jak je však uvedeno v poznámkách níže, znamená to, že vložka bohužel nebude moci využít výhody minimálního protokolování.</p> Videl bych to na prava na slozce. Pouzivam osobne XP, ale na nich se musi v moznostech slozky odzaskrtnout pole pouzivat zjednodusene sdileni. Po te pri kazdem nastavovani sdileni slozky pribude zalozka s pravama, kde se da nastavit uzivatel nebo skupina, ktera do slozky muze vstupovat, zapisovat atd. <p>je to velmi užitečné v každém scénáři, kde je jedna část třídy generována nějakým vlastním nástrojem, protože umožňuje přidat vlastní logiku do vygenerovaného kódu bez zdědění generované třídy. mimochodem. ze stejného důvodu existují také částečné metody.</p><p>nejde jen o uživatelské rozhraní, ale také o jiné technologie, jako je linq-to-sql nebo entity framework.</p> <p>provozoval jsem systém s nejlepší částí z tisíce databází rozložených na více serverech. všechny byly identické struktury a byly synchronizovány s databází šablon, která byla na každém počítači.</p><p>to mi umožnilo migrovat databáze z jednoho db na druhý, pokud by se jeden příliš přetěžoval, a když se změnil klientský mix, mohl jsem na různých serverech vytvářet nové databáze, abych mohl načíst rovnováhu mezi servery. to byla největší výhoda, kterou jsem získal od systému, v tom, že jsem měl na několika samostatných serverech několik velkých kusů cínu, které prováděly více komplikovaných dotazů současně.</p><p>skvělá věc je, že můžete do konfigurace přidat servery svou vlastní rychlostí, protože každý server se začíná přetížit, přidat další do mixu, přenést některé dbs na nový server a skončit pěkně načíst vyváženou sadu serverů. opravdu pěkný a jednoduchý způsob, jak přidat měřítko do systému, kdykoli je to potřeba!</p><p>důvodem, proč jsem šel s tímto přístupem spíše než s jediným obrovským databázovým přístupem, byla naprostá velikost potenciální databáze, která by byla vytvořena ... každá z 1000 databází měla 200 tabulek a mnoho jednotlivých tabulek v každé z databáze obsahovaly mnoho stovek <strong>milionů</strong> řádků dat!</p><p>konfigurace jediné databáze by vyžadovala, aby určité tabulky (přibližně 8 z nich) měly více miliard řádků dat a celková velikost db by byla přes 10tb. podařilo se nám mít více serverů s 5tb úložiště raid 10, s mnoha databázemi na každém.</p><p>to bych udělal! doufám, že to pomůže vašemu rozhodování ... :)</p> <p><strong> aktualizace leden 2017 - sql server 2016+/azure sql database </strong></p><p>sql server 2016 a aktuální verze azure sql database má nyní následující syntaxi pro funkce, procedury, tabulky, databáze atd. ( <a href="https://blogs.msdn.microsoft.com/sqlserverstorageengine/2015/11/03/drop-if-exists-new-thing-in-sql-server-2016/"><code>drop if exists</code></a> ):</p><pre><code>drop function if exists dbo.fn\_myfunc; </code></pre><p>a sql server 2016 service pack 1 přidává ještě lepší funkčnost pro moduly (funkce, procedury, spouštěče, zobrazení), což znamená, že nedochází ke ztrátě oprávnění nebo závislostí ( <a href="https://blogs.msdn.microsoft.com/sqlserverstorageengine/2016/11/17/create-or-alter-another-great-language-enhancement-in-sql-server-2016-sp1/"><code>create or alter</code></a> ):</p><pre><code>create or alter function dbo.fn\_myfunc ... </code></pre><p>obě tato vylepšení syntaxe mohou vést k mnohem jednodušším skriptům používaným pro řízení zdroje, nasazení atd.</p><p>ale pokud používáte ...</p><hr><p><strong> starší verze </strong></p><p>při skriptu z management studio je třeba udělat to, co sql server dělá:</p><pre><code>if not exists (select 1 from sys.objects where type = 'fn' and name = 'fn\_myfunc') begin declare @sql nvarchar(max); set @sql = n'create function ...'; exec sp\_executesql @sql; end </code></pre><p>nebo můžete říct:</p><pre><code>begin try drop function dbo.fn\_myfunc; end try begin catch print 'function did not exist.'; end catch go create function... </code></pre><p>nebo můžete jen říct:</p><pre><code>drop function dbo.fn\_myfunc; go create function... </code></pre><p>(zde se zobrazí chybová zpráva, pokud funkce již neexistuje, ale skript bude pokračovat od příštího go, takže ať už kapka pracovala nebo ne, bude funkce stále vytvořena (znovu).)</p><p>pokud funkci zrušíte a znovu ji vytvoříte, ztratíte také oprávnění a informace o závislostech.</p> <p>re: co je to přidružená síť? odpověď: <a href="http://en.wikipedia.org/wiki/affiliate\_network">en.wikipedia.org/wiki/affiliate\_network</a> </p><ol> <li> <a href="http://cj.com">commission junction</a> </li> <li> <a href="http://linkshare.com">linkshare.com</a> </li> <li> <a href="http://www.hydragroup.com/">hydra network</a> </li> <li> <a href="http://www.clickbank.com/">klikněte na banka</a> </li> <li> <a href="http://www.clickbooth.com/">click booth</a> </li> <li> <a href="http://www.clickspeed.com/">click speed</a> </li> </ol> <p>naposledy, co jsem hrál s accessem, bylo, když byl rok 2003 žhavou novinkou, takže to nemusí být úplně přesné pro každý detail. co však musíte udělat, je přejít na návrháře dotazů, změnit pohled na „sql“ (tj. vstup surového textu) a poté chcete <code>union</code> své dva levé spojovací dotazy dohromady, např.</p><pre><code>select lista.*, listb.* from lista left join listb on lista.[staffid] = listb.staffid union select lista.*, listb.* from listb left join lista on listb.[staffid] = lista.staffid </code></pre>