Included columns v Dynamics AX 2012

Included columns* je schopnost SQL Serveru (od verze 2005) týkající se indexů. Díky ní můžete připojit k indexu další sloupce, které nejsou používány pro vyhledávání (takže se nemusí tak nákladně udržovat), ale které může databáze použít pro vrácení dat. Pokud jsou všechny sloupce vracené dotazem zahrnuty v indexu, databázový server může rovnout vrátit data a vůbec nemusí přistupovat k tabulce jako takové, což samozřejmě šetří čas.

(* není mi znám žádný ustálený český překlad, tak to raději ponechám v původním znění)

Included columns mají i další výhody:

  • mohou být přidány do unikátního indexu, aniž by měly vliv na unikátnost
  • podporují i (některé) datové typy, které nemohou být použity v běžných indexech
  • nepočítají se do limitu sloupců v indexu (16)
  • nepočítají se do limitu velikosti indexu (900 bytů)

Platí pro ně následující (logická) omezení:

  • jsou vždy až na konci indexu
  • index musí obsahovat alespoň jeden “normálně” indexovaný sloupec
  • nemohou být použity v klastrovaných indexech

Samozřejmě i included columns mají vliv na velikost indexu, takže mohou zpomalovat operace s indexem a zabírat místo na disku.

Podpora v Dynamics AX 2012

Vytvořit included column je v AX2012 velmi snadné. Přidejte pole do indexu stejným způsobem jako obvykle a pak na tomto sloupci indexu změňte vlastnost IncludedColumns na Yes.

Na obrázku je konkrétní příklad z AX2012 – index TransIdIx na tabulce CustInvoiceTrans. Má tři “normální” pole použitelná pro vyhledávání a dvě dodatečná pole (Qty a QtyPhysical) pro pokrytí nějakých dotazů na tato pole.

Obdobným způsobem můžete rozšířit i unikátní indexy. Například vytvoříte index s unikátním polem Id a k němu připojíte pole Name, na které se často dotazujete. Takový index sice můžete stále přiřadit jako primární (což byste nemohli, pokud by druhé pole nebylo included column), ale synchronizace databáze selže. Takže unikátní indexy ano, primární ne.

AX vám sice dovolí přepnout vlastnost IncludedColumn na libovolném poli v indexu, ale neplatnou konfiguraci vám samozřejmě odmítne SQL Server při synchronizaci.

Reflexe

Může se vám také hodit podpora pro included columns pro reflexi (můžete si chtít třeba vypsat prodrobnosti o všech indexech ve svém modulu). Konkrétně jde o tyto metody ve třídě DictIndex:

  • int numberOfIncludedColumns()
  • FieldId includedColumns(int _inclColumnIdx)

Jen jsem narazil na nějaký problém s automaticky generovaným indexem RecId. To je vidět i na následujcím obrázku – AX vrací správný počet included columns pro ostatní indexy (1 a 0), ale 35888 sloupců v indexu RecId je zjevný nesmysl. Každé spuštění navíc vrací jinou hodnotu – skoro to vypadá, že AX čte špatnou paměťovou adresu, ale kdoví.

Included columns se určitě vyplatí používat – bez nich buďto musíte oželet pokrytí některých dotazů, nebo vytvářet plnohodnotné (a nákladněji udržované) indexy. Někdy vám included columns umožní i snížit počet potřebných indexů.

To ale neznamená, že je možné začít přidávat bezmyšlenkovitě sloupce do indexů – i správa included columns něco stojí.