У меня есть запрос, где я пытаюсь подсчитать количество звонков, сделанных каждым сотрудником. Однако имя Employee не входит в таблицу Call, поэтому мне пришлось использовать Inner Join. Вот что я до сих пор. Я использую SQL Server 2008 R2Подсчет записей с помощью Inner Join
Select e.Name, count(1)
From Employees e INNER JOIN Calls c on c.EmployeeID = e.TechID
Where(c.Name LIKE 'John ') OR
(c.Name LIKE 'Sam ') OR
(c.Name LIKE 'Bob ') OR
(c.Name LIKE 'Mark') OR
(c.Name LIKE 'Mike')
Group By e.Name
По существу я ищу две колонки, имя сотрудника и количество вызовов, которые они сделали.
Запрос будет выполняться, но он длится очень долго, пока я, наконец, не убью его. Есть лучший способ сделать это?
Что сказать план выполнения? Какие СУБД вы используете (Postgres, Oracle, Firebird, ...) –
Я использую Sql Server 2008 r2 – user3272370
Необходимость выполнить соединение перед поиском всегда является убийцей производительности, особенно ваша таблица «звонков» звучит как миллион записей строк. Вероятно, одним из способов ускорения работы является создание индекса в столбце имени сотрудника, получение всех идентификаторов сотрудников, которые называют LIKE John, Sam, Bob и т. Д., А затем использовать эту группу идентификаторов для выбора таблицы вызовов без необходимости присоединяться. – gerrytan