我有一个名为T_PERSON的表,其中的行包括FIRSTNAME varchar,LASTNAME varchar,CUSTOMERTYPE int,SELLERID int(及更多)
另外,我有一个很大的" SQL IN语句"像这样的人的名单
:( 'JOHNxSMITHx12345x1337', 'SARAxBANNERx7612x1337' ... )
即:FIRSTNAME x LASTNAME x CUSTOMERTYPE x SELLERID
如果我运行此查询:
SELECT * FROM T_PERSON WHERE
STR_REPLACE(FIRSTNAME + 'x' + LASTNAME + 'x' + STR(CUSTOMERID) + 'x' + STR(SELLERID)) in
( 'JOHNxSMITHx12345x1337', 'SARAxBANNERx7612x1337' )
这个查询在一个有几百行的小型数据库上工作正常,我想知道我是否能够在T_PERSON中拥有数亿行的庞大数据库上运行它。
此查询会非常重要吗?例如。如果N是T_PERSON表的大小,数据库软件通常会生成N ^ 4个字符串并将每个组合与列表中的所有值进行比较吗?
答案 0 :(得分:1)
我们最终选择了一个非常不同的解决方案,每行运行一个查询进行更新。 现在我感到愚蠢,而且我的查询质量保证人员问过这个问题应该感到羞耻。
列名称FIRSTNAME LASTNAME等当然都隐含地是同一个TABLE ROW的一部分。因此它们可以写成THESAMEROW.FIRSTNAME,THESAMEROW.LASTNAME等。以这种方式查看,当然每个数据库中只能构造一个字符串。
我担心会创建N ^ 4个字符串是完全错误的,我的查询会在更大的数据库上完全线性扩展。
答案 1 :(得分:0)
您应该尝试使用“set showplan on”或其他工具(AquaStudio,RapidSQL ...)查看查询计划,看看它是否使用了索引和正确的索引。可能不是因为WHERE子句中的函数str_replace。