【问题标题】:Select records from a specific key onwards从特定键开始选择记录
【发布时间】:2021-03-13 19:21:25
【问题描述】:

我有一张包含超过 3 万亿条记录的表
这个表的主键是guid

如下

               GUID                       Value   mid  id  
   0B821574-8E85-4FB7-8047-553393E385CB    4    51   15 
   716F74B0-80D8-4869-86B4-99FF9EB10561    0    510  153 
   7EBA2C31-FFC8-4071-B11A-9E2B7ED16B2B    2    5    3 
   85491F90-E4C6-4030-B1E5-B9CA36238AE2    1    58   7  
   F04FA30C-0C35-4B9F-A01C-708C0189815D    20   50  13 

guid 是主键 我想从中选择 10 条记录,其中键等于,例如,85491F90-E4C6-4030-B1E5-B9CA36238AE2

【问题讨论】:

  • 一个带有 where 子句和 order by 的简单 select 语句?你试过什么?你在哪里卡住了?请向我们展示您的尝试。
  • 您好,我想读取 10 到 10 条表记录并仅通过 udp 端口​​将它们发送到另一台服务器
  • 数据左侧的行编号让您感到困惑。数据库表中没有“第一”或“最后”行,保证SQL结果集中行顺序的正确方法是显式指定ORDER BY。因此,请澄清您需要阅读哪些行。
  • 好的。我上面解释过我想通过udp端口把这张表发送到另一台服务器

标签: sql sql-server tsql sql-order-by sql-limit


【解决方案1】:
  1. 从 MS SQL Server 2012 开始,您可以在 ORDER BY 中使用 OFFSET .. FETCH。根据 docs.microsoft.com 类似的内容:

    -- Declare and set the variables for the OFFSET and FETCH values.  
     DECLARE @StartingRowNumber INT = 1  
           , @RowCountPerPage INT = 10;  
     -- Create the condition to stop the transaction after all rows have been returned:  
     WHILE (SELECT COUNT(*) FROM mytable) >= @StartingRowNumber  
     BEGIN  
     -- Run the query until the stop condition is met:  
     SELECT *
     FROM mytable WHERE guid = '85491F90-E4C6-4030-B1E5-B9CA36238AE2'
     ORDER BY id   
         OFFSET @StartingRowNumber - 1 ROWS   
         FETCH NEXT @RowCountPerPage ROWS ONLY;  
     -- Increment @StartingRowNumber value:  
     SET @StartingRowNumber = @StartingRowNumber + @RowCountPerPage;  
     CONTINUE  
     END;
    
  2. 在现实世界中,这还不够,因为其他进程可以(尝试)同时在您的表中读取或写入数据。 请阅读文档,例如,在 https://docs.microsoft.com/en-us/sql/t-sql/queries/select-order-by-clause-transact-sql 中搜索“在单个事务中运行多个查询”

  3. 必须创建/应用字段 id 和 guid 的正确索引以提供性能

【讨论】:

    【解决方案2】:

    您可以使用order bytop。假设guid 定义了行的顺序:

    select top (10) t.*
    from mytable t
    where guid >= '85491F90-E4C6-4030-B1E5-B9CA36238AE2'
    order by guid
    

    如果排序是在其他列中定义的,比如id(也应该是唯一的),那么您将使用相关子查询进行过滤:

    select top (10) t.*
    from mytable t
    where id >= (select id from mytable t1 where guid = '85491F90-E4C6-4030-B1E5-B9CA36238AE2')
    order by id
    

    【讨论】:

    • 我用了这个方法。但是速度很慢
    • @user14744285:您使用的是第一个查询还是第二个查询?
    • 第一次查询不是我的答案。我使用上面解释的第二个查询。我想通过 udp 端口​​将此表发送到另一台服务器
    猜你喜欢
    • 1970-01-01
    • 2021-03-28
    • 1970-01-01
    • 1970-01-01
    • 2013-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多