我正在使用JPA 2.1和SQL Server數據庫。下面是表(語法是PostgreSQL的,因爲它是最簡單的的時刻爲我寫):如何在SQL Server中調整或重寫此查詢?
CREATE TABLE users
(
id serial primary key,
locked boolean,
name varchar(20)
);
CREATE TABLE subscriptions
(
id serial,
name varchar(20),
id_user integer references users
);
我要選擇那些沒有訂閱具有特定的所有活動(未鎖定)用戶名稱。用戶可能沒有訂閱,也可能有多個訂閱。
我的JPQL查詢,我目前所面對的SQL版本是
SELECT *
FROM users
WHERE locked = false
AND id NOT IN (SELECT id_user
FROM subscriptions
WHERE name = 'premium')
我讀的地方,一個SQL Server將執行嵌套SELECT對於外部選擇的每一個結果行。即使嵌套SELECT的結果集不會像查詢在這種情況下一樣被執行,這是否正確?
隨着表的增長,此查詢的運行時性能非常糟糕。如何在SQL Server中重寫或優化此查詢?也許使用JOIN?
SQL Server優化器是基於成本的,所以它應該(理論上)爲語義相同的查詢生成最優化的計劃。將主鍵,唯一約束和索引添加到您的問題中。缺乏適當的指標可能會導致性能問題。表格大小導致性能下降的症狀表明全面掃描。 –
「我讀過某處SQL Server將爲外部SELECT的每個結果行執行嵌套SELECT」 - 不正確。它會盡可能地使用基於集合的操作。 –
@SurprisedCoconut您可以發佈樣本數據嗎?雖然上面的評論是正確的,但您也可以用簡單的連接重新編寫它。 – Eli