我已经在下面创建了过滤索引,但是当我进一步运行 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
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 使用索引?
一位同事告诉我,连接到数据库的成本很高,而且可能会损害应用程序的性能。他们让我创建一个调用另外 8 个过程的过程,这样他们调用一个过程并取回 8 个数据集。从我的角度来看,SQL 必须等待每个数据集返回,然后才能开始检索下一个数据集,这样也会产生负面影响。
任何人都可以量化应用程序的连接成本,并让我知道最好的方法是调用多个过程还是一个主过程?
performance sql-server-2008 sql-server connection-pooling connections