数据库查询中的字符串连接是否会导致性能问题?
Does String concatenation in database query cause performance issues?
我有一个名为 T_PERSON 的 table,其中包含 FIRSTNAME varchar、LASTNAME varchar、CUSTOMERTYPE int、SELLERID int(以及更多)等行
此外,我还有一大堆 "SQL IN statement" 像这样的人
:( 'JOHNxSMITHx12345x1337', 'SARAxBANNERx7612x1337' ... )
即:名字 x 姓氏 x 客户类型 x 卖家 ID
如果我运行这个查询:
SELECT * FROM T_PERSON WHERE
STR_REPLACE(FIRSTNAME + 'x' + LASTNAME + 'x' + STR(CUSTOMERID) + 'x' + STR(SELLERID)) in
( 'JOHNxSMITHx12345x1337', 'SARAxBANNERx7612x1337' )
此查询在只有几百行的小型数据库上运行良好,我想知道我是否能够 运行 在 T_PERSON 中有数亿行的大型数据库上执行此查询。
此查询的性能要求很高吗?例如。如果 N 是 T_PERSON table 的大小,数据库软件通常会生成 N^4 个字符串并将每个组合与列表中的所有值进行比较吗?
您应该尝试使用 "set showplan on" 或其他工具(AquaStudio、RapidSQL...)查看查询计划,看看它是否使用索引和正确的索引。可能不是因为 WHERE 子句中的函数 str_replace。
我们最终采用了一种非常不同的解决方案,运行 每行更新一个查询。
现在我觉得自己很愚蠢,DB 的那个对我的查询进行质量检查并提出问题的人应该感到羞耻。
列名 FIRSTNAME LASTNAME 等当然都隐式地属于同一个 TABLE ROW。所以可以写成THESAMEROW.FIRSTNAME、THESAMEROW.LASTNAME等。这样看,数据库中当然每行只会构造一个字符串。
因此,我担心会创建 N^4 个字符串是完全错误的,而且我的查询在更大的数据库上会完美地线性扩展。
我有一个名为 T_PERSON 的 table,其中包含 FIRSTNAME varchar、LASTNAME varchar、CUSTOMERTYPE int、SELLERID int(以及更多)等行
此外,我还有一大堆 "SQL IN statement" 像这样的人
:( 'JOHNxSMITHx12345x1337', 'SARAxBANNERx7612x1337' ... )
即:名字 x 姓氏 x 客户类型 x 卖家 ID
如果我运行这个查询:
SELECT * FROM T_PERSON WHERE
STR_REPLACE(FIRSTNAME + 'x' + LASTNAME + 'x' + STR(CUSTOMERID) + 'x' + STR(SELLERID)) in
( 'JOHNxSMITHx12345x1337', 'SARAxBANNERx7612x1337' )
此查询在只有几百行的小型数据库上运行良好,我想知道我是否能够 运行 在 T_PERSON 中有数亿行的大型数据库上执行此查询。
此查询的性能要求很高吗?例如。如果 N 是 T_PERSON table 的大小,数据库软件通常会生成 N^4 个字符串并将每个组合与列表中的所有值进行比较吗?
您应该尝试使用 "set showplan on" 或其他工具(AquaStudio、RapidSQL...)查看查询计划,看看它是否使用索引和正确的索引。可能不是因为 WHERE 子句中的函数 str_replace。
我们最终采用了一种非常不同的解决方案,运行 每行更新一个查询。 现在我觉得自己很愚蠢,DB 的那个对我的查询进行质量检查并提出问题的人应该感到羞耻。
列名 FIRSTNAME LASTNAME 等当然都隐式地属于同一个 TABLE ROW。所以可以写成THESAMEROW.FIRSTNAME、THESAMEROW.LASTNAME等。这样看,数据库中当然每行只会构造一个字符串。
因此,我担心会创建 N^4 个字符串是完全错误的,而且我的查询在更大的数据库上会完美地线性扩展。