【问题标题】:Slow Select query in SQL with table having 2 million records onlySQL中的慢速选择查询,表只有200万条记录
【发布时间】:2019-01-06 00:36:09
【问题描述】:

如果可能的话,我需要您的宝贵建议,我有一个表格跟踪历史记录(下表的脚本)。它有大约。 220 万条记录。但是当我获取所有记录时,表格渲染太慢了,获取所有记录大约需要 4-5 分钟。我假设表中的行数非常少,只有 220 万,所以它应该渲染得非常快。

如果您能为此添加宝贵的意见,那将非常有帮助。

选择记录应该非常快,并且可以在几秒钟内呈现,因为表记录较少且数据库大小仅为 12 GB。

统计 IO 和 100,000 条记录的时间 - “(受影响的 100000 行) 表'trackingsHistory'。扫描计数 1,逻辑读取 21036,物理读取 0,预读读取 0,lob 逻辑读取 0,lob 物理读取 0,lob 预读读取 0。

(受影响的 1 行)

SQL Server 执行时间: CPU 时间 = 2657 毫秒,经过时间 = 9737 毫秒。”

**Details Below**

**Exact query** - SELECT * FROM TRACKINGSHISTORY WHERE bookedin_date BETWEEN '2018-01-01 07:03:58.700' AND '2018-12-31 07:03:58.700' ORDER BY ID DESC

