我刚刚在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)而不是任何更长的搜索。
有什么建议吗?谢谢。
答案 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;