基于主键ID删除记录的最有效方法

时间:2019-01-24 21:47:25

标签: sql oracle

我有一个表(table1),该表具有id作为主键并且本质上是增量的。该表具有Updatedtm,后者具有最后更新的日期和时间。该表有大约3亿条记录。我有另一个表table2与table1同步。从表1中删除ID时,从表2中删除的最佳方法是什么? Left Join是一种有效的方法,我是否每次都必须比较3亿条记录以检查是否删除?

'use strict';

const puppeteer = require('puppeteer');

(async function main() {
  try {
    const browser = await puppeteer.launch({ headless: false });
    const [page] = await browser.pages();

    await page.goto('https://example.org/');


    await page.evaluate(() => {
      document.body.appendChild(document.createElement('iframe')).src = 'https://example.net/';
      document.body.appendChild(document.createElement('iframe')).src = 'https://example.com/';
    });

    for (const frame of page.frames()) {
      await frame.waitForSelector('head > title');
      await frame.evaluate(() => {
        localStorage.setItem('foo', document.location.href);
        localStorage.setItem('bar', document.title);
      });
    }

    const client = await page.target().createCDPSession();
    for (const frame of page.frames()) {
      const securityOrigin = new URL(frame.url()).origin;
      const response = await client.send(
        'DOMStorage.getDOMStorageItems',
        { storageId: { isLocalStorage: true, securityOrigin } },
      );
      console.log(response.entries);
    }

    console.log('----------');

    for (const frame of page.frames()) {
      const entries = await frame.evaluate(() => {
        const data = [];
        for (var i = 0; i < localStorage.length; i++) {
          const key = localStorage.key(i);
          data[i] = [key, localStorage.getItem(key)];
        }
        return data;
      });
      console.log(entries);
    }

    await browser.close();
  } catch (err) {
    console.error(err);
  }
})();

2 个答案:

答案 0 :(得分:0)

确保您具有涵盖此查询的索引。即确保对table1.idtable2.id进行了索引(是的,即使认为索引需要更新,拥有此索引也可以加快删除速度。)这将有助于JOIN。 / p>

此外,您可能要考虑批量删除,

WHILE <some_condition> BEGIN
    DELETE TOP (1000) t2
    FROM table2 t2
    LEFT OUTER JOIN table1 t1 ON t2.id = t1.id
    WHERE t1.id IS NULL
END

批处理删除操作将减少SQL Server必须在您的表索引,聚集索引和非聚集索引上获取的锁数量。如果这是一台具有3亿行的生产服务器,那么在提出删除策略之前,我肯定会查看您的索引并计算您认为可能要删除的记录数。

SELECT COUNT(*) FROM table2 t2
LEFT OUTER JOIN table1 t1 ON t2.id = t1.id
WHERE t1.id IS NULL

此外,请与所有服务器管理员联系,以了解他们对潜在锁定问题的看法。

答案 1 :(得分:0)

我建议您使用“存在”代替“不在”

Delete from table2 t2
where exists ( select 1 from table1 t1 where t1.id=t2.id)