sql >> Databáze >  >> RDS >> Sqlserver

SQL Server 2008:Řazení podle data a času je příliš pomalé

Řazení podle id pravděpodobně používá skenování seskupeného indexu při objednávání podle datetime používá buď řazení, nebo vyhledávání v indexu.

Obě tyto metody jsou pomalejší než skenování seskupeného indexu.

Pokud je vaše tabulka seskupená podle id , v podstatě to znamená, že je již seřazeno. Záznamy jsou obsaženy v B+Tree který má propojený seznam propojující stránky v id objednat. Motor by měl pouze procházet propojený seznam, aby získal záznamy seřazené podle id .

Pokud id s byly vkládány v sekvenčním pořadí, to znamená, že fyzické pořadí řádků bude odpovídat logickému pořadí a skenování seskupeného indexu bude ještě rychlejší.

Pokud chcete, aby byly vaše záznamy seřazeny podle datetime , jsou dvě možnosti:

  • Vezměte všechny záznamy z tabulky a seřaďte je. Pomalost je zřejmá.
  • Používejte index v datetime . Index je uložen v samostatném prostoru na disku, což znamená, že stroj musí přecházet mezi stránkami indexu a stránkami tabulky ve vnořené smyčce. Je také pomalejší.

Chcete-li zlepšit řazení, můžete vytvořit samostatný index pokrytí v datetime :

CREATE INDEX ix_mytable_datetime ON mytable (datetime) INCLUDE (field1, field2, …)

a zahrňte do tohoto indexu všechny sloupce, které používáte ve svém dotazu.

Tento index je jako stínová kopie vaší tabulky, ale s daty seřazenými v jiném pořadí.

To vám umožní zbavit se vyhledávání klíčů (protože index obsahuje všechna data), což způsobí řazení podle datetime stejně rychle jako na id .

Aktualizace:

Nový blogový příspěvek o tomto problému:



  1. [A]MySql.Data.MySqlClient.MySqlConnection nelze přenést do [B]MySql.Data.MySqlClient.MySqlConnection

  2. spojit datový sloupec oddělený čárkou

  3. Chyba nesouladu dat Laravel při použití \PDO::ATTR_EMULATE_PREPARES => true

  4. Jak vyřešit chybu MySQL Nemůžete zadat cílovou tabulku X pro aktualizaci v klauzuli FROM?