aierda 2023-09-13 09:42 采纳率: 72.1%
浏览 23
已结题

关于数据库水平位的问题

问题描述:
很多人都知道在oracle中有一个叫“水平位”的概念,我不知道此概念是否一样适用于mssql数据库。
意思大概是:
比如A表,里面有100万条记录,由于数据量很大,所以查询会比较慢。假如你
使用delete语句删除99万9999条,最后只剩下一条记录,
那查询速度应该会很快的了,但其实不然。
因为使用delete语句,数量是少了,但是它的“水平位”还是100万,换言之,它查询的对象
依然是100万条。
我不知道此概念是否一样适用于mssql数据库
我有这样的一个需求,由于mssql数据库日志表每天的量太大,所以
设想是程序执行时先delete一个月或三个月前的旧数据,以减轻它的体量。
但是呢,我又担心所谓的“水平位”问题
提出问题:
1.我这个担心有必要吗,mssql有这种情况出现吗?
2.如果有,我这个需求的最佳解决方案是什么?

  • 写回答

19条回答 默认 最新

  • Watch the clown 2023-09-13 11:30
    关注

    首先,SQL SERVER是没有水平位概念,我理解你的意思是oracle中存在HWM,数据删除了但是高水位没有下降,因为它只能增加不能倒退,一般都是5个数据块往上叠加。
    你可以说oracle用高水位标注管理数据,sql server用页的概念来操作数据,这个页呢每次数据删除以后会被重新利用,不会留下空白空间
    针对于你提到的日志问题,可以分批对日志表进行删除,写一个循环即可

    
    DECLARE @RowCount INT = 1;
    
    WHILE @RowCount > 0
    BEGIN
       DELETE TOP (10000) FROM 日志表
       WHERE 日期 < DATEADD(MONTH, -1, GETDATE()) 
    
       SET @RowCount = @@ROWCOUNT;
    END
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(18条)

报告相同问题?

问题事件

  • 系统已结题 9月28日
  • 已采纳回答 9月20日
  • 修改了问题 9月13日
  • 创建了问题 9月13日