在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
来设置查询持续时间的限制。此外,我们有适当的资源监控器来限制所使用的信用,但是如果有人运行长时间的查询,我们需要更精细的解决方案来提醒我们。
答案 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分钟的罚款。
有了这个,您应该能够以几乎为零的额外成本进行运行。
*如果您的查询需要花费很长时间进行编译,则可能是一个例外-如果您担心这一点,那么这种方法将行不通。