Как оптимизировать получение подсчета результатов, когда мне просто нужно знать, если их больше 1? - PullRequest
0 голосов
/ 03 июля 2019

У меня есть процесс, который должен знать, есть ли ровно 1 совпадение с различными критериями в таблице. Я могу получить счет с помощью простого запроса, но я ожидаю, что смогу оптимизировать его, так как мне все равно, есть ли 2 совпадения или 2000 совпадений. Как только я узнаю, что у меня больше 1, запрос может остановиться.

«TOP 2» не будет работать с «COUNT», поскольку он возвращает только 1 результат, независимо от того, сколько он насчитал. У меня нет запрашиваемых индексов в таблице (и я тоже не могу это контролировать), поэтому я не ожидаю, что смогу добиться лучших результатов с помощью циклов и курсоров. Подзапрос также может выполнить как минимум 1 полный запрос. У меня закончились варианты? Стоит ли изучать пользовательские агрегатные функции?


--Just a generic example. Only interested in knowing if @NumPerson = 1
DECLARE @NumPerson int
SELECT @NumPerson = COUNT(id) FROM Person 
WHERE vchLastName = <Last Name,varchar,> 
AND vchFirstName = <First Name,varchar,>

Я не ожидаю значительного увеличения, но мы используем запрос достаточно, я хочу убедиться, что он набран.

1 Ответ

0 голосов
/ 03 июля 2019

Это будет работать - не уверен насчет производительности оконных функций:

; с cte as (

SELECT COUNT (id) over (разбиение по порядку идентификаторов по id)как cnt, id

FROM Person

) выберите * из cte, где cnt = 1

...