efektivní vložte do tabulky se seskupeným indexem
<p>mám příkaz sql, který vkládá řádky do tabulky se seskupeným indexem ve sloupci tracking\_number.</p><p>např.:</p><pre><code>insert into tabl\_name (tracking\_number, colb, colc) select tracking\_number, col\_b, col\_c from staging\_table </code></pre><p>moje otázka zní - pomůže to použít klauzuli order by v příkazu select pro sloupec seskupeného indexu, nebo by byl jakýkoli dosažený zisk negován zvláštním druhem požadovaným pro klauzuli order by?</p>
<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>
Neexistuje žádný dobrý důvod vzdát zjevné indexy (FKS, atd), při vytváření tabulky. To se nikdy výrazně ovlivnit výkon na to, aby nepotřebné indexy malých tabulek, a to je dobré, aby se první řez, když je vaše mysl v souvislosti s návrhem schématu. Také některé indexy slouží k zabránění duplicity, které mohou být užitečné bez ohledu na velikost tabulky.


Myslím, že správná odpověď na vaši otázku je, že počet záznamů v tabulce by měl mít nic společného s tím, když se vytvořit indexy. =Row() pro radek=Column() pro sloupecjako argument to bere i referenci. Bez reference to udava cislo/pismeno radku/sloupce aktualni bunky. Pokud se ti nechce do maker, tak prohoď řádky a sloupce a použij standardní řazení.[http://www.chip.cz/clanky/tipy-triky/aplikac...](http://www.chip.cz/clanky/tipy-triky/aplikace/2011/07/prevraceni-tabulky-2013-zamena-radku-a-sloupcu) Indexace ve Windows je inteligentni a reaguje na ZMENU (pribyde soubor, zmeni se soubor, smaze se soubor). Takze disk se musi stejne "roztocit" aby zmenu zapsal.Jinak je zatizeni indexaci znat jen pri reindexaci celeho rozsahu (napr. po pridani ifiltru, restore bambilionu souboru a pod).Osobne povazuj indexaci ve Win za velmi dobrou od Win XP a vyuzivam ji, dale na ni zaviseji nektere programy - typicky MS Outlook ... Jen doporucuji naucit se advanced query syntax: [https://docs.microsoft.com/en-us/windows/win32/lwef/...](https://docs.microsoft.com/en-us/windows/win32/lwef/-search-2x-wds-aqsreference?redirectedfrom=MSDN)  MP Použito v malém rozsahu pro evidenci ve vlastním podnikání. Vyzkoušej, je trochu jiný než Acces ale nemá špatné možnosti. Pokud chceš ještě více funkcionality, můžeš zkusit lokální instalaci mysql serveru a LOB použít jako klienta. Č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. <p>použil bych <code>collectors.groupingby</code> s upraveným <code>localdate</code> na klasifikátoru, takže položky s podobnými daty (podle <em>komprese</em> zadané uživatelem) jsou seskupeny dohromady.</p><p>nejprve vytvořte následující <code>map</code>:</p><pre><code>static final map&lt;string, temporaladjuster&gt; adjusters = new hashmap&lt;&gt;(); adjusters.put("day", temporaladjusters.ofdateadjuster(d -&gt; d)); // identity adjusters.put("week", temporaladjusters.previousorsame(dayofweek.of(1))); adjusters.put("month", temporaladjusters.firstdayofmonth()); adjusters.put("year", temporaladjusters.firstdayofyear()); </code></pre><p>poznámka: pro <code>"day"</code> je používáno <code>temporaladjuster</code>, které umožňuje nedotčené datum.</p><p>poté pomocí <code>compression</code> zadaného uživatelem dynamicky vyberte způsob seskupení seznamu položek:</p><pre><code>map&lt;localdate, list&lt;item&gt;&gt; result = list.stream() .collect(collectors.groupingby(item -&gt; item.getcreationdate() .with(adjusters.get(compression)))); </code></pre><p><code>localdate</code> se nastavuje metodou <a href="https://docs.oracle.com/javase/8/docs/api/java/time/localdate.html#with-java.time.temporal.temporaladjuster-"><code>localdate.with(temporaladjuster)</code></a> .</p> Ano, jistě. Záleží pak na tom, jak přesně si to představuješ. Dle konkrétního zadání lze řešit přes vzorce, případně si vypomoci přes nějaké makro a událost listu. P. Ach jo, kam ten svět kráčí.1) vložit jinak - hodnoty2) úplně nechápu zadaní, ale předpokládám, že fce CONCATENATEpoužití google, nebo nápovědy (F1) ti řekne více Nebyla by lepší kontingenční tabulka filtrovaná pomocí průřezů? V průřezech si naklikáš kombinaci a kontingenční tabulka pak ukáže dané hodnoty.