Amazon redshift 在AWS红移中,查询取消如何完全自动化?

Amazon redshift 在AWS红移中,查询取消如何完全自动化?,amazon-redshift,Amazon Redshift,在AWS红移中,我可以使用pg\u terminate\u后端(pid)终止查询命令 问题是,只有在通过查询stv_recents表运行查询后,才能获得pid 这给自动化带来了一个问题——如何以编程方式终止查询(可能是因为它超出了时间限制)?就我所见,我可以通过过滤查询、用户和开始时间列(在pid中)来获得pid。问题是,所有查询都来自应用程序用户(同一用户),有些用户可能执行相同的查询 是否有任何方法可以在执行查询时/之后命中某种类型的回调并获取pid?否则,如何自动取消查询 提前感谢。我已经

在AWS红移中,我可以使用
pg\u terminate\u后端(pid)终止查询命令

问题是,只有在通过查询stv_recents表运行查询后,才能获得pid

这给自动化带来了一个问题——如何以编程方式终止查询(可能是因为它超出了时间限制)?就我所见,我可以通过过滤查询、用户和开始时间列(在pid中)来获得pid。问题是,所有查询都来自应用程序用户(同一用户),有些用户可能执行相同的查询

是否有任何方法可以在执行查询时/之后命中某种类型的回调并获取pid?否则,如何自动取消查询


提前感谢。

我已经实施了类似的方法,并向您推荐。 我在红移中定义了组。例如,如果DB user属于一个特定的组,它可以运行无时间限制的查询,则所有其他DB user查询将在定义的时间后取消。这种方法的缺点是,您需要手动设置所有内容,包括每个组的最大并行查询数。但这只能做一次。 这是为我们的目的创建的配置文件:

[
  {
    "query_concurrency": 13,
    "memory_percent_to_use": 87,
    "query_group": [],
    "query_group_wild_card": 0,
    "user_group": [
      "wlm_main"
    ],
    "user_group_wild_card": 0
  },
  {
    "query_concurrency": 2,
    "max_execution_time": 300000,
    "query_group": [],
    "query_group_wild_card": 0,
    "user_group": [],
    "user_group_wild_card": 0
  },
  {
    "short_query_queue": true
  }
]
它表示分配给groupwlm_main的用户将被分配到第一个队列。 所有其他查询将被分配到第二个队列,其中最多可以并行运行2个查询,所有其他查询都在队列中等待。除此之外,还使用了其他方法。正如您可能看到的,第一个队列没有时间限制,第二个队列限制为300000毫秒(5分钟)

编辑:展开有关此特定用例的答案


获取提交到数据库的查询的pid(进程id)。您可以在SQL语句前面添加具有唯一值(哈希或序列)的注释,如下所示:
/*d131dd02c5e6eec4*/select…
。然后基于此,你可以在stv_近景或stv_飞行中搜索它并获得pid。获取pid后,它可以用来终止会话:
pg\u terminate\u backend(pid)

我已经实现了类似的方法,并向您推荐。 我在红移中定义了组。例如,如果DB user属于一个特定的组,它可以运行无时间限制的查询,则所有其他DB user查询将在定义的时间后取消。这种方法的缺点是,您需要手动设置所有内容,包括每个组的最大并行查询数。但这只能做一次。 这是为我们的目的创建的配置文件:

[
  {
    "query_concurrency": 13,
    "memory_percent_to_use": 87,
    "query_group": [],
    "query_group_wild_card": 0,
    "user_group": [
      "wlm_main"
    ],
    "user_group_wild_card": 0
  },
  {
    "query_concurrency": 2,
    "max_execution_time": 300000,
    "query_group": [],
    "query_group_wild_card": 0,
    "user_group": [],
    "user_group_wild_card": 0
  },
  {
    "short_query_queue": true
  }
]
它表示分配给groupwlm_main的用户将被分配到第一个队列。 所有其他查询将被分配到第二个队列,其中最多可以并行运行2个查询,所有其他查询都在队列中等待。除此之外,还使用了其他方法。正如您可能看到的,第一个队列没有时间限制,第二个队列限制为300000毫秒(5分钟)

编辑:展开有关此特定用例的答案


获取提交到数据库的查询的pid(进程id)。您可以在SQL语句前面添加具有唯一值(哈希或序列)的注释,如下所示:
/*d131dd02c5e6eec4*/select…
。然后基于此,你可以在stv_近景或stv_飞行中搜索它并获得pid。获取pid后,它可以用来终止会话:
pg\u terminate\u backend(pid)

回答得好。我想补充一点,这里的
max_execution_time
实际上是执行时间,不适用于处于“等待”或“返回”状态的查询。如果要确保查询在其他状态下强制终止,可以使用QMR规则进行研究。这对于长时间运行的查询非常有用。但它并不能解决以编程方式终止查询的问题。如果它是事件驱动的呢?我是否正确理解了这一点:您想终止由某个特定web应用程序(或类似前端)会话和/或用户启动的查询?应用程序正是允许用户在UI中生成查询的。具有取消功能(允许用户取消)非常有用。您可以在SQL语句前面添加注释,并使用唯一值(哈希或序列)如下:
/*d131dd02c5e6eec4*/select…
。然后基于此,你可以在stv_近景或stv_飞行中搜索它并得到pid。很好的答案。我想补充一点,这里的
max_execution_time
实际上是执行时间,不适用于处于“等待”或“返回”状态的查询。如果要确保查询在其他状态下强制终止,可以使用QMR规则进行研究。这对于长时间运行的查询非常有用。但它并不能解决以编程方式终止查询的问题。如果它是事件驱动的呢?我是否正确理解了这一点:您想终止由某个特定web应用程序(或类似前端)会话和/或用户启动的查询?应用程序正是允许用户在UI中生成查询的。具有取消功能(允许用户取消)非常有用。您可以在SQL语句前面添加注释,并使用唯一值(哈希或序列)如下:
/*d131dd02c5e6eec4*/select…
。然后基于此,你可以在stv_近景或stv_飞行中搜索它并获得pid。