{"id":97600,"date":"2023-08-02T17:00:40","date_gmt":"2023-08-02T17:00:40","guid":{"rendered":"https:\/\/www.red-gate.com\/simple-talk\/?p=97600"},"modified":"2023-08-09T15:27:57","modified_gmt":"2023-08-09T15:27:57","slug":"managing-query-store-hints","status":"publish","type":"post","link":"https:\/\/www.red-gate.com\/simple-talk\/blogs\/managing-query-store-hints\/","title":{"rendered":"Managing Query Store Hints"},"content":{"rendered":"<p>I wrote about <a href=\"https:\/\/www.red-gate.com\/simple-talk\/blogs\/query-store-hints-powerful\/\">query store hints<\/a> before when they were first released in Azure SQL databases.<\/p>\n<p>However, there are some tricks related to managing query store hints we will explore on this blog post.<\/p>\n<h2>Applying Query Store Hint<\/h2>\n<p>When we apply a query store hint, the query already exists in query store, and it has at least one plan registered. It&#8217;s even possible to have more.<\/p>\n<p>The query hint will only be applied to further executions of the query, so the existing plans in query store don&#8217;t have the query hint applied.<\/p>\n<p>The query store DMVs have relationships to each other, so we can relate the query_store_query_hints DMV with the query plans. However, the result will not identify if the plan was already there before the query hint was created, resulting in a false information about which plan was using which query hint.<\/p>\n<p>The query to retrieve hints and plans is the following:<\/p>\n<div><span style=\"font-family: Courier New;font-size: 10pt\"> <span style=\"color: blue\">SELECT<\/span>\u00a0<span style=\"color: maroon\">query_hint_id<\/span><span style=\"color: silver\">,<\/span> <br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: maroon\">qsq<\/span><span style=\"color: silver\">.<\/span><span style=\"color: maroon\">query_id<\/span><span style=\"color: silver\">,<\/span> <br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: maroon\">query_hint_text<\/span><span style=\"color: silver\">,<\/span> <br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: maroon\">qsq<\/span><span style=\"color: silver\">.<\/span><span style=\"color: maroon\">query_text_id<\/span><span style=\"color: silver\">,<\/span> <br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: maroon\">query_sql_text<\/span><span style=\"color: silver\">,<\/span> <br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: maroon\">qsp<\/span><span style=\"color: silver\">.<\/span><span style=\"color: maroon\">plan_id<\/span><span style=\"color: silver\">,<\/span> <br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: maroon\">query_plan<\/span> <br \/>\n<span style=\"color: blue\">FROM<\/span>\u00a0\u00a0\u00a0<span style=\"color: maroon\">sys<\/span><span style=\"color: silver\">.<\/span><span style=\"color: maroon\">query_store_query_hints<\/span>\u00a0<span style=\"color: maroon\">qsqh<\/span> <br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: blue\">INNER<\/span>\u00a0<span style=\"color: blue\">JOIN<\/span>\u00a0<span style=\"color: maroon\">sys<\/span><span style=\"color: silver\">.<\/span><span style=\"color: maroon\">query_store_query<\/span>\u00a0<span style=\"color: maroon\">qsq<\/span> <br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: blue\">ON<\/span>\u00a0<span style=\"color: maroon\">qsqh<\/span><span style=\"color: silver\">.<\/span><span style=\"color: maroon\">query_id<\/span>\u00a0<span style=\"color: silver\">=<\/span>\u00a0<span style=\"color: maroon\">qsq<\/span><span style=\"color: silver\">.<\/span><span style=\"color: maroon\">query_id<\/span> <br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: blue\">INNER<\/span>\u00a0<span style=\"color: blue\">JOIN<\/span>\u00a0<span style=\"color: maroon\">sys<\/span><span style=\"color: silver\">.<\/span><span style=\"color: maroon\">query_store_query_text<\/span>\u00a0<span style=\"color: maroon\">qsqt<\/span> <br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: blue\">ON<\/span>\u00a0<span style=\"color: maroon\">qsq<\/span><span style=\"color: silver\">.<\/span><span style=\"color: maroon\">query_text_id<\/span>\u00a0<span style=\"color: silver\">=<\/span>\u00a0<span style=\"color: maroon\">qsqt<\/span><span style=\"color: silver\">.<\/span><span style=\"color: maroon\">query_text_id<\/span> <br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: blue\">INNER<\/span>\u00a0<span style=\"color: blue\">JOIN<\/span>\u00a0<span style=\"color: maroon\">sys<\/span><span style=\"color: silver\">.<\/span><span style=\"color: maroon\">query_store_plan<\/span>\u00a0<span style=\"color: maroon\">qsp<\/span> <br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: blue\">ON<\/span>\u00a0<span style=\"color: maroon\">qsq<\/span><span style=\"color: silver\">.<\/span><span style=\"color: maroon\">query_id<\/span>\u00a0<span style=\"color: silver\">=<\/span>\u00a0<span style=\"color: maroon\">qsp<\/span><span style=\"color: silver\">.<\/span><span style=\"color: maroon\">query_id<\/span>\u00a0 <\/span><\/div>\n<p><img loading=\"lazy\" decoding=\"async\" width=\"997\" height=\"93\" class=\"wp-image-97601\" src=\"https:\/\/www.red-gate.com\/simple-talk\/wp-content\/uploads\/2023\/08\/word-image-97600-1.png\" \/><\/p>\n<h2>Changing the applied hint<\/h2>\n<p>When we change the applied hint to a query, the new hint overwrites the previous one. Once again, the new hint will only be applied when the query is compiled again.<\/p>\n<p>As a result, if you immediately use the query to show which plan is using which hint, you will get a completely wrong information.<\/p>\n<h2>Retrieving the correct hint applied to each plan<\/h2>\n<p>Each plan contains inside its definition, the hint which was used during the plan compilation. If you use the query below, the plan definitions appear in XML format. You can click the definition to open the plan. The Query Hint used with the plan will be in the properties window.<\/p>\n<div><span style=\"font-family: Courier New;font-size: 10pt\"> <span style=\"color: blue\">SELECT<\/span>\u00a0<span style=\"color: maroon\">query_hint_id<\/span><span style=\"color: silver\">,<\/span> <br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: maroon\">qsq<\/span><span style=\"color: silver\">.<\/span><span style=\"color: maroon\">query_id<\/span><span style=\"color: silver\">,<\/span> <br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: maroon\">query_hint_text<\/span><span style=\"color: silver\">,<\/span> <br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: maroon\">qsq<\/span><span style=\"color: silver\">.<\/span><span style=\"color: maroon\">query_text_id<\/span><span style=\"color: silver\">,<\/span> <br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: maroon\">query_sql_text<\/span><span style=\"color: silver\">,<\/span> <br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: maroon\">qsp<\/span><span style=\"color: silver\">.<\/span><span style=\"color: maroon\">plan_id<\/span><span style=\"color: silver\">,<\/span> <br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: fuchsia;font-style: italic\">CONVERT<\/span><span style=\"color: maroon\">(<\/span><span style=\"color: black;font-style: italic\">XML<\/span><span style=\"color: silver\">,<\/span>\u00a0<span style=\"color: maroon\">query_plan<\/span><span style=\"color: maroon\">)<\/span>\u00a0<span style=\"color: maroon\">query_plan<\/span> <br \/>\n<span style=\"color: blue\">FROM<\/span>\u00a0\u00a0\u00a0<span style=\"color: maroon\">sys<\/span><span style=\"color: silver\">.<\/span><span style=\"color: maroon\">query_store_query_hints<\/span>\u00a0<span style=\"color: maroon\">qsqh<\/span> <br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: blue\">INNER<\/span>\u00a0<span style=\"color: blue\">JOIN<\/span>\u00a0<span style=\"color: maroon\">sys<\/span><span style=\"color: silver\">.<\/span><span style=\"color: maroon\">query_store_query<\/span>\u00a0<span style=\"color: maroon\">qsq<\/span> <br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: blue\">ON<\/span>\u00a0<span style=\"color: maroon\">qsqh<\/span><span style=\"color: silver\">.<\/span><span style=\"color: maroon\">query_id<\/span>\u00a0<span style=\"color: silver\">=<\/span>\u00a0<span style=\"color: maroon\">qsq<\/span><span style=\"color: silver\">.<\/span><span style=\"color: maroon\">query_id<\/span> <br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: blue\">INNER<\/span>\u00a0<span style=\"color: blue\">JOIN<\/span>\u00a0<span style=\"color: maroon\">sys<\/span><span style=\"color: silver\">.<\/span><span style=\"color: maroon\">query_store_query_text<\/span>\u00a0<span style=\"color: maroon\">qsqt<\/span> <br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: blue\">ON<\/span>\u00a0<span style=\"color: maroon\">qsq<\/span><span style=\"color: silver\">.<\/span><span style=\"color: maroon\">query_text_id<\/span>\u00a0<span style=\"color: silver\">=<\/span>\u00a0<span style=\"color: maroon\">qsqt<\/span><span style=\"color: silver\">.<\/span><span style=\"color: maroon\">query_text_id<\/span> <br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: blue\">INNER<\/span>\u00a0<span style=\"color: blue\">JOIN<\/span>\u00a0<span style=\"color: maroon\">sys<\/span><span style=\"color: silver\">.<\/span><span style=\"color: maroon\">query_store_plan<\/span>\u00a0<span style=\"color: maroon\">qsp<\/span> <br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: blue\">ON<\/span>\u00a0<span style=\"color: maroon\">qsq<\/span><span style=\"color: silver\">.<\/span><span style=\"color: maroon\">query_id<\/span>\u00a0<span style=\"color: silver\">=<\/span>\u00a0<span style=\"color: maroon\">qsp<\/span><span style=\"color: silver\">.<\/span><span style=\"color: maroon\">query_id<\/span>\u00a0 <\/span><\/div>\n<p><img loading=\"lazy\" decoding=\"async\" width=\"988\" height=\"95\" class=\"wp-image-97602\" src=\"https:\/\/www.red-gate.com\/simple-talk\/wp-content\/uploads\/2023\/08\/word-image-97600-2.png\" \/><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" width=\"458\" height=\"238\" class=\"wp-image-97603\" src=\"https:\/\/www.red-gate.com\/simple-talk\/wp-content\/uploads\/2023\/08\/texto-descricao-gerada-automaticamente.png\" alt=\"Texto\n\nDescri\u00e7\u00e3o gerada automaticamente\" \/><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" width=\"613\" height=\"772\" class=\"wp-image-97604\" src=\"https:\/\/www.red-gate.com\/simple-talk\/wp-content\/uploads\/2023\/08\/uma-imagem-contendo-interface-grafica-do-usuario.png\" alt=\"Uma imagem contendo Interface gr\u00e1fica do usu\u00e1rio\n\nDescri\u00e7\u00e3o gerada automaticamente\" \/><\/p>\n<h2>Using the XML Queries to find the correct Query Hint<\/h2>\n<p>Using XML queries over the stored query plans we can extract the actual query hint used during the query compilation.<\/p>\n<p>To make this example better, let\u2019s replace the previous query hint with a new one, using the following query:<\/p>\n<div><span style=\"font-family: Courier New;font-size: 10pt\"> <span style=\"color: blue\">EXEC<\/span>\u00a0<span style=\"color: #ff0080;font-weight: bold\">Sp_query_store_set_hints<\/span> <br \/>\n\u00a0\u00a0<span style=\"color: #8000ff\">@query_id<\/span><span style=\"color: silver\">=<\/span><span style=\"color: black\">1<\/span><span style=\"color: silver\">,<\/span> <br \/>\n\u00a0\u00a0<span style=\"color: #8000ff\">@value\u00a0<\/span><span style=\"color: silver\">=<\/span>\u00a0<span style=\"color: red\">N&#8217;\u00a0OPTION\u00a0(OPTIMIZE\u00a0FOR\u00a0unknown)&#8217;<\/span> <\/p>\n<p><span style=\"color: maroon\">go<\/span>\u00a0 <\/span><\/div>\n<p>The query, using XML to retrieve the actual query hint in the plan is the following:<\/p>\n<div><span style=\"font-family: Courier New;font-size: 10pt\"> <span style=\"color: blue\">WITH<\/span>\u00a0<span style=\"color: maroon\">xmlnamespaces<\/span>\u00a0<span style=\"color: maroon\">(<\/span>\u00a0<span style=\"color: red\">&#8216;http:\/\/schemas.microsoft.com\/sqlserver\/2004\/07\/showplan&#8217;<\/span> <br \/>\n<span style=\"color: blue\">AS<\/span>\u00a0<span style=\"color: maroon\">ns1<\/span>\u00a0<span style=\"color: maroon\">)<\/span> <\/p>\n<p><span style=\"color: blue\">SELECT<\/span> <br \/>\n<span style=\"color: maroon\">query_hint_id<\/span><span style=\"color: silver\">,<\/span> <br \/>\n<span style=\"color: maroon\">qsq<\/span><span style=\"color: silver\">.<\/span><span style=\"color: maroon\">query_id<\/span><span style=\"color: silver\">,<\/span> <br \/>\n<span style=\"color: maroon\">query_hint_text<\/span><span style=\"color: silver\">,<\/span> <br \/>\n<span style=\"color: maroon\">qsq<\/span><span style=\"color: silver\">.<\/span><span style=\"color: maroon\">query_text_id<\/span><span style=\"color: silver\">,<\/span> <br \/>\n<span style=\"color: maroon\">query_sql_text<\/span><span style=\"color: silver\">,<\/span> <br \/>\n<span style=\"color: maroon\">qsp<\/span><span style=\"color: silver\">.<\/span><span style=\"color: maroon\">plan_id<\/span><span style=\"color: silver\">,<\/span> <br \/>\n<span style=\"color: fuchsia;font-style: italic\">CONVERT<\/span><span style=\"color: maroon\">(<\/span><span style=\"color: black;font-style: italic\">XML<\/span><span style=\"color: silver\">,<\/span>\u00a0<span style=\"color: maroon\">query_plan<\/span><span style=\"color: maroon\">)<\/span> <br \/>\n<span style=\"color: maroon\">query_plan<\/span><span style=\"color: silver\">,<\/span> <br \/>\n<span style=\"color: fuchsia;font-style: italic\">CONVERT<\/span><span style=\"color: maroon\">(<\/span><span style=\"color: black;font-style: italic\">XML<\/span><span style=\"color: silver\">,<\/span>\u00a0<span style=\"color: maroon\">query_plan<\/span><span style=\"color: maroon\">)<\/span><span style=\"color: silver\">.<\/span><span style=\"color: #ff0080;font-weight: bold\">value<\/span><span style=\"color: maroon\">(<\/span><span style=\"color: red\">&#8216;(\/ns1:ShowPlanXML\/ns1:BatchSequence\/ns1:Batch\/ns1:Statements\/ns1:StmtSimple\/@QueryStoreStatementHintText)[1]&#8217;<\/span><span style=\"color: silver\">,<\/span>\u00a0<span style=\"color: red\">&#8216;varchar(100)&#8217;<\/span><span style=\"color: maroon\">)<\/span>\u00a0<span style=\"color: maroon\">actualQueryHint<\/span> <br \/>\n<span style=\"color: blue\">FROM<\/span>\u00a0\u00a0\u00a0<span style=\"color: maroon\">sys<\/span><span style=\"color: silver\">.<\/span><span style=\"color: maroon\">query_store_query_hints<\/span>\u00a0<span style=\"color: maroon\">qsqh<\/span> <br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: blue\">INNER<\/span>\u00a0<span style=\"color: blue\">JOIN<\/span>\u00a0<span style=\"color: maroon\">sys<\/span><span style=\"color: silver\">.<\/span><span style=\"color: maroon\">query_store_query<\/span>\u00a0<span style=\"color: maroon\">qsq<\/span> <br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: blue\">ON<\/span>\u00a0<span style=\"color: maroon\">qsqh<\/span><span style=\"color: silver\">.<\/span><span style=\"color: maroon\">query_id<\/span>\u00a0<span style=\"color: silver\">=<\/span>\u00a0<span style=\"color: maroon\">qsq<\/span><span style=\"color: silver\">.<\/span><span style=\"color: maroon\">query_id<\/span> <br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: blue\">INNER<\/span>\u00a0<span style=\"color: blue\">JOIN<\/span>\u00a0<span style=\"color: maroon\">sys<\/span><span style=\"color: silver\">.<\/span><span style=\"color: maroon\">query_store_query_text<\/span>\u00a0<span style=\"color: maroon\">qsqt<\/span> <br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: blue\">ON<\/span>\u00a0<span style=\"color: maroon\">qsq<\/span><span style=\"color: silver\">.<\/span><span style=\"color: maroon\">query_text_id<\/span>\u00a0<span style=\"color: silver\">=<\/span>\u00a0<span style=\"color: maroon\">qsqt<\/span><span style=\"color: silver\">.<\/span><span style=\"color: maroon\">query_text_id<\/span> <br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: blue\">INNER<\/span>\u00a0<span style=\"color: blue\">JOIN<\/span>\u00a0<span style=\"color: maroon\">sys<\/span><span style=\"color: silver\">.<\/span><span style=\"color: maroon\">query_store_plan<\/span>\u00a0<span style=\"color: maroon\">qsp<\/span> <br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: blue\">ON<\/span>\u00a0<span style=\"color: maroon\">qsq<\/span><span style=\"color: silver\">.<\/span><span style=\"color: maroon\">query_id<\/span>\u00a0<span style=\"color: silver\">=<\/span>\u00a0<span style=\"color: maroon\">qsp<\/span><span style=\"color: silver\">.<\/span><span style=\"color: maroon\">query_id<\/span>\u00a0 <\/span><\/div>\n<p><img loading=\"lazy\" decoding=\"async\" width=\"1181\" height=\"96\" class=\"wp-image-97605\" src=\"https:\/\/www.red-gate.com\/simple-talk\/wp-content\/uploads\/2023\/08\/word-image-97600-5.png\" \/><\/p>\n<p>This result compares the hint applied in query store, which will be enforced on the next compilation of the plan, with the hint on the current stored plan.<\/p>\n<h2>One plan has no hint<\/h2>\n<p>The query will very frequently return one plan with no hint. This happens because a combination of reasons:<\/p>\n<ul>\n<li>The plan was created before the hint was applied.<\/li>\n<li>One of the executions with the hint results in a plan exactly as one already stored. In this case, the stored one is not replaced, staying without the hint application.<\/li>\n<\/ul>\n<p>This makes especially trick to identify which hint was applied to this plan creation. The only additional option we have is to check the last execution of this plan.<\/p>\n<p>If the plan last execution was before the query hint creation, so the current query hint stored was never applied to the plan. If the plan last execution was after the hint creation, the hint was applied.<\/p>\n<p>To makes things work, query store doesn\u2019t hold date and time of the query hint creation. So, we can check the last time of the plan execution, but we can only guess if it was before or after the query hint application.<\/p>\n<p>The query, with addition of the date:<\/p>\n<div><span style=\"font-family: Courier New;font-size: 10pt\"> <span style=\"color: blue\">WITH<\/span>\u00a0<span style=\"color: maroon\">xmlnamespaces<\/span>\u00a0<span style=\"color: maroon\">(<\/span>\u00a0<span style=\"color: red\">&#8216;http:\/\/schemas.microsoft.com\/sqlserver\/2004\/07\/showplan&#8217;<\/span>\u00a0<span style=\"color: blue\">AS<\/span>\u00a0<span style=\"color: maroon\">ns1<\/span>\u00a0<span style=\"color: maroon\">)<\/span> <br \/>\n<span style=\"color: blue\">SELECT<\/span>\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: maroon\">query_hint_id<\/span><span style=\"color: silver\">,<\/span> <br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: maroon\">qsq<\/span><span style=\"color: silver\">.<\/span><span style=\"color: maroon\">query_id<\/span><span style=\"color: silver\">,<\/span> <br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: maroon\">query_hint_text<\/span><span style=\"color: silver\">,<\/span> <br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: maroon\">qsq<\/span><span style=\"color: silver\">.<\/span><span style=\"color: maroon\">query_text_id<\/span><span style=\"color: silver\">,<\/span> <br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: maroon\">query_sql_text<\/span><span style=\"color: silver\">,<\/span> <br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: maroon\">qsp<\/span><span style=\"color: silver\">.<\/span><span style=\"color: maroon\">plan_id<\/span><span style=\"color: silver\">,<\/span> <br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: blue\">CONVERT<\/span><span style=\"color: maroon\">(<\/span><span style=\"color: maroon\">xml<\/span><span style=\"color: silver\">,<\/span><span style=\"color: maroon\">query_plan<\/span><span style=\"color: maroon\">)<\/span>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: maroon\">query_plan<\/span><span style=\"color: silver\">,<\/span> <br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: blue\">CONVERT<\/span><span style=\"color: maroon\">(<\/span><span style=\"color: maroon\">xml<\/span><span style=\"color: silver\">,<\/span><span style=\"color: maroon\">query_plan<\/span><span style=\"color: maroon\">)<\/span><span style=\"color: silver\">.<\/span><span style=\"color: maroon\">value<\/span><span style=\"color: maroon\">(<\/span><span style=\"color: red\">&#8216;(\/ns1:ShowPlanXML\/ns1:BatchSequence\/ns1:Batch\/ns1:Statements\/ns1:StmtSimple\/@QueryStoreStatementHintText)[1]&#8217;<\/span><span style=\"color: silver\">,<\/span><span style=\"color: red\">&#8216;varchar(100)&#8217;<\/span><span style=\"color: maroon\">)<\/span>\u00a0<span style=\"color: maroon\">actualqueryhint<\/span><span style=\"color: silver\">,<\/span> <br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: maroon\">(<\/span> <br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: blue\">SELECT<\/span>\u00a0<span style=\"color: maroon\">max<\/span><span style=\"color: maroon\">(<\/span><span style=\"color: maroon\">last_execution_time<\/span><span style=\"color: maroon\">)<\/span>\u00a0<span style=\"color: maroon\">last_plan_execution<\/span> <br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: blue\">FROM<\/span>\u00a0\u00a0\u00a0<span style=\"color: maroon\">sys<\/span><span style=\"color: silver\">.<\/span><span style=\"color: maroon\">query_store_runtime_stats<\/span> <br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: blue\">WHERE<\/span>\u00a0\u00a0<span style=\"color: maroon\">plan_id<\/span><span style=\"color: silver\">=<\/span><span style=\"color: maroon\">qsp<\/span><span style=\"color: silver\">.<\/span><span style=\"color: maroon\">plan_id<\/span><span style=\"color: maroon\">)<\/span>\u00a0<span style=\"color: blue\">AS<\/span>\u00a0<span style=\"color: maroon\">last_plan_execution<\/span> <br \/>\n<span style=\"color: blue\">FROM<\/span>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: maroon\">sys<\/span><span style=\"color: silver\">.<\/span><span style=\"color: maroon\">query_store_query_hints<\/span>\u00a0<span style=\"color: maroon\">qsqh<\/span> <br \/>\n<span style=\"color: blue\">INNER<\/span>\u00a0<span style=\"color: blue\">JOIN<\/span>\u00a0<span style=\"color: maroon\">sys<\/span><span style=\"color: silver\">.<\/span><span style=\"color: maroon\">query_store_query<\/span>\u00a0<span style=\"color: maroon\">qsq<\/span> <br \/>\n<span style=\"color: blue\">ON<\/span>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: maroon\">qsqh<\/span><span style=\"color: silver\">.<\/span><span style=\"color: maroon\">query_id<\/span>\u00a0<span style=\"color: silver\">=<\/span><span style=\"color: maroon\">qsq<\/span><span style=\"color: silver\">.<\/span><span style=\"color: maroon\">query_id<\/span> <br \/>\n<span style=\"color: blue\">INNER<\/span>\u00a0<span style=\"color: blue\">JOIN<\/span>\u00a0<span style=\"color: maroon\">sys<\/span><span style=\"color: silver\">.<\/span><span style=\"color: maroon\">query_store_query_text<\/span>\u00a0<span style=\"color: maroon\">qsqt<\/span> <br \/>\n<span style=\"color: blue\">ON<\/span>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: maroon\">qsq<\/span><span style=\"color: silver\">.<\/span><span style=\"color: maroon\">query_text_id<\/span><span style=\"color: silver\">=<\/span><span style=\"color: maroon\">qsqt<\/span><span style=\"color: silver\">.<\/span><span style=\"color: maroon\">query_text_id<\/span> <br \/>\n<span style=\"color: blue\">INNER<\/span>\u00a0<span style=\"color: blue\">JOIN<\/span>\u00a0<span style=\"color: maroon\">sys<\/span><span style=\"color: silver\">.<\/span><span style=\"color: maroon\">query_store_plan<\/span>\u00a0<span style=\"color: maroon\">qsp<\/span> <br \/>\n<span style=\"color: blue\">ON<\/span>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: maroon\">qsq<\/span><span style=\"color: silver\">.<\/span><span style=\"color: maroon\">query_id<\/span><span style=\"color: silver\">=<\/span><span style=\"color: maroon\">qsp<\/span><span style=\"color: silver\">.<\/span><span style=\"color: maroon\">query_id<\/span> <\/span><\/div>\n<p><img loading=\"lazy\" decoding=\"async\" width=\"1381\" height=\"90\" class=\"wp-image-97606\" src=\"https:\/\/www.red-gate.com\/simple-talk\/wp-content\/uploads\/2023\/08\/word-image-97600-6.png\" \/><\/p>\n<h2>Summary<\/h2>\n<p>Managing query store hints can prove to be trickier than initially imagined. A considerable care is needed when analysing the query store hints applied to each plan.<\/p>\n<p>This blog was inspired by a session delivered by Erin Stellato during the <a href=\"https:\/\/www.youtube.com\/watch?v=0SkTg9i6IFs&amp;list=PLNbt9tnNIlQ7lscZ-AMAIC5-J--puWJp0\">Malta SQL Server 2022 Query Optimization conference<\/a><\/p>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>I wrote about query store hints before when they were first released in Azure SQL databases. However, there are some tricks related to managing query store hints we will explore on this blog post. Applying Query Store Hint When we apply a query store hint, the query already exists in query store, and it has&#8230;&hellip;<\/p>\n","protected":false},"author":50808,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[2],"tags":[48482,145785,147170],"coauthors":[6810],"class_list":["post-97600","post","type-post","status-publish","format-standard","hentry","category-blogs","tag-query-optimization","tag-query-store","tag-sql-server-2022"],"acf":[],"_links":{"self":[{"href":"https:\/\/www.red-gate.com\/simple-talk\/wp-json\/wp\/v2\/posts\/97600","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.red-gate.com\/simple-talk\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.red-gate.com\/simple-talk\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.red-gate.com\/simple-talk\/wp-json\/wp\/v2\/users\/50808"}],"replies":[{"embeddable":true,"href":"https:\/\/www.red-gate.com\/simple-talk\/wp-json\/wp\/v2\/comments?post=97600"}],"version-history":[{"count":2,"href":"https:\/\/www.red-gate.com\/simple-talk\/wp-json\/wp\/v2\/posts\/97600\/revisions"}],"predecessor-version":[{"id":97608,"href":"https:\/\/www.red-gate.com\/simple-talk\/wp-json\/wp\/v2\/posts\/97600\/revisions\/97608"}],"wp:attachment":[{"href":"https:\/\/www.red-gate.com\/simple-talk\/wp-json\/wp\/v2\/media?parent=97600"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.red-gate.com\/simple-talk\/wp-json\/wp\/v2\/categories?post=97600"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.red-gate.com\/simple-talk\/wp-json\/wp\/v2\/tags?post=97600"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.red-gate.com\/simple-talk\/wp-json\/wp\/v2\/coauthors?post=97600"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}