优化(大)表搜索

时间:2016-05-17 04:29:32

标签: sql-server

我刚刚在reddit上发帖(虽然已经阅读了帖子)。我一直在努力提高自己的SQL技能并遇到以下问题。 有一个表定义为:

CREATE TABLE [Positions]( 
  [load_id] [int] NOT NULL, 
  [acct_cd] [varchar](20) NOT NULL, 
  [acct_num] [varchar](255) NULL, 
  [sec_id] [varchar](50) NOT NULL, 
  [long_sht_cd] [varchar](3) NOT NULL, 
  [sedol] [varchar](15) NULL, 
  [isin] [varchar](15) NULL, 
  [cusip] [varchar](9) NULL, 
  [sec_type] [varchar](8) NULL, 
  [sec_name] [varchar](100) NULL, 
  [currency_cd] [varchar](3) NULL, 
  [total_holding] [decimal](18,4) NULL, 
  [mkt_price] [float] NULL, 
  [datetime_stamp] [datetime] NULL, 
CONSTRAINT [pk_Positions] PRIMARY KEY CLUSTERED (
  [load_id] ASC, 
  [acct_cd] ASC, 
  [sec_id] ASC, 
  [long_sht_cd] ASC) 
)

表格保存每天多次附加的帐户头寸数据。目前表中有大约2400万行。每次我们追加其他职位时,我们都会在此表中添加大约32,000个条目,并且所有32,000个条目都具有相同的load_id。每次加载一批32,000个条目时,load_id都会加1(即前32K条目的load_id = 1,下一个32K的load_id = 2,等等......)。

datetime_stamp字段显示条目的加载时间,并且对于单个加载中的所有32K条目都是相同的。 例如,今天上午9点首先将头寸加载到表格中。在一天结束时,我们想知道上午9点装货的位置。

根据上面的表定义,检索当天第一个位置负载的最有效方法是什么?

我最初的(简单化)答案就是

SELECT * FROM Positions 
WHERE datetime_stamp = todays_date_9am;

但我知道我很天真。这张桌子很大,所以我知道我应该能够利用" load_id"希望使搜索O(1)而不是任何更长的搜索。

有什么建议吗?谢谢。

2 个答案:

答案 0 :(得分:0)

您可以尝试以下方法:

1) SELECT top(1) * FROM Positions 
WHERE datetime_stamp = todays_date_9am;

2)这将为您提供第一条记录,其中datetime_stamp等于9 AM Load的datetime_stamp。您将从此记录中获得9 AM负载的LoadId。

3)由于LoadId是主键的一部分,现在您可以使用此LoadId获取所需的记录。

select * from   Positions 
WHERE LoadId = 9_AM_LoadId

答案 1 :(得分:0)

CREATE NONCLUSTERED INDEX ix_Positions_datetime_stamp
ON [Positions] ([datetime_stamp]);

此索引将支持以下查询:

SELECT
    MIN([load_id]) AS StartID
FROM
    [Positions]
WHERE
    [datetime_stamp] = todays_date_9am;