MySQL和ORACLE性能 - SELECT +检索行+ DELETE与DELETE WHERE SELECT FROM

时间:2013-12-16 12:30:39

标签: mysql performance oracle

我正在对我正在开发的当前应用程序进行一些性能改进,并且我在考虑下一个场景中哪些方面的性能更好(考虑好的服务器硬件,或者完全忘记硬件)。

考虑您需要执行updateinsertdelete,其中包含从其他表格中提取的特定信息。哪种情况会有更好的表现?

编辑:由于本案例中的性能问题是高度(平台|供应商) - 特定,我对 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结果集由应用程序检索,然后执行简单的INSERTUPDATEDELETE

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实现和没有具体的应用程序环境(如果可能的话)的一般性能。

1 个答案:

答案 0 :(得分:2)

在最少数量的SQL语句中执行操作几乎总是正确的方法,不仅是出于性能原因,而且因为操作保证是原子的并且具有单一的一致性点。