Selbst nach mehreren Jahren MDX kommt es immer mal wieder vor, dass man eine Funktion oder ein Statement noch nie gehört oder zumindest noch nie benutzt hat. So ging mir das vor kurzem, als ich das erste mal den Ausdruck HAVING in einer MDX Query gesehen habe, einen alten Bekannten aus der Abfragesprache SQL.

Grundsätzlich ist HAVING (gibt es seit SQL Server 2005) eine einfacher lesbare Alternative zum Filter. Interessantester Unterschied ist aber der Kontext in dem es ausgeführt wird.

(Details für Interessierte: http://www.databasejournal.com/features/mssql/article.php/3662721/MDX-Clauses-and-Keywords-Use-HAVING-to-Filter-an-Axis.htm)

Wie im SQL ist es nämlich die letzte Anweisung, die ausgeführt wird, wodurch es in bestimmten Situationen dramatisch schneller ist als der FILTER.

Ich denke eines der besten Einsatzgebiete könnte sein, wenn ich die zurückgegebenen Zeilen nach einer sehr komplexen Kalkulation filtern will, die ich aber gar nicht ausgeben möchte. Dieses Szenario habe ich in den nächsten beiden Abfragen mal versucht anhand des berechneten Elements „Teuer“ zu simulieren.

Abfrage mit FILTER

[TS_EnlighterJS_Snippet_Single code_theme=“classic“ code_content=“V0lUSCUwQU1FTUJFUiUyMFRldWVyJTIwQVMlMjBBVkclMjglNUJHZW9ncmFwaHklNUQuJTVCQ2l0eSU1RC4lNUJDaXR5JTVELk1FTUJFUlMlMkNBVkclMjglNUJEYXRlJTVELiU1QkRhdGUlNUQuJTVCRGF0ZSU1RC5NRU1CRVJTJTJDJTIwJTVCTWVhc3VyZXMlNUQuJTVCSW50ZXJuZXQlMjBPcmRlciUyMENvdW50JTVEJTIwJTJGJTIwJTI4JTVCTWVhc3VyZXMlNUQuJTVCSW50ZXJuZXQlMjBPcmRlciUyMENvdW50JTVEJTJDJTVCRGF0ZSU1RC4lNUJEYXRlJTVELiU1QkFsbCUyMFBlcmlvZHMlNUQlMjklMjklMjklMEFTRUxFQ1QlMjAlN0IlNUJNZWFzdXJlcyU1RC4lNUJJbnRlcm5ldCUyMFNhbGVzJTIwQW1vdW50JTVEJTdEJTIwT04lMjAwJTJDJTBBTk9ORU1QVFklN0JGSUxURVIlMjglNUJDdXN0b21lciU1RC4lNUJDdXN0b21lciU1RC4lNUJDdXN0b21lciU1RC5NRU1CRVJTJTJDJTIwJTVCTWVhc3VyZXMlNUQuJTVCSW50ZXJuZXQlMjBHcm9zcyUyMFByb2ZpdCU1RCUyMCUzRSUyMDAlMjBBTkQlMjBUZXVlciUyMCUzRSUyMDAuMjUlMjklN0QlMEFPTiUyMDElMEFGUk9NJTIwJTVCQWR2ZW50dXJlJTIwV29ya3MlNUQlMEFXSEVSRSUyMCUyOCU1QkN1c3RvbWVyJTVELiU1QkN1c3RvbWVyJTIwR2VvZ3JhcGh5JTVELiU1QkNvdW50cnklNUQuJTI2JTVCR2VybWFueSU1RCUyOQ==“]

Abfrage mit HAVING

[TS_EnlighterJS_Snippet_Single code_theme=“classic“ code_content=“V0lUSCUwQU1FTUJFUiUyMFRldWVyJTIwQVNBVkclMjglNUJHZW9ncmFwaHklNUQuJTVCQ2l0eSU1RC4lNUJDaXR5JTVELk1FTUJFUlMlMkNBVkclMjglNUJEYXRlJTVELiU1QkRhdGUlNUQuJTVCRGF0ZSU1RC5NRU1CRVJTJTJDJTIwJTVCTWVhc3VyZXMlNUQuJTVCSW50ZXJuZXQlMjBPcmRlciUyMENvdW50JTVEJTIwJTJGJTIwJTI4JTVCTWVhc3VyZXMlNUQuJTVCSW50ZXJuZXQlMjBPcmRlciUyMENvdW50JTVEJTJDJTVCRGF0ZSU1RC4lNUJEYXRlJTVELiU1QkFsbCUyMFBlcmlvZHMlNUQlMjklMjklMjklMEFTRUxFQ1QlMjAlN0IlNUJNZWFzdXJlcyU1RC4lNUJJbnRlcm5ldCUyMFNhbGVzJTIwQW1vdW50JTVEJTdEJTIwT04lMjAwJTJDJTBBTk9ORU1QVFklN0IlNUJDdXN0b21lciU1RC4lNUJDdXN0b21lciU1RC4lNUJDdXN0b21lciU1RC5NRU1CRVJTJTdEJTBBSEFWSU5HJTIwJTVCTWVhc3VyZXMlNUQuJTVCSW50ZXJuZXQlMjBHcm9zcyUyMFByb2ZpdCU1RCUyMCUzRSUyMDAlMjBBTkQlMjBUZXVlciUzRTAuMjUlMEFPTiUyMDElMEFGUk9NJTIwJTVCQWR2ZW50dXJlJTIwV29ya3MlNUQlMEFXSEVSRSUyMCUyOCU1QkN1c3RvbWVyJTVELiU1QkN1c3RvbWVyJTIwR2VvZ3JhcGh5JTVELiU1QkNvdW50cnklNUQuJTI2JTVCR2VybWFueSU1RCUyOSUwQSUwQSUzQyUzRnhtbCUzQW5hbWVzcGFjZSUyMHByZWZpeCUyMCUzRCUyMG8lMjAlMkYlM0U=“]

Beide Abfragen liefern exakt das gleiche Ergebnis. FILTER benötigt für die 1747 Zeilen ca. 40 Sekunden. HAVING benötigt 4 (vier!).