Sql server 关于sql server索引性能的建议
我有一个包含1500万行的“UserLog”表 在这个表中,我在User\u ID字段上有一个类型为bigint identity的聚类索引,在User\u uid字段上有一个类型为varchar(35)(伪uniqueidentifier)的非聚类索引 在我的应用程序中,我们可以有两类用户连接。其中1个仅涉及0.007%的行(约1150个RAW超过1500万),第2个涉及其余行(99%) 目标是提高0.007%用户连接的性能 这就是我创建一个“拆分”字段“Userlog\u ID”的原因,该字段的类型位默认值为0。因此,对于每个用户连接,我们在Userlog中插入一个新行(user_log的值为0) 该字段(用户日志)随后将被更新,根据用户类别,该字段将采用0(超过99%的行)或1(0.007%的行) 然后我在这个字段上创建了一个非聚集索引(User\u log) 我要优化的选择状态是:Sql server 关于sql server索引性能的建议,sql-server,performance,indexing,Sql Server,Performance,Indexing,我有一个包含1500万行的“UserLog”表 在这个表中,我在User\u ID字段上有一个类型为bigint identity的聚类索引,在User\u uid字段上有一个类型为varchar(35)(伪uniqueidentifier)的非聚类索引 在我的应用程序中,我们可以有两类用户连接。其中1个仅涉及0.007%的行(约1150个RAW超过1500万),第2个涉及其余行(99%) 目标是提高0.007%用户连接的性能 这就是我创建一个“拆分”字段“Userlog\u ID”的原因,该字
SELECT User_UID, User_LastAuthentificationDate,
Language_ID,User_SecurityString
FROM dbo.UserLog
WHERE User_Active = 1
AND User_UID = '00F5AA38-C288-48C6-8ED1922601819486'
因此,现在的想法是,仅当用户属于类别1(0.007%)时,才在User_Log字段上添加一个过滤器以优化性能(精确地说是索引搜索操作符):
在我看来,我的想法是,由于我们添加了这个过滤器,索引搜索将执行得更好,因为我们现在有一个更小的结果集
不幸的是,当我将这两个查询与估计的执行计划进行比较时,我得到了每个查询的50%。对于这两个查询,Optimizer对用户uid非聚集索引进行索引查找,然后对聚集索引(用户id)进行键查找
因此,总之,通过添加拆分字段和非聚集索引(普通索引或过滤索引),我不会提高性能
谁能解释一下原因吗。也许我的推理和解释完全错了
谢谢两个想法:1)您可以使用非聚集索引中的WHERE来仅为类别1行构建索引;2) 您可以在MSSQL()中使用分区将不同类别的行分隔为不同的文件组,但它需要企业版的MSSQL。阅读更多:您看过过滤索引了吗?您可以在CREATE索引上添加WHERE子句,它将只为b树中的用户_Log=1编制索引。是。过滤索引是我首先想到的。正如我已经说过的,我也尝试了过滤索引,但我也得到了同样的结果(50%)。在我看来,只有当我使用partitioning时,我才会从这个索引中受益。你的
WHERE
-语句中的User\u Active-field被索引了吗?有两个想法:1)你可以使用非聚集索引中的WHERE来只为类别1行建立索引;2) 您可以在MSSQL()中使用分区将不同类别的行分隔为不同的文件组,但它需要企业版的MSSQL。阅读更多:您看过过滤索引了吗?您可以在CREATE索引上添加WHERE子句,它将只为b树中的用户_Log=1编制索引。是。过滤索引是我首先想到的。正如我已经说过的,我也尝试了过滤索引,但我也得到了同样的结果(50%)。在我看来,只有当我使用partitioning时,我才会从这个索引中受益。您的WHERE
语句中的User\u Active-field是否已索引?
SELECT User_UID, User_LastAuthentificationDate, Language_ID,User_SecurityString
FROM dbo.UserLog
WHERE User_Active = 1
AND User_UID = '00F5AA38-C288-48C6-8ED1922601819486'
and User_Log = 1