我有一个表,其主键为(((A,B),C) 分区键(A,B) 群集密钥C
我的问题与从此表中删除有关。
删除或发出多个时使用IN子句是否有效 使用相等操作删除语句。
delete from table where A=xx and B IN ('a','b','c');
-或-
delete from table where A=xx and B='a';
delete from table where A=xx and B='b';
delete from table where A=xx and B='c';
像第1条delete语句中那样使用IN运算符是否有任何危害。 总共总共可能有大约20个删除项(或IN子句中有20个项目)。
在此先感谢您的帮助!
答案 0 :(得分:2)
除了一些小的例外,使用第二个选项而不是异步发出的多次删除几乎总是更好。 IN子句的协调器将承受大量负载,而后者将平均分配负载。同样,使用TokenAware负载平衡器,请求将直接转到正确的副本,并且可以很快完成。如果您要进行数百个或更多的删除操作,则可能要使用信号量或某些方法来限制进行中的删除操作的数量,以防止群集超载。
答案 1 :(得分:1)
这取决于您的应用程序需求。如果希望删除操作很快,那么您可能希望显式地运行每个操作(第二个选项)。
另一方面,如果删除是作为批处理或清除作业的一部分运行的,并且没有人真正在乎它需要多长时间,那么您可能可以避免使用IN
。诀窍在于避免超时(并且正如Chris所指出的那样,在节点上施加了不适当的负载)。分解列B
的值组以保持较小的值可能很有意义。虽然我听说有人用IN
列出的20个项目不是最多的,但绝对比我个人使用的要多(我尝试将其保持在小于10个)。
本质上,将IN
运算符与DELETE
一起使用将容易受到性能问题的影响,就像在SELECT
上一样,如此答案所述(此处包含在参考):