【发布时间】:2018-03-27 18:24:38
【问题描述】:
几天来,我一直在努力提高数据库的性能,但对于 SQL Server 数据库中的索引,我仍然有些困惑。
我会尽量提供信息。
我的数据库目前包含大约 100k 行,并且会不断增长,因此我正在尝试找到一种方法让它更快地工作。
我也在写这个表,所以如果你的建议会大大减少写作时间,请告诉我。
总体目标是选择日期范围内具有特定名称的所有行。
这通常是从很多行中选择超过 3,000 行哈哈...
表架构:
CREATE TABLE [dbo].[reports]
(
[id] [int] IDENTITY(1,1) NOT NULL,
[IsDuplicate] [bit] NOT NULL,
[IsNotValid] [bit] NOT NULL,
[Time] [datetime] NOT NULL,
[ShortDate] [date] NOT NULL,
[Source] [nvarchar](350) NULL,
[Email] [nvarchar](350) NULL,
CONSTRAINT [PK_dbo.reports]
PRIMARY KEY CLUSTERED ([id] ASC)
) ON [PRIMARY]
这是我正在使用的 SQL 查询:
SELECT *
FROM [db].[dbo].[reports]
WHERE Source = 'name1'
AND ShortDate BETWEEN '2017-10-13' AND '2017-10-15'
据我所知,在不影响写作时间的情况下提高效率的最佳方法是在 Source 和 ShortDate 上创建一个非聚集索引。
我喜欢这样的索引架构:
CREATE NONCLUSTERED INDEX [Source&Time]
ON [dbo].[reports]([Source] ASC, [ShortDate] ASC)
现在我们进入了让我完全迷失的棘手部分,上面的索引有时有效,有时一半有效,有时根本无效....
(不确定是否重要,但目前 90% 的数据库行具有相同的 Source,尽管这种情况不会长期保持)
-
通过下面的查询,根本没有使用索引,我使用的是 SQL Server 2014,在执行计划中它说它只使用聚集索引扫描:
SELECT * FROM [db].[dbo].[reports] WHERE Source = 'name1' AND ShortDate BETWEEN '2017-10-10' AND '2017-10-15' -
使用此查询,根本不使用索引,尽管我从 SQL Server 得到了一个建议,即创建一个日期第一和源第二的索引...我读到该索引应该由查询的顺序是什么?它还说要包含我选择的所有列,这是必须的吗?...我再次读到我应该只在索引中包含我正在搜索的列。
SELECT * FROM [db].[dbo].[reports] WHERE Source = 'name1' AND ShortDate = '2017-10-13'SQL Server 索引建议 -
/* The Query Processor estimates that implementing the following index could improve the query cost by 86.2728%. */ /* USE [db] GO CREATE NONCLUSTERED INDEX [<Name of Missing Index, sysname,>] ON [dbo].[reports] ([ShortDate], [Source]) INCLUDE ([id], [IsDuplicate], [IsNotValid], [Time], [Email]) GO */
现在我尝试使用 SQL Server 建议我创建的索引并且它工作正常,似乎它使用上述两个查询都使用了 100% 的非聚集索引。
我尝试使用此索引,但删除了包含的列,但它不起作用...似乎我必须在索引中包含我选择的所有列?
顺便说一句,如果我包含所有列,它也可以在使用我创建的索引时工作。
总结一下:索引的顺序似乎无关紧要,因为它在创建 Source + ShortDate 和 ShortDate + Source 时都有效
但由于某种原因,必须包含所有列...(这会严重影响写入此表的内容?)
非常感谢您的阅读,我的目标是了解为什么会发生这种情况以及我应该怎么做(不仅仅是解决方案,因为我还需要将其应用于其他项目)。
干杯:)
【问题讨论】:
-
标记您正在使用的 dbms。这是一个产品特定的问题。
-
添加了标签 sql-server-2014。 ty
标签: sql database indexing sql-server-2014 database-performance