Sql server 优化(大型)表搜索

Sql server 优化(大型)表搜索,sql-server,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](

我刚开始在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万行。每次添加额外的位置时,我们会向该表添加大约32000个条目,所有32000个条目都将具有相同的load_id。每次加载32000个条目时,load_id将增加一个(即,前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),而不是任何更长的东西


有什么建议吗?谢谢。

您可以尝试以下方法:

1) SELECT top(1) * FROM Positions 
WHERE datetime_stamp = todays_date_9am;
2) 这将为您提供第一条记录,其中datetime_戳记等于上午9点加载的datetime_戳记。您将从此记录中获得上午9点加载的加载ID

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

select * from   Positions 
WHERE LoadId = 9_AM_LoadId

您可以尝试以下操作:

1) SELECT top(1) * FROM Positions 
WHERE datetime_stamp = todays_date_9am;
2) 这将为您提供第一条记录,其中datetime_戳记等于上午9点加载的datetime_戳记。您将从此记录中获得上午9点加载的加载ID

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

select * from   Positions 
WHERE LoadId = 9_AM_LoadId
此索引将支持以下查询:

SELECT
    MIN([load_id]) AS StartID
FROM
    [Positions]
WHERE
    [datetime_stamp] = todays_date_9am;
此索引将支持以下查询:

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

您可以在
datetime\u stamp
列上添加索引,以提高所显示查询的性能。您还可以保存一个较小的表,其中只包含load\u id和datetime\u stamp,并在每次加载时填充该表。然后您可以首先从那里检索load_id,然后根据load_id查询位置。不知道您的系统是否值得将较旧的行归档到单独的表中,您仍然可以使用UNION在整个集合中进行查询,但您可以提高最近数据的性能。此网站不是reddit。您可以在
datetime\u stamp
列上添加索引,以提高所显示查询的性能。您还可以保留一个较小的表,其中只包含load\u id和datetime\u stamp,并在每次查询时填充该表做一个负荷。然后您可以首先从那里检索load_id,然后根据load_id查询位置。不知道您的系统是否值得将较旧的行归档到单独的表中,您仍然可以使用UNION在整个集合中进行查询,但可以提高最近数据的性能。此网站不是reddit。没有datetime_戳索引,无论如何都要进行表扫描。至少选择top(1)loadId以减少网络上的数据传输。您最好按照我在评论中的建议,将loadid与load timestamp存储在一个单独的表中。@OldBoyCoder:它不会扫描整个表,而只是选择与时间戳匹配的第一条记录。它不会在服务器上产生太多负载。但是它如何找到那一行呢?没有索引,因此第一个查询必须扫描整个表,直到它在datetime\u戳上找到匹配项为止,如果幸运的话,它会在早期找到它,但可能性是相反的。如果没有datetime\u戳上的索引,无论如何都要进行表扫描。至少选择top(1)loadId以减少网络上的数据传输。您最好按照我在评论中的建议,将loadid与load timestamp存储在一个单独的表中。@OldBoyCoder:它不会扫描整个表,而只是选择与时间戳匹配的第一条记录。它不会在服务器上产生太多负载。但是它如何找到那一行呢?由于没有索引,因此第一个查询必须扫描整个表,直到在datetime_戳上找到匹配项为止,如果幸运的话,它可以在早期找到,但可能性不大。