[英]Fastest way to return a primary key value SQL Server 2005
我有一個兩列表,主鍵(int)和唯一值(nvarchar(255))
當我向該表插入一個值時,我可以使用Scope_identity()返回剛剛插入的值的主鍵。 但是,如果值已經存在,我必須執行另外的選擇以返回主鍵以進行后續操作(將該主鍵插入第二個表)
我認為必須有一個更好的方法來做到這一點 - 我考慮使用覆蓋索引,但表只有兩列,我讀到的覆蓋索引的大部分內容表明它們只有在表明顯大於索引的情況下才有用。
有沒有更快的方法來做到這一點? 覆蓋的索引是否會更快,即使它與表的大小相同?
構建索引不會獲得任何東西,因為您已經將值列創建為唯一(在后台構建索引)。 實際上,全表掃描與您的方案中的索引掃描沒有什么不同。
我假設你想要有一種插入 - 如果不是已存在的行為。 沒有辦法繞過第二個選擇
if not exists (select ID from where name = @...)
insert into ...
select SCOPE_IDENTITY()
else
(select ID from where name = @...)
如果該值恰好存在,則查詢通常會被緩存,因此第二個ID select的性能不會受到影響。
為第二個條目創建唯一索引,然后:
if not exists (select null from ...)
insert into ...
else
select x from ...
你無法擺脫索引,並沒有太大的開銷 - SQL服務器支持最多900字節的索引列,並且沒有區別對待。
模型的需求比任何感知的性能問題更重要,象征字符串(這是你正在做的)是減少數據庫大小的常用方法,這間接(通常)意味着更好的性能。
- 編輯 -
安撫蒂莫西:
declare @x int = select x from ...
if (@x is not null)
return x
else
...
[Update statment here]
IF (@@ROWCOUNT = 0)
BEGIN
[Insert statment here]
SELECT Scope_Identity()
END
ELSE
BEGIN
[SELECT id statment here]
END
我不知道性能,但它沒有很大的開銷
正如已經提到的,這實際上不應該是一個緩慢的操作,特別是如果你索引兩個列。 但是,如果您決定減少此操作的費用,那么我認為沒有理由不能完全刪除表,只是直接使用唯一值而不是在此表中查找它。 像這樣的1-1映射(理論上)是多余的。 我在理論上說,因為使用nvarchar而不是int可能會影響性能。
我會發布這個答案,因為其他人似乎都說你必須在記錄存在的情況下兩次查詢表...那不是真的。
步驟1)在另一列上創建唯一索引:
我推薦這個作為索引:
- 我們包含“ID”列,以便在“WHERE”子句完成后SQL不必查看。
CREATE INDEX MyLilIndex ON dbo.MyTable (Column2) INCLUDE (ID)
第2步)
DECLARE @TheID INT
SELECT @TheID = ID from MyTable WHERE Column2 = 'blah blah'
IF (@TheID IS NOT NULL)
BEGIN
-- See, you don't have to query the table twice!
SELECT @TheID AS TheIDYouWanted
END
ELSE
INSERT...
SELECT SCOPE_IDENTITY() AS TheIDYouWanted
您可以使用OUTPUT子句在同一語句中返回值。 這是一個例子。
DDL:
CREATE TABLE ##t (
id int PRIMARY KEY IDENTITY(1,1),
val varchar(255) NOT NULL
)
GO
-- no need for INCLUDE as PK column is always included in the index
CREATE UNIQUE INDEX AK_t_val ON ##t (val)
DML:
DECLARE @id int, @val varchar(255)
SET @val = 'test' -- or whatever you need here
SELECT @id = id FROM ##t WHERE val = @val
IF (@id IS NULL)
BEGIN
DECLARE @new TABLE (id int)
INSERT INTO ##t (val)
OUTPUT inserted.id INTO @new -- put new ID into table variable immediately
VALUES (@val)
SELECT @id = id FROM @new
END
PRINT @id
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.