Freitag, Mai 27, 2016

CBO Transformationen für count distinct Operationen

Anfang 2014 hatte ich hier einen Artikel angesprochen, der im High-Performance Blog von Persicope erschienen war und versprach, postgres Queries mit einer count distinct Operation um den Faktor 50 zu beschleunigen. Ich hatte damals selbst ein paar Tests mit Oracle durchgeführt, die zeigten, dass die Umformulierung auch dort nützlich ist, aber weitaus weniger dramatische Effekte hervorruft als bei postgres (was kurz darauf in einem weiteren Artikel bei Periscope ebenfalls angemerkt wurde. Außerdem hatte ich einen Artikel von Hubert Lubacewski verknüpft, in dem dieser zeigte, dass man durch geschicktere Umformulierung in postgres noch sehr viel mehr erreichen kann als mit den periscope-Varianten.

Jetzt hat Jonathan Lewis im Scratchpad auf den Artikel verwiesen und dabei gezeigt, dass der CBO für einfachere Beispiele durchaus dazu in der Lage ist, diese Umformung selbständig durchzuführen. Verwendet werden dabei folgende Optimizer-Transformationen:
  • place group by: verfügbar ab 11.1.0.6 (2007)
  • transform distinct aggregation: verfügbar seit 11.2.0.1 (2009)
Wie üblich ist der Optimizer aber nicht in jedem Fall dazu in der Lage, die richtige Strategie auszuwählen, so dass man ihn manchmal durch Hints auf die richtige Spur bringen muss (hier etwa: no_transform_distinct_agg).

Keine Kommentare:

Kommentar veröffentlichen