2017-07-30 47 views
0

我有這個疑問:的SQL Server索引 - 想法?

SELECT 
    c.violatorname 
FROM 
    dbo.crimecases AS c, 
    dbo.people AS p 
WHERE 
    REPLACE(c.violatorname, ' ', '') = CONCAT(CONCAT(CONCAT(p.firstname, p.secondname), p.thirdname), p.lastname); 

查詢是很慢的,我需要與替換功能violatorname列上創建索引。有任何想法嗎?

+1

[不良習慣踢:使用舊樣式的JOIN(http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/08 /bad-habits-to-kick-using-old-style-joins.aspx) - 舊樣式* *風格是與*適當* ANSI'JOIN'語法在ANSI-更換表的逗號分隔的列表* * 92 ** SQL標準(**25年**前)和不鼓勵使用 –

+0

查詢是緩慢的,因爲你正在使用你的謂詞的功能。這不允許SQL使用這些統計信息來創建一個好的計劃。它可以掃描每一行,以找出替換的值是該列以及等號的另一邊的CONCAT。按照建議與計算列一起去。 –

回答

1

我建議你添加computed columns上,然後創建index

ALTER TABLE crimecases 
    ADD violatornameProcessed AS Replace(violatorname, ' ', '') PERSISTED 

ALTER TABLE people 
    ADD fullName AS Concat(firstname, secondname, thirdname, lastname) PERSISTED 

Persisted將計算的數據存儲在磁盤上,而不是每次計算。現在在它上面創建索引。

CREATE INDEX Nix_crimecases_violatornameProcessed 
    ON crimecases (violatornameProcessed) 
    include (violatorname) 

CREATE INDEX Nix_people_fullName 
    ON people (fullName) 

查詢可以這樣寫

SELECT c.violatorname 
FROM dbo.crimecases AS c 
     INNER JOIN dbo.people AS p 
       ON c.violatornameProcessed = p.fullName