it-swarm-eu.dev

Non-Clustered-Index na dočasné tabulce

Pracuji na různých technikách optimalizace dotazů. Zkrátil jsem čas provádění dotazů z 1 minuty na 12 sekund pouhým přidáním indexu bez klastru na tabulku obsahující jeden sloupec (který se používá ve více podmínkách, kde), ale DBA je velmi vybíravá o přidávání indexů.

Chtěl bych vědět, jestli to dělá nějaký rozdíl přidáním NCI na dočasnou tabulku namísto skutečné tabulky. Pokud ANO, jak? Pokud NE, proč?

4
Learner

Souhrn o přístupu dynamického přidávání NCI na tabulku s vysokým provozem:

Čas potřebný k vytvoření NCI na dočasné tabulce byl mnohem víc než jeho čtení. Celkově tedy zpracování dotazu trvalo mnohem déle.

NCI na skutečném stole je mnohem rychlejší.

Nakonec jsme se rozhodli trochu optimalizovat dotaz a vytvořit NCI ve skutečné tabulce.

Odpověď na mou otázku je ANO

to dělá obrovský rozdíl, když vytvoříte NCI na dočasné tabulce vs. skutečné tabulce. Alespoň pro můj scénář (vysoká přenosová tabulka s miliony záznamů a neustále přicházející data) je to nesprávný přístup k vytváření NCI na dočasné tabulce, protože vytvoření indexu trvá déle, než jej číst (znovu je to pro můj typ scénář).

Když jsem se této otázky zeptal, moje porozumění indexům bylo omezené. Dnes se naučil o něco víc.

Děkuji všem!

0
Learner

Dočasné tabulky vyhovují stejným pravidlům jako trvalé tabulky, pokud jde o indexování. Jediný rozdíl je v umístění úložiště, což je Tempdb pro dočasné tabulky.
Pokud však do tabulky, která je silně zapsaná, přidáváte index, musíte vzít v úvahu kompromis mezi zápisem a přečtením.

Protože dočasná tabulka je pravděpodobně používána v proceduře nebo ve skriptu, je to váš kód, který určuje, jak tvrdě bijete tabulku pomocí zápisu.
VLOŽKY jsou rychlejší bez indexů: pokud vkládáte velké množství dat do více příkazů, pravděpodobně budete chtít vytvořit index po úplném naplnění tabulky.
AKTUALIZACE a ODSTRANĚNÍ musí nejprve najít řádky, které je třeba upravit, aby mohli mít z řádného indexování velký prospěch.

Pokud váš DBA chce zaplatit (hodně) více přečtení + CPU + uběhlý čas vs. některé zápisy, myslím, že by měl vyjasnit svůj názor.

Dlouhý příběh krátký, pokud váš kód běží s NCI rychleji, pokračujte a přidejte jej.

11
spaghettidba

Jaké rozdíly hledáte? Rozdíl je v tom, že tabulka je uložena v tempdb, na rozdíl od aktuální databáze. Totéž platí pro index. Viz níže:

use TestDB;
go

if exists (select 1 from tempdb.sys.tables where name like '#MyTempTable%')
begin
    drop table #MyTempTable;
end
create table #MyTempTable
(
    id int identity(1, 1) not null
);
go

insert into #MyTempTable
default values;
go 100

select *
from #MyTempTable;

create unique nonclustered index IX_MyTempTable
on #MyTempTable (id);
go

select
    name,
    object_id,
    type_desc
from tempdb.sys.tables
where name like '#MyTempTable%';

select
    name,
    object_id,
    index_id,
    type_desc
from tempdb.sys.indexes
where name = 'IX_MyTempTable';

Měli byste vidět něco podobného výstupu výše:

name                            object_id         type_desc
--------------------------      -----------       ---------
#MyTempTable________......      -1516322775       USER_TABLE


name                   object_id         index_id          type_desc
--------------         -----------       -----------       ---------
IX_MyTempTable         -1516322775       2                 NONCLUSTERED

Jaké další rozdíly hledáte? Jaké je zdůvodnění DBA za nejistotou vytvoření indexu v dočasné tabulce?

2
Thomas Stringer