[爆卦]Nvarchar是什麼?優點缺點精華區懶人包

雖然這篇Nvarchar鄉民發文沒有被收入到精華區:在Nvarchar這個話題中,我們另外找到其它相關的精選爆讚文章

在 nvarchar產品中有2篇Facebook貼文,粉絲數超過1,145的網紅軟體廚房,也在其Facebook貼文中提到, 在 SQL Server 中無論是在 WHERE 或是 JOIN ON 用來做為條件的參數「型態」,最好要一模一樣,今天早上就遇到了一個跑到不良執行計劃的案例。 Y.ID 跟 nrs.NxxxId,一個是 INT,一個 BIGINT,當我不針對 Y.ID 強制轉型為 BIGINT 時,可以看到它實...

 同時也有10000部Youtube影片,追蹤數超過2,910的網紅コバにゃんチャンネル,也在其Youtube影片中提到,...

  • nvarchar 在 軟體廚房 Facebook 的最佳解答

    2020-07-02 10:38:16
    有 26 人按讚

    在 SQL Server 中無論是在 WHERE 或是 JOIN ON 用來做為條件的參數「型態」,最好要一模一樣,今天早上就遇到了一個跑到不良執行計劃的案例。

    Y.ID 跟 nrs.NxxxId,一個是 INT,一個 BIGINT,當我不針對 Y.ID 強制轉型為 BIGINT 時,可以看到它實際資料列數目高達 281114202 筆,比我家電話號碼還長,把 Y.ID 強制轉型為 BIGINT 之後,實際資料列數目降到 84027。

    總結來說,SQL Server 的資料欄位型態是需要嚴謹的定義,不能把可以相容的兩種欄位型態看成是一樣的,像是 varchar、nvarchar 也很容易被當成是同種類的型態拿來做條件比較,執行計劃產生器可不這樣認為,所以拿來當成條件的欄位型態最好一定要一模一樣。

    最後附上 varchar、nvarchar 的案例:https://dotblogs.com.tw/supershowwei/2019/08/12/232213

  • nvarchar 在 91 敏捷開發之路 Facebook 的最佳貼文

    2017-12-24 11:50:10
    有 52 人按讚


    有在使用 MS SQL server 的朋友,如果有需要找到 identity 跳號的資料,可以參考一下新的寫法,查詢成本省很大。

    #長知識

    【SQL Tips】之【了解為何identity會發生不連續號碼與快速找出那些號碼是跳號】20171224

    **identity保證唯一,不保證連續**
    **使用SARG規則與SET BASED方式找出不連續號碼**
    **最後那三種找出不連續的技巧,成本比如下
    50%(SELF JOIN搭配NOT IN) : 32%(SELF JOIN搭配 OFFSET 函數) : 18%(LAG 函數) **

    許多SQL Server開發人員經常會使用identity自動產生連續編號,然而該identity卻有一個特質是發生交易退回(rollback)則會產生跳號的狀況,以下的狀況就是identity碰到交易退回後所產生的跳號情況。

    ***
    use tempdb
    go

    if object_id('tblNum') is not null
    drop table tblNum
    go

    create table tblNum
    (c1 int identity ,
    c2 nvarchar(30) unique --防止重複
    )
    go

    insert into tblNum(c2) values ('lewis1')
    insert into tblNum(c2) values ('lewis2')
    insert into tblNum(c2) values ('lewis3')
    insert into tblNum(c2) values ('lewis3') --重複姓名就發生跳號
    insert into tblNum(c2) values ('lewis5')
    insert into tblNum(c2) values ('lewis5') --重複姓名就發生跳號
    insert into tblNum(c2) values ('lewis5') --重複姓名就發生跳號
    insert into tblNum(c2) values ('lewis8')
    insert into tblNum(c2) values ('lewis9')
    insert into tblNum(c2) values ('lewis10')
    go

    select * from tblNum
    GO

    --結果
    c1 c2
    1 lewis1
    2 lewis2
    3 lewis3
    5 lewis5 <--發生跳號
    8 lewis8 <--發生跳號
    9 lewis9
    10 lewis10
    ***

    基本上單一執行INSERT UPDATE DELETE 就是一種隱性交易,上述的範例就是因為條件約束(constraint)的unique緣故,當輸入的文字發生重複的時候,就會自動退回交易,緊接著identity也隨之發生跳號的狀況。

    當瞭解identity會有發生跳號的特質之後,接下來分享三種從SQL Server 2005開始使用的抓取跳號的範例,以及從SQL Server 2012開始支援的Windows Offset函數抓取跳號的技巧。這三種技巧都是使用set-based的方式,不使用WHILE迴圈去比對資料的連續性,值得一試。

    **從SQL Server 2005支援的抓取跳號的技巧
    --使用自我查詢產生搭配CTE
    --使用SET BASED技巧取代迴圈處理

    WITH DS AS (
    SELECT DS1.* FROM tblNum as DS1 JOIN
    tblNum as DS2
    on DS1.c1 = DS2.c1+1 )
    SELECT * FROM tblNum
    WHERE c1 NOT IN (SELECT TOP(1) c1 FROM tblNum ORDER BY c1)
    EXCEPT
    SELECT * FROM DS
    GO

    **從SQL Server 2012支援的抓取跳號的技巧
    --使用自我查詢產生搭配OFFSET
    --使用SET BASED技巧取代迴圈處理
    WITH DS AS (
    SELECT DS1.* FROM tblNum as DS1 JOIN
    tblNum as DS2
    on DS1.c1 = DS2.c1+1 ),
    DS2 AS (SELECT * FROM tblNum ORDER BY 1 OFFSET 1 ROW )
    SELECT * FROM DS2
    EXCEPT
    SELECT * FROM DS
    GO

    **從SQL Server 2012支援的抓取跳號的技巧
    --使用自我查詢產生搭配LAG的Windows Offset技巧
    --使用SET BASED技巧取代迴圈處理
    WITH DIFF AS (
    select *,LAG(c1, 1,0) OVER ( ORDER BY c1) as previous
    ,c1 - LAG(c1, 1,0) OVER ( ORDER BY c1) as diff
    from tblNum
    )
    SELECT c1,c2 FROM DIFF WHERE diff>1
    GO

    --結果就是 5/8 之前就發生跳號
    c1 c2
    5 lewis5
    8 lewis8

    最後那三種找出不連續的技巧,成本比如下
    50%(SELF JOIN搭配NOT IN) : 32%(SELF JOIN搭配 OFFSET) : 18%(LAG)

  • nvarchar 在 コバにゃんチャンネル Youtube 的最讚貼文

    2021-10-01 13:19:08

  • nvarchar 在 大象中醫 Youtube 的精選貼文

    2021-10-01 13:10:45

  • nvarchar 在 大象中醫 Youtube 的最佳貼文

    2021-10-01 13:09:56

你可能也想看看

搜尋相關網站