Sql-Server
Sql Server 中的性能問題
我有一個主產品表,如下所示:
CREATE TABLE dbo.[products]( [id] INT NOT NULL IDENTITY(1, 1), [product_code] VARCHAR(100) NOT NULL UNIQUE, [price] FLOAT NOT NULL, [brand] VARCHAR(100) NOT NULL, [colour] VARCHAR(100) NOT NULL );
因此,如果我創建此表,
clustered index
將在id
列和列non-clustered index
上創建一個product_code
。我在網站上使用這張表來展示產品。我將使用如下的 sql 查詢。
查詢 1
SELECT * FROM dbo.[products] WHERE [brand] IN ('brand1', 'brand2', 'brand3', 'brand4', 'brand5') AND [colour] IN ('colour1', 'colour1', 'colour1') ORDER BY [product_code];
還有另一個選項可以搜尋大量 product_code,如下所示。
查詢 2
SELECT * FROM dbo.[products] WHERE [product_code] IN ('product_code1', 'product_code2', 'product_code3');
查詢 1 中的條件可以更多,查詢 2 中的產品程式碼可以更多。
我是否正確創建了索引?
或者有沒有更好的方法來提高性能?
簡短回答:不,您需要更多索引。
如果您要創建大量涉及
[brand]
and的查詢[colour]
,您應該索引這兩列:CREATE INDEX products_colour_idx ON dbo.products (colour); CREATE INDEX products_brand_idx ON dbo.products (brand);
如果您主要使用兩列進行查詢,並且沒有涉及
colour
不涉及 a 的查詢,則brand
多列索引會更好,因為僅使用一個索引,數據庫就可以檢索所有相關行。你可以這樣創建它:CREATE INDEX products_brand_colours_idx ON dbo.products (brand, colour);
列的順序
$$ (brand, colour) vs. (colour, brand) $$通常應該以這樣一種方式選擇,即最有選擇性的一個首先出現(基本上:具有更多不同值的那個,首先)。 如果您碰巧有大量使用
brand
、colour
和的brand
查詢,colour
那麼您應該至少有兩個第一個索引;如果您需要盡可能快的速度,請為(品牌、顏色)設置一個索引,為(顏色)設置另一個索引。(品牌)不需要專門的索引,(品牌,顏色)適合尋找brand
s。
[product_code]
將由數據庫自動索引以對其強制執行UNIQUE
約束。請參閱創建唯一約束和唯一約束和唯一索引。即使query_2很頻繁,您也不需要顯式創建索引。