我是新来张贴在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个条目时(即,第一个32K条目具有load_id = 1,下一个32K具有load_id = 2等等),load_id就加1。
datetime_stamp字段显示条目加载的时间,并且对于单个加载中的所有32K条目都是相同的。 例如,今天上午9点,职位首先被加载到表格中。在一天结束时,我们想知道在上午9点加载的职位。
根据上述表定义检索当天的第一个位置负载的最有效方法是什么?
我最初的(简单)的答案是简单地
SELECT * FROM Positions
WHERE datetime_stamp = todays_date_9am;
但我知道我太天真。这个表很庞大,所以我知道我应该能够利用“load_id”来希望搜索O(1),而不是更长。
有什么建议吗?谢谢。
您可以在'datetime_stamp'列添加一个索引来提高你提出的查询性能。 –
您也可以使用load_id和datetime_stamp来放置一个较小的表格,并在每次执行加载时填充该表格。然后你可以从那里首先检索load_id,然后根据load_id查询Positions。如果不知道系统是否值得将较旧的行存档到单独的表中,您仍然可以使用UNION在整个集合中进行查询,但是会提高最近数据的性能。 – OldBoyCoder
这个网站不是reddit。 –