Sql server 2008: So minimieren Sie die Ausführungszeit des Store-Vorgangs

Ich habe Sql server-database und meine Tabelle hat 1500000 Zeilen … wegen der großen Menge an dataausführungszeit meines folgenden Verfahrens ist sehr hoch

TABELLE—–

CREATE TABLE [dbo].[MyTable]( [Id] [bigint] IDENTITY(1,1) NOT NULL, [Link] [text] NULL, [Title] [text] NULL, [Duration] [text] NULL, [Image] [text] NULL, [Embbed] [text] NULL, [Keywords] [text] NULL, [Category] [text] NULL, PRIMARY KEY CLUSTERED ( [Id] ASC ) WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY] GO 

VERFAHREN——

 ALTER PROCEDURE [dbo].[Search] @SearchQuery varchar(1000), @Id bigint As BEGIN Select top 100 * from MyTable where Id > @Id and Title like '%'+@SearchQuery+'%' 

Kann mir jemand helfen, wie kann ich die Ausführungszeit der SQL-Abfrage auf der Tabelle von 1500000 Zeilen minimieren?

Sie zwingen einen Tabellenscan durch:

Titel wie '%' + @ SearchQuery + '%'

Eigentlich nein – Sie zwingen definitiv die Nichtnutzung eines Index auf Titel. Als Indizes gehen "von links nach rechts" die "etwas Punkt in der Mitte" Abfrage Sache nur deaktiviert Index verwenden.

wenn die ID viel zu suchen hat – da gehst du, besonders wenn du das mit unangemessen langsamer Hardware kombinierst (nach allem 1,5 Millionen sind kleine data).

Sie werden entweder die erste "%" in der LIKE-statement los – so kann ein Index verwendet werden – oder die Volltextsuche verwenden, die bereits die Worte im Index auftriggers, aber selbst dann bekommst du besser die erste " % ".

Das Problem ist das LIKE in der WHERE Klausel. Sie suchen Text an beliebiger Stelle innerhalb des Feldes, was dazu führt, dass ein eventuell vorhandener Index auf der Title nicht verwendet wird.

Solange du mit LIKE nach Begriffen in der Mitte des Feldes suchen musst ( LIKE '%...' ), gibt es wohl keine Chance, die Abfragelaufzeit zu optimieren.

Was Sie versuchen könnten (obwohl die Abfrage-Engine sollte schlau genug, um das selbst zu tun) ist:

ID > @ID Sie die Einträge mit ID > @ID in eine temporäre Tabelle und wählen Sie mit der LIKE statement die TOP 100 aus dieser Tabelle aus.

Verwenden Sie VARCHAR(MAX) anstelle von TEXT als Feldtypen.

TEXT-Felder werden an einem anderen Ort an den Rest der Tabelle gespeichert, während VARCHAR (MAX) Felder mit den Zeilendaten gespeichert werden und so ist es möglich, Volltextindizes auf Felder dieses Typs anzuwenden.

Posten Sie Ihre Tabellendefinition, das hilft uns, Ihnen zu helfen. Allerdings gibt es ein paar Dinge, die Sie überprüfen können:

  • Stellen Sie sicher, dass Ihre Tabelle einen primary key und einen clustered index . Es ist fast egal was sie definiert sind, solange sie existieren. Ich schlage vor, dass sie auf Id definiert sind, in der Abwesenheit von irgendwelchen anderen Informationen.

  • Müssen Sie wirklich alle Spalten aus dem Tisch zurückgeben? Wenn es viele Spalten gibt und Sie nur ein paar brauchen, dann geben Sie sie explizit an. Dies wird die Größe des Ergebnisses reduzieren.

  • Fragen Sie, ob es wirklich notwendig ist für Benutzer, eine search nach Title . Kannst du weggehen, wenn man mit der search beginnt , dh die erste '%' entfernen? Wenn Sie das tun können, dann wird der Titelfilter SARGable, dh der Abfrageoptimierer wird den Index auf der Titelsäule verwenden, anstatt einen Tabellenscan zu machen. Sie haben einen Index auf Title nicht wahr?

AKTUALISIEREN:

Nachdem ich die Tabellendefinition gesehen habe, merke ich, dass der Title hat. Dies ist sehr langsam, um mit einem Tabellen-Scan zu suchen, da alle data außerhalb der Tabellenzeile gespeichert sind und separat abgerufen werden müssen. Sie können dies beschleunigen, indem Sie es zu einem varchar Typ varchar . Das moderne Äquivalent zum text ist varchar(max) , also versuch das zuerst. Allerdings, da es ein Titel ist, sind Sie sicher, dass Sie wirklich brauchen 2 GB Wert character in der Spalte? Die meisten Titel der Dinge sind höchstens maximal 100 character. Versuchen Sie, die Länge aller Ihrer Titel zu messen und sehen Sie, ob Sie die Länge der Spalte auf etwas vernünftiger reduzieren können.

In der Tat, mit Blick auf die Namen aller Ihrer Spalten, kann ich nichts dort sehen, dass die Verwendung von text rechtfertigt. Auch Link , den ich varchar(1023) , ist eine URL, braucht nicht mehr als varchar(1023) .

Dieser noch offen? Nachdem Sie die Textfelder in varchar geändert haben und eine Set-rowcount-statement hinzugefügt haben, dann haben Sie alles getan, was Sie in SQL machen können, wenn Sie die führende Wild Card-functionalität behalten müssen. Ich mache diese Art von Ding regelmäßig ohne Performance-Probleme, so dass Ihr nächster Schritt ist: Hardware-Upgrade.

Ich würde deine LIKE statement zu einem CharIndex da andere gesagt haben, dass der LIKE einen vollständigen Scan der Tabelle verursacht.

http://msdn.microsoft.com/en-us/library/ms186323.aspx zeigen Ihnen, wie Sie den CHARINDEX