Sql-server-Abfrage mit vielen Teilstrings performance

Ich habe die Prozedur gespeichert, in der ich einen Bulk-deployment in eine Temp-Tabelle ausführe und Substring auf seinem Feld ausführe, um die für die Haupttabelle benötigte Zeile zu erhalten. Das Nein. der Säulen für den Haupttisch ist 66 und die Zeile nach jedem Lauf der sp ist ca. 5500. Code für Schüttguteinsatz Teil:

CREATE TABLE [dbo].[#TestData] ( logdate DATETIME, id CHAR(15), value VARCHAR(max) ) BEGIN TRANSACTION DECLARE @sql VARCHAR(max) SET @sql = 'BULK INSERT [dbo].[#TestData] FROM ''' + @pfile + ''' WITH ( firstrow = 2, fieldterminator = ''\t'', rowterminator = ''\n'' )' EXEC(@sql) IF (@@ERROR <> 0) BEGIN ROLLBACK TRANSACTION RETURN 1 END COMMIT TRANSACTION 

Code für Teilstring Teil:

 CASE WHEN (PATINDEX('%status="%', value) > 0) THEN (nullif(SUBSTRING(value, (PATINDEX('%status="%', value) + 8), (CHARINDEX('"', value, (PATINDEX('%status="%', value) + 8)) - (PATINDEX('%status="%', value) + 8))), '')) ELSE NULL END, 

Dieser Substring-Code wird beim Einfügen verwendet und ist für alle 66 Spalten ähnlich. Es dauert etwa 20-25 sec für die sp zu laufen. Ich habe versucht, Indexierung auf Temp-Tabelle, Drop-Fremdschlüssel, sank alle Indizes, Drop-Primärschlüssel, aber immer noch dauert es die gleiche time. Also meine Frage ist, kann die performance verbessert werden?

Bearbeiten: Die Anwendung für die interface ist visuell foxpro 6.0. Als SQL server ist langsam mit String Manipulation und alle String Manipulationen auf Foxpro jetzt. Neu bei foxpro Irgendwelche Vorschläge, wie man null von foxpro zu sqlserver sendet? Niemals mit null in foxpro 6.0 gearbeitet.

Da Sie die Features von PATINDEX() hier nicht wirklich nutzen können, können Sie stattdessen die Verwendung von CHARINDEX() , die trotz ihres Namens auf Strings und nicht nur auf character wirkt. CHARINDEX() kann sich als schneller als PATINDEX() erweisen, da es eine etwas einfachere function ist.

Indizes werden Ihnen bei diesen String-Operationen nicht helfen, da Sie nicht nach Präfixen von Strings suchen.

Sie sollten unbedingt Optionen sehen, um die übermäßige Verwendung von PATINDEX() oder CHARINDEX() innerhalb der statement zu vermeiden. Es gibt bis zu 4 (!) Aufrufe davon in Ihrem CASE für jede Ihrer 66 Spalten in jedem Rekord verarbeitet.

Dazu möchten Sie vielleicht die String-Operationen in mehrere statementen aufteilen, um die Werte für den Start- und Endindex des interessierenden Substrings vorzurechnen

 UPDATE temptable SET value_start_index = CHARINDEX('status="', value) + 8 UPDATE temptable SET value_end_index = CHARINDEX('"', value, value_start_index) WHERE value_start_index >= 8 UPDATE temptable SET value_str = SUBSTRING(value, value_start_index, value_end_index - value_start_index) WHERE value_end_index IS NOT NULL 

SQL server ist ziemlich langsam im Umgang mit Strings. Für diese Anzahl von Ausführungen wäre es am besten, SQL CLR benutzerdefinierte function zu verwenden. Es gibt nicht viel mehr können Sie darüber hinaus tun.