小编chr*_*ris的帖子

过滤索引仅在过滤部分在 JOIN 而不是 WHERE 时使用

我已经在下面创建了过滤索引,但是当我进一步运行 2 个查询时,该索引仅用于第一个示例中的查找,该示例在 JOIN 中有 END_DTTM 而不是 where 子句(这是查询中的唯一区别) . 任何人都可以解释为什么会发生这种情况?

索引创建

CREATE NONCLUSTERED INDEX [ix_PATIENT_LIST_BESPOKE_LIST_ID_includes] ON [dbo].[PATIENT_LIST_BESPOKE] 
(
    [LIST_ID] ASC,
    [END_DTTM] ASC
)
WHERE ([END_DTTM] IS NULL)
Run Code Online (Sandbox Code Playgroud)

查询

DECLARE @LIST_ID INT = 3655

--This one seeks on the index

SELECT  
    PATIENT_LISTS.LIST_ID
FROM    
    DBO.PATIENT_LISTS
    LEFT JOIN DBO.PATIENT_LIST_BESPOKE ON PATIENT_LISTS.LIST_ID = PATIENT_LIST_BESPOKE.LIST_ID  
                                      AND PATIENT_LIST_BESPOKE.END_DTTM IS NULL
WHERE
    PATIENT_LISTS.LIST_ID = @LIST_ID

--This one scans on the index

SELECT  
    PATIENT_LISTS.LIST_ID
FROM    
    DBO.PATIENT_LISTS
    LEFT JOIN DBO.PATIENT_LIST_BESPOKE ON PATIENT_LISTS.LIST_ID = PATIENT_LIST_BESPOKE.LIST_ID  
WHERE   
    PATIENT_LISTS.LIST_ID = @LIST_ID …
Run Code Online (Sandbox Code Playgroud)

performance index sql-server t-sql filtered-index query-performance

10
推荐指数
2
解决办法
2759
查看次数

为什么此查询不使用 SURNAME 上存在的索引?

PATIENTS 表中的 SURNAME 上有一个索引,我们运行以下查询但该索引没有被使用。

DECLARE @SURNAME VARCHAR(30) = 'test'

SELECT SURNAME 
FROM PATIENTS AS PAT
WHERE (PAT.SURNAME LIKE @SURNAME + '%' OR @SURNAME IS NULL)
Run Code Online (Sandbox Code Playgroud)

这似乎是因为我们检查变量是否NULL就像我删除了它然后我得到了一个常量扫描、计算标量、索引查找和嵌套循环。

我们需要检查参数是否NULL为我们然后在 where 子句中忽略它。

有没有办法做到这一点并让 SQL 使用索引?

t-sql

5
推荐指数
1
解决办法
188
查看次数

从性能的角度来看,来自应用程序的数据库连接是否昂贵?

一位同事告诉我,连接到数据库的成本很高,而且可能会损害应用程序的性能。他们让我创建一个调用另外 8 个过程的过程,这样他们调用一个过程并取回 8 个数据集。从我的角度来看,SQL 必须等待每个数据集返回,然后才能开始检索下一个数据集,这样也会产生负面影响。

任何人都可以量化应用程序的连接成本,并让我知道最好的方法是调用多个过程还是一个主过程?

performance sql-server-2008 sql-server connection-pooling connections

4
推荐指数
1
解决办法
967
查看次数