0

私は本のオンライン販売ウェブサイトを持っています、システムには、と呼ばれるテーブルがあり、Order以下のようないくつかの列があります:

OrderID int (Primary key),
Library_ID int,
Mode int,
BookId int,
Ext_User_ID varchar(2000),
Activated varchar(1),
RequiredDate datetime,
AmountBuy int,
APPROVAL_DATE datetime,
...

したがって、テーブルには700万を超える行があり、現在、Webページにクエリ条件を追加する作業を行っています。SQLスクリプトは次のようになります。

SELECT * FROM Book b, Library l, [Order] o 
WHERE o.bookid = b.bookID 
AND o.mode = 'A' 
AND o.library_ID = l.library_ID 
AND l.library_ID > 19 
AND b.publisher_id  > 1000 
AND b.print_id > 800 
AND NOT EXISTS (SELECT * FROM ExtBOOK WHERE b.bookid = extbookid AND library_ID = l.library_ID) 
AND o.activated = 'Y' 
AND b.eisbn13 LIKE '978%' 
AND len(o.ext_user_id) > 3 
AND b.bookid > 200000 
AND b.bookid in (SELECT bookid FROM category WHERE categoryid  > 2) 
ORDER BY o.orderid DESC

このスクリプトには、考えられるすべてのクエリ条件が含まれている可能性があります。「含まれる実際の実行プラン」をオンにしてManagement Studioで実行した後、推奨事項では、Orderテーブルにインデックスを作成する必要があると述べています。

CREATE NONCLUSTERED INDEX [<Name of Missing Index, sysname,>]
ON [dbo].[Order] ([MODE],[ACTIVATED],[LIBRARY_ID],[BOOKID])
INCLUDE ([OrderID],[EXT_USER_ID],[APPROVAL_DATE])

ただし、インデックスを作成しようとすると、すでにそこにある他の3つのインデックスが見つかりました。それらは次のとおりです。

create nonclustered index IDX_Order_1 { MODE asc}
create nonclustered index IDX_Order_2 { Library_ID asc, EXT_USER_ID asc, BookID asc}
create nonclustered index IDX_Order_3 { BOOKID asc, Library_id asc, MODE asc }

上記の3つのインデックスが作成されました。インデックスを作成したい場合、重複を感じたということですが、それらをマージできますか?または、各インデックスは特定のクエリ用であり、テーブルが毎日増加しているため、クエリ以外でどのアプリまたはどのSQLスクリプトを使用しているかを確認できません。何か案が?

4

1 に答える 1

0

インデックスがどのように機能するかについて読んでおくことをお勧めします。

このリンクはあなたに基本を与えるでしょう。

http://www.simple-talk.com/sql/learn-sql-server/sql-server-index-basics/

しかし、あなたの質問に答えるには、頻繁に使用される列にインデックスを作成する必要があります。つまり、BookID、LibraryID、およびModeでインデックスを作成する場合、このインデックスは3つの列すべてを使用し、where句がこれらの3つの列を調べるときに役立ちます。そのインデックスを持っていて、LibraryIDだけを検索することは、私が理解している限りでは役に立ちません。

基本的に、テーブルで実行しているクエリを確認し、使用されている列を特定してから、最も頻繁に使用される列にインデックスを付けます。ただし、データベースの速度が低下するため、インデックスの作成に注意してください。

于 2012-06-21T09:09:43.267 に答える