**Table Structure**
/****** Object:  Table [dbo].[trackingsHistory]    Script Date: 07/25/2018 13:22:40 ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE TABLE [dbo].[trackingsHistory](
      [id] [int] IDENTITY(1,1) NOT NULL,
      [customer_id] [int] NULL,
      [master_tracking_no] [nvarchar](30) NULL,
      [carrier] [nvarchar](50) NOT NULL,
      [voided] [bit] NOT NULL,
      [origin] [nvarchar](250) NULL,
      [destination] [nvarchar](250) NOT NULL,
      [service_type] [nvarchar](50) NULL,
      [bookedin_date] [datetime] NOT NULL,
      [package_type] [nvarchar](50) NOT NULL,
      [pieces] [tinyint] NOT NULL,
      [total_weight] [decimal](18, 2) NOT NULL,
      [weight_unit] [int] NULL,
      [total_dim_weight] [decimal](18, 2) NOT NULL,
      [scheduled] [nvarchar](50) NULL,
      [quoted_base] [decimal](18, 2) NOT NULL,
      [quoted_fuel] [decimal](18, 2) NOT NULL,
      [quoted_vat] [decimal](18, 2) NOT NULL,
      [quoted_total] [decimal](18, 2) NOT NULL,
      [quoted_insurance] [decimal](18, 2) NOT NULL,
      [quoted_additionalhandlingsurcharge] [decimal](18, 2) NOT NULL,
      [quoted_administrationcharge] [decimal](18, 2) NOT NULL,
      [quoted_reseller_markup_percentage] [decimal](18, 2) NOT NULL,
      [quoted_reseller_markup] [decimal](18, 2) NOT NULL,
      [insurance] [nvarchar](50) NULL,
      [shipper_company] [nvarchar](50) NULL,
      [shipper_contact] [nvarchar](50) NULL,
      [shipper_vat_no] [nvarchar](50) NULL,
      [terms_of_trade] [nvarchar](50) NULL,
      [destination_country] [nvarchar](50) NULL,
      [receiver_company] [nvarchar](50) NULL,
      [receiver_contact] [nvarchar](50) NULL,
      [receiver_vat_no] [nvarchar](50) NULL,
      [shipment_contents] [nvarchar](2000) NULL,
      [reason_for_export] [nvarchar](50) NULL,
      [commercial_invoice] [bit] NOT NULL,
      [shipment_reference] [nvarchar](50) NULL,
      [currency_sign] [nvarchar](10) NULL,
      [dispatch_id] [int] NULL,
      [payment_transaction_id] [nvarchar](100) NULL,
      [service_id] [int] NULL,
      [importTracking_id] [int] NULL,
      [origin_email] [nvarchar](50) NULL,
      [origin_phone] [nvarchar](50) NULL,
      [dest_email] [nvarchar](50) NULL,
      [dest_phone] [nvarchar](50) NULL,
      [quoted_extareasurcharge] [decimal](18, 2) NOT NULL,
      [quoted_extarea_fuel_surcharge] [decimal](18, 2) NOT NULL,
      [payment_method_used] [nvarchar](10) NULL,
      [paymentmode] [nvarchar](10) NULL,
      [WORef] [nvarchar](50) NULL,
      [quoted_residential_charge] [decimal](18, 2) NOT NULL,
      [quoted_residential_fuel_surcharge] [decimal](18, 2) NOT NULL,
      [transportation_payer] [int] NULL,
      [subscription_type] [tinyint] NULL,
      [quoted_markup] [decimal](18, 2) NOT NULL,
      [shipment_status] [nvarchar](500) NULL,
      [shipment_status_error] [nvarchar](500) NULL,
      [is_shipment_delivered] [bit] NULL,
      [is_thermal_print] [bit] NULL,
      [watch_status] [bit] NULL,
      [account_no] [nvarchar](10) NULL,
      [quoted_largepackagesurcharge] [decimal](18, 2) NOT NULL,
      [quoted_overmax_size] [decimal](18, 2) NOT NULL,
      [quoted_overmax_weight] [decimal](18, 2) NOT NULL,
      [origin_country] [nvarchar](125) NULL,
      [quoted_largepackage_fuel_surcharge] [decimal](18, 2) NOT NULL,
      [quoted_premium_timed_charge] [decimal](18, 2) NOT NULL,
      [quoted_restricted_destination] [decimal](18, 2) NOT NULL,
      [quoted_exporter_validation] [decimal](18, 2) NOT NULL,
      [quoted_elevated_risk] [decimal](18, 2) NOT NULL,
      [shipment_type] [tinyint] NOT NULL,
      [quoted_misc_charge] [decimal](18, 2) NOT NULL,
      [last_updated_date] [datetime] NULL,
      [reseller_id] [int] NULL,
      [sales_person_id] [int] NULL,
      [multi_site_id] [int] NULL,
      [acs_group_id] [int] NULL,
      [franchise_acs_group_id] [int] NULL,
      [sk_commission] [decimal](18, 2) NULL,
CONSTRAINT [PK_tracking] PRIMARY KEY CLUSTERED 
(
      [id] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON, FILLFACTOR = 100) ON [PRIMARY]
)

GO

EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'True value will add shipment to watch list and false will remove from watch list.' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'trackingsHistory', @level2type=N'COLUMN',@level2name=N'watch_status'
GO

ALTER TABLE [dbo].[trackingsHistory]  WITH CHECK ADD  CONSTRAINT [FK_trackingsHistory_customers] FOREIGN KEY([customer_id])
REFERENCES [dbo].[customers] ([id])
GO

ALTER TABLE [dbo].[trackingsHistory] CHECK CONSTRAINT [FK_trackingsHistory_customers]
GO

ALTER TABLE [dbo].[trackingsHistory]  WITH CHECK ADD  CONSTRAINT [FK_trackingsHistory_dispatches] FOREIGN KEY([dispatch_id])
REFERENCES [dbo].[dispatches] ([id])
GO

ALTER TABLE [dbo].[trackingsHistory] CHECK CONSTRAINT [FK_trackingsHistory_dispatches]
GO

ALTER TABLE [dbo].[trackingsHistory]  WITH CHECK ADD  CONSTRAINT [FK_trackingsHistory_importTrackings] FOREIGN KEY([importTracking_id])
REFERENCES [dbo].[importTrackings] ([id])
GO

ALTER TABLE [dbo].[trackingsHistory] CHECK CONSTRAINT [FK_trackingsHistory_importTrackings]
GO

ALTER TABLE [dbo].[trackingsHistory]  WITH CHECK ADD  CONSTRAINT [FK_trackingsHistory_multisite] FOREIGN KEY([multi_site_id])
REFERENCES [dbo].[customers] ([id])
GO

ALTER TABLE [dbo].[trackingsHistory] CHECK CONSTRAINT [FK_trackingsHistory_multisite]
GO

ALTER TABLE [dbo].[trackingsHistory]  WITH CHECK ADD  CONSTRAINT [FK_trackingsHistory_reseller] FOREIGN KEY([reseller_id])
REFERENCES [dbo].[customers] ([id])
GO

ALTER TABLE [dbo].[trackingsHistory] CHECK CONSTRAINT [FK_trackingsHistory_reseller]
GO

ALTER TABLE [dbo].[trackingsHistory]  WITH CHECK ADD  CONSTRAINT [FK_trackingsHistory_sales] FOREIGN KEY([sales_person_id])
REFERENCES [dbo].[customers] ([id])
GO

ALTER TABLE [dbo].[trackingsHistory] CHECK CONSTRAINT [FK_trackingsHistory_sales]
GO

ALTER TABLE [dbo].[trackingsHistory] ADD  CONSTRAINT [DF_trackingsHistory_quoted_base]  DEFAULT ((0)) FOR [quoted_base]
GO

ALTER TABLE [dbo].[trackingsHistory] ADD  CONSTRAINT [DF_trackingsHistory_quoted_fuel]  DEFAULT ((0)) FOR [quoted_fuel]
GO

ALTER TABLE [dbo].[trackingsHistory] ADD  CONSTRAINT [DF_trackingsHistory_quoted_vat]  DEFAULT ((0)) FOR [quoted_vat]
GO

ALTER TABLE [dbo].[trackingsHistory] ADD  CONSTRAINT [DF_trackingsHistory_quoted_total]  DEFAULT ((0)) FOR [quoted_total]
GO

ALTER TABLE [dbo].[trackingsHistory] ADD  CONSTRAINT [DF_trackingsHistory_quoted_insurance]  DEFAULT ((0)) FOR [quoted_insurance]
GO

ALTER TABLE [dbo].[trackingsHistory] ADD  CONSTRAINT [DF_trackingsHistory_quoted_additionalhandlingsurcharge]  DEFAULT ((0)) FOR [quoted_additionalhandlingsurcharge]
GO

ALTER TABLE [dbo].[trackingsHistory] ADD  CONSTRAINT [DF_trackingsHistory_quoted_additionalhandlingsurcharge1]  DEFAULT ((0)) FOR [quoted_administrationcharge]
GO

ALTER TABLE [dbo].[trackingsHistory] ADD  CONSTRAINT [DF_trackingsHistory_quoted_reseller_markup_percentage]  DEFAULT ((0)) FOR [quoted_reseller_markup_percentage]
GO

ALTER TABLE [dbo].[trackingsHistory] ADD  CONSTRAINT [DF_trackingsHistory_quoted_reseller_markup]  DEFAULT ((0)) FOR [quoted_reseller_markup]
GO

ALTER TABLE [dbo].[trackingsHistory] ADD  CONSTRAINT [DF__trackings__quote__14270015]  DEFAULT ((0)) FOR [quoted_extareasurcharge]
GO

ALTER TABLE [dbo].[trackingsHistory] ADD  CONSTRAINT [DF_trackingsHistory_quoted_extarea_fuel_surcharge]  DEFAULT ((0)) FOR [quoted_extarea_fuel_surcharge]
GO

ALTER TABLE [dbo].[trackingsHistory] ADD  CONSTRAINT [DF__trackings__quote__17036CC0]  DEFAULT ((0)) FOR [quoted_residential_charge]
GO

ALTER TABLE [dbo].[trackingsHistory] ADD  CONSTRAINT [DF_trackingsHistory_quoted_residential_fuel_surcharge]  DEFAULT ((0)) FOR [quoted_residential_fuel_surcharge]
GO

ALTER TABLE [dbo].[trackingsHistory] ADD  CONSTRAINT [DF_trackingsHistory_quoted_markup]  DEFAULT ((0)) FOR [quoted_markup]
GO

ALTER TABLE [dbo].[trackingsHistory] ADD  CONSTRAINT [DF__trackings__quote__55FFB06A]  DEFAULT ((0)) FOR [quoted_largepackagesurcharge]
GO

ALTER TABLE [dbo].[trackingsHistory] ADD  CONSTRAINT [DF__trackings__quote__25E688F4]  DEFAULT ((0)) FOR [quoted_overmax_size]
GO

ALTER TABLE [dbo].[trackingsHistory] ADD  CONSTRAINT [DF__trackings__quote__26DAAD2D]  DEFAULT ((0)) FOR [quoted_overmax_weight]
GO

ALTER TABLE [dbo].[trackingsHistory] ADD  CONSTRAINT [DF__trackings__quote__5F3F01E1]  DEFAULT ((0)) FOR [quoted_largepackage_fuel_surcharge]
GO

ALTER TABLE [dbo].[trackingsHistory] ADD  CONSTRAINT [DF_trackingsHistory_quoted_premium_timed_charge]  DEFAULT ((0)) FOR [quoted_premium_timed_charge]
GO

ALTER TABLE [dbo].[trackingsHistory] ADD  CONSTRAINT [DF__trackings__quote__22DFFF17]  DEFAULT ((0)) FOR [quoted_restricted_destination]
GO

ALTER TABLE [dbo].[trackingsHistory] ADD  CONSTRAINT [DF__trackings__quote__23D42350]  DEFAULT ((0)) FOR [quoted_exporter_validation]
GO

ALTER TABLE [dbo].[trackingsHistory] ADD  CONSTRAINT [DF__trackings__quote__6A669BCA]  DEFAULT ((0.00)) FOR [quoted_elevated_risk]
GO

ALTER TABLE [dbo].[trackingsHistory] ADD  CONSTRAINT [DF_Constraint]  DEFAULT ((0)) FOR [shipment_type]
GO

ALTER TABLE [dbo].[trackingsHistory] ADD  DEFAULT ((0)) FOR [quoted_misc_charge]
GO

ALTER TABLE [dbo].[trackingsHistory] ADD  DEFAULT (getdate()) FOR [last_updated_date]
GO

【问题讨论】:

  • 对于信息,使用“Lakh”这个词时应该非常小心,因为它只在印度真正使用。坚持使用英语术语要好得多,尤其是在说英语的网站上。
  • bookedin_date ASC, ID DESC 上的聚集索引将提高查询性能,但呈现性能是另一回事。

标签: sql sql-server database query-performance


【解决方案1】:

表中的行数非常少,只有 220 万,因此渲染速度应该非常快。

读取 220 万行并不是什么大问题,但是将它们发送给客户端并“渲染”它们可能会很昂贵,尤其是对于包含这么多列的表。为什么要向客户端发送这么多行和列?

无论如何,要优化查询处理,请尝试将此表存储为聚集列存储,而不是未压缩堆。例如:

create clustered columnstore index cci_trackingsHistory on [trackingsHistory]

这都会使表变得更小,从而减少读取它的 IO。但它不会使通过网络或客户端处理更快地发送行。

另一个更好的设计是使 PK 集群化,因为您正在请求按 PK 顺序排列的行。对于非集群 PK,SQL 必须对所有行进行排序,或者对每一行进行书签查找。

【讨论】:

  • 值得注意的是,问题中定义的表有很多列,这只会增加数据传输时间并使其变得更糟。
  • 嗨,大卫,衷心感谢您对此进行调查。我正在使用 sql server 2012,并且得到“不支持聚集列存储索引”。此外,我不会一次渲染 220 万条记录。即使我用 1 年的数据尝试它,也需要大约 1 分钟才能呈现完整的 sql 结果。这只在 SQL 端真的很快吗?考虑 - 我每天在这个表中有 2500 个插入。非常感谢。
  • 嗨大卫,主键 id 列已经是一个聚集索引。我知道某处存在一些问题,但在我最后尝试了一切,但没有运气。迫切需要一些帮助。因为企业数据库的单位是 TB,所以我只有 12 GB 的整体数据库。
  • @Agam 来自您发布的 DDL CONSTRAINT [PK_tracking] PRIMARY KEY NONCLUSTERED 此外,您还没有解释为什么要通过网络向客户端发送数百万行(宽表),或者为什么您希望这样快点。
  • @DavidG,正如您所提到的,“值得注意的是,问题中定义的表有很多列,这只会增加数据传输时间并使其变得更糟”。所以你认为这张桌子是经过重组的设计。这样可以在几秒钟内获取记录。我会尝试并在您回复后的 30 分钟内分享结果。真诚的问候。
【解决方案2】:

有两件事可以加快您的查询速度:

  1. Id 上创建聚集索引,因此查询不进行排序,表将存储已按该列排序(因此在这种情况下,按索引列排序会快得多Id)。

  2. bookedin_date 上创建非聚集索引,它会加速该列的过滤(在WHERE 子句中)。

【讨论】:

  • Turczyn - Id 列上已经存在聚集索引。在原始表设计中,bookedin_date 也被添加为非聚集索引。
【解决方案3】:

在 SQL Server 中,页面大小为 8 KB。即使您的排序规则是 ASCII,表的每一行消耗的容量也超过了该容量。这意味着即使您创建了良好的索引并提高了 where 子句的性能,SQL‌ Server 在从叶节点提取数据方面也会出现延迟。 另一方面,当表格的列太多时,您很可能需要重新设计它。
任何你必须解决的方法:
1)为您的查询创建一个索引,您需要的所有列都作为“包含”列附加到它。 2) 将您的表拆分为 2 个或更多表

【讨论】:

  • 我仍然尝试将其规范化为 3 个表,同时获取结果。此外,包含的列很少,但结果完全相同
  • 在多表场景下,尝试单独过滤表,然后将它们连接在一起。我对此不是 100% 确定,但取决于您要获取的记录数,它可能会起作用
  • 关于“包含”列;只有在特定查询中包含表中所需的所有列时它才有用,否则它会查找聚集索引的叶页
猜你喜欢
  • 2013-09-25
  • 1970-01-01
  • 1970-01-01
  • 2021-11-07
  • 2014-08-10
  • 2020-05-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多