Sql-Server

Sql Server 中的性能問題

  • January 18, 2017

我有一個主產品表,如下所示:

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) $$通常應該以這樣一種方式選擇,即最有選擇性的一個首先出現(基本上:具有更多不同值的那個,首先)。 如果您碰巧有大量使用brandcolour brand查詢,colour那麼您應該至少有兩個第一個索引;如果您需要盡可能快的速度,請為(品牌、顏色)設置一個索引,為(顏色)設置另一個索引。(品牌)不需要專門的索引,(品牌,顏色)適合尋找brands。


[product_code]將由數據庫自動索引以對其強制執行UNIQUE約束。請參閱創建唯一約束唯一約束和唯一索引。即使query_2很頻繁,您也不需要顯式創建索引。

引用自:https://dba.stackexchange.com/questions/161420