根据where子句,我在SQL Server上的查询很慢

时间:2019-06-26 20:27:13

标签: sql sql-server

我有两个具有100万行的表。

案例1 :带有'cvaleur'的Where子句

SELECT TOP(2000)  
    [p].[Id_Paie_Param_Constante_Variable] AS [id], 
    [v].[Date_MAJ] AS [DateMaj], 
    [v].[Id_Paie_Param_Constante_Variable_Valeur] AS [IdPaieParamConstanteVariableValeur]
FROM 
    [Paie_Param_Constante_Variable] AS [p]
LEFT JOIN 
    [Paie_Theme] AS [t] ON [p].[Code_Paie_Theme] = [t].[Code_Paie_Theme]
INNER JOIN 
    [Paie_Param_Constante_Variable_Valeur] AS [v] ON [p].[Id_Paie_Param_Constante_Variable] = [v].[Id_Paie_Param_Constante_Variable]
WHERE 
    [p].[Code_Constante_Variable_Type] = N'cvaleur'
ORDER BY 
    [DateMaj] DESC

此查询在200毫秒内返回我的行

案例2:带有'vformule'的Where子句

SELECT TOP(2000) 
    [p].[Id_Paie_Param_Constante_Variable] AS [id], 
    [v].[Date_MAJ] AS [DateMaj], 
    [v].[Id_Paie_Param_Constante_Variable_Valeur] AS [IdPaieParamConstanteVariableValeur]
FROM 
    [Paie_Param_Constante_Variable] AS [p]
LEFT JOIN 
    [Paie_Theme] AS [t] ON [p].[Code_Paie_Theme] = [t].[Code_Paie_Theme]
INNER JOIN 
    [Paie_Param_Constante_Variable_Valeur] AS [v] ON [p].[Id_Paie_Param_Constante_Variable] = [v].[Id_Paie_Param_Constante_Variable]
WHERE 
    [p].[Code_Constante_Variable_Type] = N'vformule'
ORDER BY 
    [DateMaj] DESC

此查询在5秒内返回我的行!为什么?

我有两个索引:

CREATE NONCLUSTERED INDEX [IX_Relationship9] 
ON [dbo].[Paie_Param_Constante_Variable] ([Code_Constante_Variable_Type] ASC)
          WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, 
                SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, 
                ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
GO

CREATE NONCLUSTERED INDEX [DateMAJ] 
ON [dbo].[Paie_Param_Constante_Variable_Valeur] ([Date_MAJ] DESC)
          WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, 
                SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, 
                ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
GO

案例3:带有'vformule'的Where子句,但按ASC排序

SELECT TOP(2000) 
    [p].[Id_Paie_Param_Constante_Variable] AS [id], 
    [v].[Date_MAJ] AS [DateMaj], 
    [v].[Id_Paie_Param_Constante_Variable_Valeur] AS [IdPaieParamConstanteVariableValeur]
FROM 
    [Paie_Param_Constante_Variable] AS [p]
LEFT JOIN 
    [Paie_Theme] AS [t] ON [p].[Code_Paie_Theme] = [t].[Code_Paie_Theme]
INNER JOIN 
    [Paie_Param_Constante_Variable_Valeur] AS [v] ON [p].[Id_Paie_Param_Constante_Variable] = [v].[Id_Paie_Param_Constante_Variable]
WHERE 
    [p].[Code_Constante_Variable_Type] = N'vformule'
ORDER BY 
    [DateMaj] ASC

此查询在200毫秒内返回我的行!

我在DateMAJ上的索引是DESC。

我需要按降序对SQL进行排序...

非常感谢任何帮助

欢呼

1 个答案:

答案 0 :(得分:0)

我有两个初步想法:

1)索引[Code_Constante_Variable_Type]按ASC排序,因此较早的值(“ vformule”)早发现了值(“ cvaleur”)。

2)表“ cvaleur”中的出现次数少于表中“ vformule”中的出现次数。