【问题标题】:SQL: Efficient and fast way to select million of records except given recordsSQL:选择除给定记录外的数百万条记录的高效快速方法
【发布时间】:2015-02-09 16:32:18
【问题描述】:

我正在使用 SQL Server。在 SQL Query 中处理大量数据时面临问题。我想从 ITEM 表中选择那些不在我给定列表中的记录。

让我详细说明。 我有 ITEM 表,其中 ITEM_CODE 作为列。 它包含数百万条记录。 并从其他来源填充​​一些项目代码,例如文件。
所以我想从 ITEM 表中选择那些不在该填充列表中的记录。

喜欢,

SELECT ITEM_CODE FROM ITEM WHERE ITEM_CODE NOT IN ('I1', 'I2', 'I3',.......);

使用 IN 是一项繁琐的任务,需要花费大量时间。然后我用其他方式,像这样,

SELECT ITEM_CODE FROM ITEM WHERE NOT (ITEM_CODE = 'I1' OR ITEM_CODE = 'I2' AND .....)
  • 注意:....表示数百万个参数。

这种方式也需要很多时间。我用的另一种方式,

    SELECT T.ITEM_CODE FROM ITEM T LEFT JOIN
    (SELECT ITEM_CODE FROM ITEM T1 
    WHERE T1.ITEM_CODE ='I1' OR T1.ITEM_CODE ='I2') AS T2
    on T.ITEM_CODE = T2.ITEM_CODE WHERE T2.ITEM_CODE IS NULL

这种方式提高了一点性能,但仍然不能令人满意。

有什么方法可以快速完成吗? 请给我一些解决方案。
任何答案都将是可观的。

谢谢。

【问题讨论】:

  • 你应该避免使用像 lac 这样的印度词,不是每个人都能理解。
  • LAC到底是什么?
  • 它的 10 万 @DavidG 你试过为你的查询运行解释计划吗?
  • 哦,我明白了。因此,您最好将这些值插入数据库表(永久或临时)并将该表连接到您的 ITEM 表。
  • 这百万个参数从何而来?

标签: sql-server


【解决方案1】:

这样的事情怎么样...

CREATE TABLE #TMP(ITEM_CODE VARCHAR(10))
INSERT INTO #TMP
VALUES('I1'), ('I2'), etc ....

SELECT T.ITEM_CODE 
FROM ITEM T 
    LEFT JOIN #TMP T2 ON T.ITEM_CODE = T2.ITEM_CODE
WHERE T2.ITEM_CODE IS NULL

SELECT T.ITEM_CODE 
FROM ITEM T
WHERE NOT EXISTS(
    SELECT NULL
    FROM #TMP T2
    WHENRE T2.ITEM_CODE = T.ITEM_CODE)

您甚至可以在临时表上创建索引

CREATE INDEX _temp ON #TMP (ITEM_CODE)

【讨论】:

  • 斯波克,谢谢。这可能是我也认为的很好的解决方案。但问题是,我从 CSV 文件中获取 Java 端的那些 'I1'、'I2' 值,我必须将其传递给 MyBatis Mappers。所以,创建 TEMP 表并不是什么大不了的事,但是在其中插入那几百万个项目,不会像笨拙的过程吗?
  • 在这种情况下,请查看批量插入、openquery 或 bcp 方法。将文件中的大量数据读入表中是最好的选择
  • 啊,谢谢。由于某些数据库依赖性,批量插入始终是一项艰巨的任务。关于 openquery 和 bcp,对我来说完全是不知情的概念。
  • 你好 Spock,现在创建 TEMP 表对我来说真的很重要..!我认为这很容易,就像我在 PostgreSQL 中所做的那样。但我无法找到 SQL 服务器。我想创建在事务期间保留并在事务结束时自动删除的 TEMP 表。我正在使用 Spring-Mybats,如果需要也可以使用 JDBC。请帮忙。
  • 如果你创建一个带有双#的临时表,它将跨越事务。 IE。创建表##TEMP。但是,您必须手动删除它,否则它将一直保留到服务器重新启动。此外,您必须手动管理表的会话范围,因为该表对所有连接都是可见的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-03-06
  • 1970-01-01
  • 1970-01-01
  • 2016-09-05
  • 1970-01-01
  • 1970-01-01
  • 2017-03-15
相关资源
最近更新 更多