【问题标题】:SQL/HQL DELETE statement for a LRU cache?LRU 缓存的 SQL/HQL DELETE 语句?
【发布时间】:2012-03-15 10:09:36
【问题描述】:

我有一个用于缓存实体的数据库。表格如下所示:

  | Persons                | Addresses
-----------------        -------------- 
PK| id           <--|    PK| id
  | last_accessed   |--- FK| persons_id
  | [some]                 | [more]
  | [other]                | [address]
  | [data]                 | [stuff]

所以一个人有零个或多个地址。这些表由使用 Hibernate 的 Java 应用程序访问,也可以直接从使用 SQL over JDBC 的同一应用程序访问。

我现在需要将Persons 表的大小调整为一个固定值——比如50,000 条记录。我需要删除最旧的记录(基于last_accessed)才能执行此操作。

是否有 ANSI-SQL 或 HQL 查询可以轻松做到这一点?纯 ANSI-SQL 解决方案将是理想的,因为:

  • 我们正在努力保持与数据库无关;
  • 我们希望避免将对象加载到应用程序内存中以使 Hibernate 级联删除工作...

【问题讨论】:

    标签: sql caching hql


    【解决方案1】:

    这是纯 ANSI SQL:

    DELETE FROM addresses
    WHERE persons_id IN ( 
       SELECT id 
       FROM ( 
          SELECT id, 
                 row_number() over (order by last_accessed desc) as rn
          FROM persons
       ) t
       WHERE rn <= 50000
    );
    
    DELETE FROM persons
    WHERE id IN ( 
       SELECT id 
       FROM ( 
          SELECT id, 
                 row_number() over (order by last_accessed desc) as rn
          FROM persons
       ) t
       WHERE rn <= 50000
    );
    

    另一种选择是使用“ON DELETE CASCADE”定义 FK 约束,然后从persons 表中删除行。这将摆脱首先删除地址的额外 SQL。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-02
      • 1970-01-01
      • 2011-01-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多