我正在对我正在开发的当前应用程序进行一些性能改进,并且我在考虑下一个场景中哪些方面的性能更好(考虑好的服务器硬件,或者完全忘记硬件)。
考虑您需要执行update
,insert
或delete
,其中包含从其他表格中提取的特定信息。哪种情况会有更好的表现?
编辑:由于本案例中的性能问题是高度(平台|供应商) - 特定,我对 MySQL 更感兴趣 ORACLE DBMS ...
1。仅通过SQL完成工作
例如(所有查询都只是假设的):
INSERT INTO table1 VALUES (
val1,
val2,
val3,
(SELECT col3 FROM table2 WHERE col1 = [some_variable] LIMIT 1),
val5
)
或
DELETE FROM table1 WHERE col1 IN (SELECT col5 FROM table2 WHERE col1 = [some_variable])
或
UPDATE table1 SET col4 = (SELECT col3 FROM table2 WHERE col1 = [var1] LIMIT 1) WHERE col1 = [var2]
针对
2。将逻辑拆分为两部分,其中SELECT
结果集由应用程序检索,然后执行简单的INSERT
,UPDATE
或DELETE
。
e.g。 (我正在使用一些伪代码):
def ids_to_delete = fetch('SELECT col5 FROM table2 WHERE col1 = [some_variable]')
execute('DELETE FROM table 1 WHERE col1 IN(' . implode(',', ids_to_delete) . ')')
或
for (var1 in vars)
def val_to_insert = fetch('SELECT col5 FROM table2 WHERE col1 = [var1]' LIMIT 1)
execute('INSERT INTO table 1 VALUES [varX.a], [varX.b], [varX.c], [val_to_insert], [varX.d]')
endfor
等
哪一个更适合性能?我认为第一种方法应该更快,因为从应用程序代码到应用程序数据库只有一个链接,尽管有些子查询可能不会很快。我很好奇没有具体的SQL实现和没有具体的应用程序环境(如果可能的话)的一般性能。
答案 0 :(得分:2)
在最少数量的SQL语句中执行操作几乎总是正确的方法,不仅是出于性能原因,而且因为操作保证是原子的并且具有单一的一致性点。