高信用使用率-information_schema.query_history

时间:2019-11-22 15:14:49

标签: snowflake-data-warehouse

在Snowflake中是否存在用于识别长时间运行的查询的优化方法?我注意到在查询information_schema.query_history时,无论是否提供参数值,都不会产生任何费用。

背景: 我们有一个AWS lambda,它会定期运行以利用information_schema.query_history寻找任何长时间运行的查询。但是,无论您为参数end_time_range_start等提供的值如何限制返回的数据,每次执行都将花费0.18信用。

因此,这两个查询都会产生相同的费用。

table(
      information_schema.query_history
      (
        end_time_range_start=> dateadd('minutes',-5,current_timestamp()),
        result_limit=>100
      )
     )


table(information_schema.query_history(result_limit=>100))

注意:我们已经在仓库级别使用STATEMENT_TIMEOUT_IN_SECONDS来设置查询持续时间的限制。此外,我们有适当的资源监控器来限制所使用的信用,但是如果有人运行长时间的查询,我们需要更精细的解决方案来提醒我们。

3 个答案:

答案 0 :(得分:1)

您可以直接查询SNOWFLAKE.ACCOUNT_USAGE.QUERY_HISTORY,以更好地控制返回给您的查询。其中包含1年的数据,但此处显示的数据最多延迟45分钟。

https://docs.snowflake.net/manuals/sql-reference/account-usage/query_history.html

在成本方面,如果您利用最常用于执行查询的仓库,那么实际上并不会花费您任何额外的费用。如果可以的话,我会考虑转移到那个仓库。

答案 1 :(得分:0)

查询修剪访问视图SNOWFLAKE.ACCOUNT_USAGE.QUERY_HISTORY
似乎仅在def get_info(item_urls)#, count): #count is being passed in, leaving this here for context for item in item_urls: #get data and stuff from current URL data = ["beer", "is", "awesome!", "...", "for", "helping", "with", "my", "depression"] count = len(data) # counting data for a number, that I should have just made up :) table = [[] for i in range(0, count)] for truth in data: for i in range(0, count): list('table[{}]'.format(i)).append(truth) print(truth) for thing in table[0]: print(thing) return "borked" 而不是START_TIME上过滤时有效。

因此,我不得不更改“每天保存查询历史记录”过程,
加快执行速度> 4倍。

答案 2 :(得分:0)

我要这样做的方法是先运行SHOW WAREHOUSES。这不使用仓库,而您可以查看是否正在运行任何仓库。如果没有任何运行,那么您肯定没有长时间运行的查询*,您可以在这里停止。如果有任何运行,那么您可以在该仓库上适时执行query_history查询,而不会受到至少1分钟的罚款。

有了这个,您应该能够以几乎为零的额外成本进行运行。

*如果您的查询需要花费很长时间进行编译,则可能是一个例外-如果您担心这一点,那么这种方法将行不通。