SELECT DISTINCT not in 改为使用 JOIN 操作

SELECT    *   from    crawl_public.d_fund_nv     where  statistic_date='2023-09-20' and fund_id not in (SELECT  distinct  fund_id   from    base_public.fund_nv_source     where  statistic_date='2023-09-20' )

优化这个sql

对于您提供的 SQL 查询语句,以下是一些可能的优化建议:

1. 使用 JOIN 替代子查询:将子查询中的 `SELECT DISTINCT` 改为使用 JOIN 操作,可以提高查询性能。这样可以避免在每次执行子查询时进行重复的计算。

```sql
SELECT d.*
FROM crawl_public.d_fund_nv AS d
LEFT JOIN (
    SELECT DISTINCT fund_id
    FROM base_public.fund_nv_source
    WHERE statistic_date = '2023-09-20'
) AS b ON d.fund_id = b.fund_id
WHERE d.statistic_date = '2023-09-20' AND b.fund_id IS NULL;
  1. 索引优化:对于经常用于过滤条件的列,可以考虑为这些列创建索引,以提高查询性能。在这个查询中,对 crawl_public.d_fund_nv 表的 statistic_date 列和 fund_id 列,以及 base_public.fund_nv_source 表的 statistic_date 列和 fund_id 列创建索引可能会有帮助。
-- 创建索引示例
CREATE INDEX idx_d_fund_nv_statistic_date ON crawl_public.d_fund_nv (statistic_date);
CREATE INDEX idx_d_fund_nv_fund_id ON crawl_public.d_fund_nv (fund_id);
CREATE INDEX idx_fund_nv_source_statistic_date ON base_public.fund_nv_source (statistic_date);
CREATE INDEX idx_fund_nv_source_fund_id ON base_public.fund_nv_source (fund_id);

请注意,优化 SQL 查询的效果取决于数据库的结构、数据量和配置等因素。建议在进行任何更改之前,在测试环境中进行适当的基准测试和性能评估。


你可能感兴趣的:(java,数据库,开发语言)