Příznaky

Předpokládejme, že vytvoření oddílů tabulky v Microsoft SQL Server. Při spuštění nahoru, MAX nebo MIN seskupení klauzulí ve sloupcích tabulky, může dojít k snížení výkonu.

Poznámka: Tento problém pouze na vytváření oddílů sloupec nedochází.

Jak potíže obejít

Chcete-li tento problém vyřešit, vytvořit dotaz, který shromažďuje Prvních N prvků jednotlivých oddílů. Potom vyhledejte Prvních N prvků z této kolekce prvků.

Například máte tabulku T1 , který má čtyři oddíly a funkce oddílu je PF1. V tabulce je rozdělen na sloupec PCOL a má index idx_c1 na T1.c1. Výkon problému může dojít, pokud spustíte následující dotaz:

SELECT TOP 3 T1.c1, T1.c2
FROM dbo.T1

ORDER BY T1.c1


Chcete-li tento problém vyřešit, postupujte takto:

  1. Najděte první 3 prvky daného oddílu <partition_number>:

    SELECT TOP 3 T1.c1, T1.c2                FROM dbo.T1
    WHERE $PARTITION.PF1(PCOL) = <
    partition_number> AS A(c1, c2) ORDER BY T1.c1;
  2. Najděte nejlepší 3 prvky všech čtyř oddílů:

    SELECT TOP 3 A.c1, A.c2FROM (VALUES((1),(2),(3),(4)) AS P( partition_number )
    CROSS APPLY ( SELECT TOP 3 (T1.c1, T2.c2)
    FROM dbo.T1
    WHERE $PARTITION.PF1(T1.PCOL) = P.partition_number
    ORDER BY T1.c1 ) AS A
    ORDER BY A.c1
  3. Bohužel Pokud v tabulce je přeformátován, je nutné přepsat tyto dotazy použijte nový počet oddílů. Můžete však také získat počet oddílů z sys.partitions. Proto místo použití konstantní seznam oddílů, můžete použít následující skript SQL:

    SELECT TOP 3 A.c1, A.c2FROM  sys.partitions AS P
    CROSS APPLY ( SELECT TOP 3 T1.c1, T2.c2)
    FROM dbo.T1
    WHERE $PARTITION.PF1(T1.col1) = P.partition_number
    ORDER BY T1.c1 ) AS A
      WHERE P.object_id = OBJECT_ID('dbo.T1')  
      AND P.index_id = INDEXPROPERTY( OBJECTID('dbo.T1'), 'idx_c1', 'INDEXID')
    ORDER BY a;


Poznámka: V tomto článku používá Prvních N s objednávkou klauzulí jako příklad. Maximální a minimální hodnota klauzule mají podobné problémy. Proto mohly být zpracovány kolem jejich zapínáním do TOP 1 dotazů nastavena na vzestupném nebo sestupném pořadí.

Další informace

Při dotazu u Prvních N řádků indexovaného sloupce v tabulce bez oddílů, dotaz má obvykle velmi dobrý výkon. Důvodem je skutečnost, že plán dotazu prohledává index k určení horní n prvků.

Však pro tabulku oddílů, to není případ, jako indexy může také být rozděleny do oddílů. To znamená, že není možné dotazování pouze indexy pro stanovení prvních N prvků. Tyto prvky může být distribuován do všech oddílů. Zvažte například následující případ, ve kterém jste vytvořili tabulku "a" se dvěma oddíly P0 a P1 , které jsou rozděleny kolem 0:

Oddíl

Klíč

Hodnota

P0

-2

1

P0

-1

1

P0

0

12

P1

1

1

P1

2

1

P1

3

15


Vzhledem k tomu, že každý index je rozdělený na oddíly, SQL Server nemůže prohledat index všech současně k určení maximální hodnota. Místo toho zkontroluje každý prvek v tabulce k určení maximální hodnoty. V tabulce, která obsahuje miliony řádků tento proces může být velmi neefektivní.

Stav

Společnost Microsoft potvrdila, že se jedná o problém v produktech společnosti Microsoft, které jsou uvedeny v části "Platí pro".

Potřebujete další pomoc?

Rozšiřte své znalosti a dovednosti
Projít školení
Získejte nové funkce jako první
Připojit se k programu Microsoft Insider

Byly tyto informace užitečné?

Jak jste spokojeni s kvalitou jazyka?
Co ovlivnilo váš názor?

Děkujeme vám za zpětnou vazbu.

×