【问题标题】:SQL Server - faster records retrievalSQL Server - 更快的记录检索
【发布时间】:2013-03-10 08:23:07
【问题描述】:

我有这种情况:我们在 SQL Server 数据库中的一个表已经有 5000 万行。我们不时分批插入行。每个批次的行具有相同的批次 ID 和日期时间戳,并且批次一次最多可以有 100k 行。

一天中有很多批次运行。使用batchIDdatetimestamp 获取第一批行的最佳查询方式是什么?

我们一直在使用批处理 id 的 min 并使用相应的 datetimestamp 有一段时间了,但它似乎没有有效地运行。您能否就可以做些什么来改善这一点提供一些见解?感谢您的回复。

【问题讨论】:

  • 请提供表结构,包括索引和可能的几行示例数据。如果批次中的所有行都相同,我不明白为什么要将日期时间戳存储在该表中。而且我也不明白在这种情况下“第一批记录”是什么意思。
  • CREATE TABLE [Test]( [batch_id][int]NOT NULL, [Claim_ID][varchar](20) NOT NULL, [Transaction_ID][varchar](255) NULL, [Transaction_Type] [ varchar](5) NOT NULL, [paymentAmount] money, [EDate] [datetime] NULL) CONSTRAINT [pk_Test] PRIMARY KEY CLUSTERED ([batch_id] ASC, [Claim_ID] ASC, [Transaction_ID] ASC, [Transaction_Type] ASC) 这是是表结构,第一批记录表示一天内第一批10万条记录进入表。
  • 如果每个批次的记录有相同的batchid和datetimestamp,并且每批次有100K条记录,应该为batchid和stamp创建一个表,然后FK到记录表。
  • @urlreader 我同意,但现在我无法进行此更改。只是寻找实现我想要的最佳方式。
  • 不要将代码示例或示例数据放入 cmets - 因为您无法对其进行格式化,所以阅读它非常困难....而是:更新您的问题,编辑它以提供附加信息!谢谢。

标签: sql sql-server sql-server-2008 sql-server-2008-r2


【解决方案1】:

您应该为EDate-Column 添加索引,包括BatchID

create nonclustered index Index_EDate_Table 
 on YourTable 
   (EDate ASC)
 include 
   (BatchID)

然后您可以查询当天按时间戳排序的批次

select distinct BatchID
    from YourTable
   where EDate >= Cast(GetDate() as Date)
   order by EDate

这应该足够快。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-09
    • 2010-10-15
    • 1970-01-01
    相关资源
    最近更新 更多