我正在尝试使用索引来加快速度,但是在连接的情况下,索引并没有改善查询执行时间,并且在某些情况下它会减慢速度。
创建测试表并用数据填充它的查询是:
CREATE TABLE [dbo].[IndexTestTable](
[id] [int] IDENTITY(1,1) PRIMARY KEY,
[Name] [nvarchar](20) NULL,
[val1] [bigint] NULL,
[val2] [bigint] NULL)
DECLARE @counter INT;
SET @counter = 1;
WHILE @counter < 500000
BEGIN
INSERT INTO IndexTestTable
(
-- id -- this column value is auto-generated
NAME,
val1,
val2
)
VALUES
(
'Name' + CAST((@counter % 100) AS NVARCHAR),
RAND() * 10000,
RAND() * 20000
);
SET @counter = @counter + 1;
END
-- Index in question
CREATE NONCLUSTERED INDEX [IndexA] ON [dbo].[IndexTestTable] …
Run Code Online (Sandbox Code Playgroud) 我在这里模拟了一个典型的星型模式,我提到了两个查询:第一个查询只是将事实表与 2 个维度表和 1 个日历表连接起来,第二个查询连接和聚合。
我通过研究执行计划和一些通过阅读建议的索引进行了实验并创建了索引,并且所有这些都在一定程度上提高了性能。
我的问题是在这种情况下可以进一步做什么,可以应用哪些索引或如何修改查询以获得更好的性能并减少执行时间?
因此,首先要创建和填充表并创建索引的查询:
CREATE TABLE FactTable (id BIGINT IDENTITY PRIMARY KEY, FKDim1 BIGINT NOT NULL, FKDim2 BIGINT, DateRef DATETIME, Fact1 MONEY, Fact2 MONEY)
CREATE TABLE Dim1Table (id BIGINT IDENTITY PRIMARY KEY, Dim1Name NVARCHAR(20), Dim1Val1 MONEY, Dim1Val2 MONEY)
CREATE TABLE Dim2Table (id BIGINT IDENTITY PRIMARY KEY, Dim2Name NVARCHAR(20), Dim2Val1 MONEY, Dim2Val2 MONEY)
CREATE TABLE CalendarTable (id BIGINT IDENTITY PRIMARY KEY, [Date] DATETIME UNIQUE NONCLUSTERED, [Weekday] NVARCHAR(10), [Month] NVARCHAR(10))
ALTER TABLE FactTable ADD CONSTRAINT FK_Dim1 FOREIGN KEY …
Run Code Online (Sandbox Code Playgroud) performance index sql-server query-performance performance-tuning