Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Кога трябва да използвам CROSS APPLY над INNER JOIN?

Някой може ли да ми даде добър пример за това кога CROSS APPLY прави разлика в случаите, когато INNER JOIN също ще работи?

Вижте статията в моя блог за подробно сравнение на производителността:

  • INNER JOIN срещу CROSS APPLY

CROSS APPLY работи по-добре при неща, които нямат просто JOIN състояние.

Този избира 3 последни записи от t2 за всеки запис от t1 :

SELECT  t1.*, t2o.*
FROM    t1
CROSS APPLY
        (
        SELECT  TOP 3 *
        FROM    t2
        WHERE   t2.t1_id = t1.id
        ORDER BY
                t2.rank DESC
        ) t2o

Не може лесно да се формулира с INNER JOIN състояние.

Вероятно бихте могли да направите нещо подобно с помощта на CTE 's и функция прозорец:

WITH    t2o AS
        (
        SELECT  t2.*, ROW_NUMBER() OVER (PARTITION BY t1_id ORDER BY rank) AS rn
        FROM    t2
        )
SELECT  t1.*, t2o.*
FROM    t1
INNER JOIN
        t2o
ON      t2o.t1_id = t1.id
        AND t2o.rn <= 3

, но това е по-малко четливо и вероятно по-малко ефективно.

Актуализация:

Току-що проверено.

master е таблица от около 20,000,000 записва с PRIMARY KEY на id .

Тази заявка:

WITH    q AS
        (
        SELECT  *, ROW_NUMBER() OVER (ORDER BY id) AS rn
        FROM    master
        ),
        t AS 
        (
        SELECT  1 AS id
        UNION ALL
        SELECT  2
        )
SELECT  *
FROM    t
JOIN    q
ON      q.rn <= t.id

работи за почти 30 секунди, докато този:

WITH    t AS 
        (
        SELECT  1 AS id
        UNION ALL
        SELECT  2
        )
SELECT  *
FROM    t
CROSS APPLY
        (
        SELECT  TOP (t.id) m.*
        FROM    master m
        ORDER BY
                id
        ) q

е моментално.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. 2 начина за връщане на всички дефинирани от потребителя функции в база данни на SQL Server

  2. Отменете оптимизатора на заявки за вашите T-SQL присъединявания с FORCEPLAN

  3. SQL Server (TSQL) - Възможно ли е паралелно да се изпълняват оператори EXEC?

  4. Автоматично събиране на данни:файлове с бази данни и логически устройства в MS SQL Server

  5. Как да получите OBJECT_NAME() от различна база данни в SQL Server