小编Mur*_*ilo的帖子

减少此 COUNT() 查询的持续时间

我有一个包含 2,161,524 行的表。我认为计数查询花费的时间太长。

select count(mcon_codigo_pk) from tbMovimentoConta
-- count = 2,161,524
-- time = 9 seconds

select count(1) from tbMovimentoConta 
where con_codigo_fk = 1 
and mcon_data between '2015-01-05' and '2016-01-06'
-- count = 1,034,729 
-- time = 13 seconds
Run Code Online (Sandbox Code Playgroud)

细节:

  • 该列con_codigo_fkbigint并且具有外键索引(非聚集)
  • 该列mcon_datadatetime并且具有索引(非聚集)
  • 表有自增PK(聚集索引)
  • 还有更多三个具有索引的外来索引(所有索引都是由实体框架创建的)

索引创建脚本

CREATE NONCLUSTERED INDEX [ix_mcon_data] ON [dbo].[tbMovimentoConta]
(
    [mcon_data] ASC
)
WITH (
    PAD_INDEX = OFF
    , STATISTICS_NORECOMPUTE = OFF
    , SORT_IN_TEMPDB = OFF
    , DROP_EXISTING = OFF …
Run Code Online (Sandbox Code Playgroud)

performance sql-server-2014 query-performance

4
推荐指数
1
解决办法
204
查看次数

动态查询的索引解决方案

我有一个贷记/借记表(5 百万条记录)。应用程序必须提供一个 UI 视图来搜索提供 N 个条件的数据:

  • 日期类型(必填)例如。创建日期或截止日期
  • 日期范围(必填)
  • 状态(付费、未付费或两者兼有)
  • 文件号码
  • 顾客ID
  • 付款方式(信用卡、现金等)

用户必须提供前两个标准,但可以提供或不提供另一个。所以我有很多组合。

我想我将不得不创建许多索引,例如:

  • ix_search_customerID_dueDate (customerID, DueDate)
  • ix_search_customerID_creationDate (customerID, creationDate)

有无数组合。我使用 C# 和实体框架根据提供的值生成查询,这很容易做到,但我不知道如何创建索引来涵盖所有可能性。是否有可能或我应该更改 UI 逻辑?

我阅读了这个答案,因此基于此我相信如果我创建一个索引(creationDate、状态、文档、customerID、typeOfPayment)并且用户只提供例如 Customer ID 索引将不起作用。

index sql-server sql-server-2014

0
推荐指数
1
解决办法
1546
查看次数