Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 关于sql server索引性能的建议_Sql Server_Performance_Indexing - Fatal编程技术网

Sql server 关于sql server索引性能的建议

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”的原因,该字

我有一个包含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)

我要优化的选择状态是:

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