Как найти, какой SQL Query является лучшим в ниже Query.? - PullRequest
0 голосов
/ 12 марта 2020

Для выбора только дубликаты строк.

CREATE TABLE #JEBIN(ID INT, SAL INT)
INSERT INTO #JEBIN (ID,SAL) VALUES (1,10),(2,30),(2,30),(4,40),(5,60),(5,70)
SELECT * FROM #JEBIN

Первый запрос с использованием CTE

;WITH CTE As
(
   SELECT ID,ROW_NUMBER() OVER(Partition By SAL  Order By ID Desc)as cosal,sal FROM #JEBIN
)
SELECT * from CTE where cosal>1

Второй запрос использует агрегатные функции

SELECT ID,SAL FROM #JEBIN GROUP BY ID,SAL HAVING (COUNT(id)>1)

Как настроить производительность выше двух запросов .?

Использует SQL План выполнения. Но не в курсе об этом. Но оба запроса стоят одинаково?

Ответы [ 4 ]

1 голос
/ 12 марта 2020

Один из самых распространенных способов быстрого сравнения производительности двух запросов на SQL Server - это включение STATISTICS для ваших сеансов. Есть два, которые имеют тенденцию быть наиболее информативными; SET STATISTICS TIME ON|OFF и SET STATISTICS IO ON|OFF.

Вы можете активировать обе строки кода над запросом или запросами.

SET STATISTICS TIME, IO ON;

После блока кода я обычно выключаю их.

SET STATISTICS TIME, IO OFF;

Информация из этого будет напечатана на вкладке MESSAGES окна вашего запроса. Чтобы их было легче читать, вы можете перенести их на Ritch ie Удобный Rump Анализатор статистики page.

0 голосов
/ 12 марта 2020

Часто самым быстрым является коррелированный подзапрос с правильным индексом:

select j.*
from #jebin j
where exists (select 1
              from #jebin j2
              where j2.sal = j.sal and j2.id <> j.id
             );

Требуется индекс для (sal, id).

0 голосов
/ 12 марта 2020

Пожалуйста, добавьте "объяснение" перед вашим запросом

Ex-объяснение выберите * из имени таблицы

результат запроса -

+----+-------------+---------------+-------+---------------+---------+---------+-------+------+-------+

| id | select_type | table         | type  | **possible_keys | key**     | key_len | ref   | **rows** | Extra |
+----+-------------+---------------+-------+---------------+---------+---------+-------+------+-------+

|  1 | SIMPLE      | merchant_link | const | PRIMARY       | PRIMARY | 8       | const |    1 | NULL  |
+----+-------------+---------------+-------+---------------+---------+---------+

Если номер строки в объяснении запрос меньше, значит быстрее. Кроме того, вы получите информацию о том, какой ключ выбран

0 голосов
/ 12 марта 2020

Первый запрос с использованием CTE

Сканирует всю таблицу, сортирует (EXPENSIVE), присваивает row_number, сканирует еще раз, чтобы сравнить row_number с 1.

Второй запрос использует GROUP BY

Он сканирует всю таблицу с учетом агрегации, сравните счет

Второй запрос выполняется быстрее, если ваша таблица не проиндексирована. Сортировка в первом запросе действительно дорогая.

Первый запрос выводит дублирующие строки, сколько раз они дублируются. Но неважно, это легко выровнять, добавив отличительные в качестве последнего шага.

...