sql >> Database >  >> RDS >> Oracle

Wanneer hints gebruiken in orakelquery's?

De meeste hints zijn een manier om onze intentie aan de optimizer te communiceren. Bijvoorbeeld de leading hint die je noemt betekent aan tafels samenvoegen in deze volgorde . Waarom is dit nodig? Vaak is het omdat de optimale volgorde van samenvoegen niet duidelijk is, omdat de query slecht is geschreven of de databasestatistieken onnauwkeurig zijn.

Dus een gebruik van hints zoals leading is om het beste uitvoeringspad te vinden en vervolgens om erachter te komen waarom de database dat plan niet kiest zonder de hint. Lost het verzamelen van nieuwe statistieken het probleem op? Lost het herschrijven van de FROM-clausule het probleem op? Als dat zo is, kunnen we de hints verwijderen en de naakte SQL implementeren.

Soms kunnen we dit raadsel niet oplossen en moeten we de hints in Productie houden. Dit zou echter een zeldzame uitzondering moeten zijn. Oracle heeft jarenlang heel veel slimme mensen aan de Cost-Based Optimizer laten werken, dus zijn beslissingen zijn meestal beter dan die van ons.

Maar er zijn andere hints die we niet zouden zien in Productie. append is vaak cruciaal voor het afstemmen van bulkinserts. driving_site kan van vitaal belang zijn bij het afstemmen van gedistribueerde zoekopdrachten.

Omgekeerd worden andere hints bijna altijd misbruikt. Ja parallel , Ik heb het over jou. Blindelings /*+ parallel (t23, 16) */ zal uw zoekopdracht waarschijnlijk niet zestien keer sneller laten verlopen, en niet zelden zal dit resulteren in langzamer ophalen dan een single-threaded uitvoering.

Kortom, er is geen universeel toepasbaar advies over wanneer we hints moeten gebruiken. De belangrijkste dingen zijn:

  1. begrijpen hoe de database werkt, en vooral hoe de op kosten gebaseerde optimalisatie werkt;
  2. begrijp wat elke hint doet;
  3. test hints in een goede afstemmingsomgeving met productie-equivalente gegevens.

De beste plaats om te beginnen is uiteraard de Oracle-documentatie . Als je echter wat geld wilt uitgeven, lees dan het boek van Jonathan Lewis over de Cost-Based Optimizer is de beste investering die u kunt doen.



  1. Wat is de meest elegante manier om een ​​tijdstempel met nanosec op te slaan in postgresql?

  2. ProgrammingError:niet alle argumenten geconverteerd tijdens tekenreeksopmaak

  3. hoe kan ik mijn SQL-resultaten dupliceren?

  4. syntaxisfout op of nabij 'order' in PostgreSQL