sqlschool.gr logo


Articles of SQLschool.gr Team

Count words in a string variable or table column

Antonios Chatzipavlis
Friday 15 May 2020

The Case

Πρόσφατα χρειάστηκε να βοηθήσω ένα πελάτη που αντιμετώπιζε ένα πρόβλημα απόδοσης σε ένα query του.

Το συγκεκριμένο query διάβαζε δεδομένα από ένα πίνακα που είχε αρκετές εγγραφές και οι indexes που υπήρχαν χρησιμοποιούταν ιδανικά.

Το πρόβλημα στο query αυτό ήταν ότι χρησιμοποιούσε μια UDF που υπολόγιζε τον αριθμό των λέξεων που είχε μια κολώνα NVARCHAR(MAX).

Βλέποντας την συγκεκριμένη UDF αναρωτήθηκα για ποιο λόγο επιλέχθηκε η υλοποίηση αυτή. Σε σχετική ερώτηση μου, η απάντηση ήταν ότι βρήκαν και αντέγραψαν αυτή από γνωστό site που παρέχει τέτοιες λύσεις και που οι περισσότεροι χρησιμοποιούν για να γράψουν κώδικα.

Δεν θα δείξω την υλοποίηση της συγκεκριμένης UDF, απλά θα πω ότι έκανε loop διαβάζοντας χαρακτήρα-χαρακτήρα και ελέγχοντας το κενό, την τελεία, το κόμμα και κάποια ακόμα για να αποφανθεί ότι έχει διαβάσει μια λέξη. Σε πολύ μεγάλα strings η διαδικασία είναι αργή, και αυτή επιβάρυνε την απόδοση.

My impementation

Αλλάζοντας το κώδικα της συγκεκριμένης UDF όπως παρακάτω το αποτέλεσμα στην απόδοση του συγκεκριμένου query ήταν θεαματικό.

SQL Script

CREATE FUNCTION dbo.fnStringWordCount (@string NVARCHAR(MAX))
    DECLARE @strlen INT = 0;
    SET @string = REPLACE(@string,CHAR(10),' ');
    SET @string = REPLACE(@string,CHAR(13),' ');
    SET @string = REPLACE(@string,'     ',' '); -- 5 spaces
    SET @string = REPLACE(@string,'    ',' '); -- 4 spaces
    SET @string = REPLACE(@string,'   ',' '); -- 3 spaces
    SET @string = REPLACE(@string,'  ',' '); -- 2 spaces
    SET @strlen = LEN(@string)
    SET @string = REPLACE(@string,' ',''); -- 1 spaces
    RETURN (@strlen-LEN(@string))+1

Επέλεξα την καθαρότητα της ανάγνωσης του κώδικα για αυτό τον έγραψα με αυτό τον τρόπο. Έτσι και αλλιώς δεν υπάρχει διαφορά στην απόδοση του αν όλα τα REPLACE ήταν στην ίδια γράμμη.

How it works

Η συγκεκριμένη λύση χρησιμοποιεί απλή λογική η οποία λέει ότι μεταξύ των λέξεων υπάρχει πάντα ένας κενός χαρακτήρας.

Αυτό σημαίνει ότι αν από το αρχικό string length αφαιρέσω το string length που θα έχει μείνει αφού αφαιρέσω τον κενό χαρακτήρα έχω πρακτικά τον αριθμό των λέξεων.

Επειδή όμως χάνεται η τελευταία λέξη που δεν έχει κενό στο τέλος της πρέπει να προστεθεί +1 στο τελικό αποτέλεσμα.

Για να διασφαλίσω το ότι θα έχω πάντα ένα κενό χαρακτήρα ανάμεσα στις λέξεις πριν υπολογιστεί το αρχικό string length αφαιρώ τα CRLF και την τυχόν ύπαρξη περισσότερων κενών χαρακτήρων.

Τα υπόλοιπα τα βλέπετε στον κώδικα παραπάνω και το παράδειγμα κλήσης της UDF παρακάτω.

Execution Examaple

SELECT [ProductReviewID]
      ,dbo.fnStringWordCount (Comments) as WordCount
FROM [AdventureWorks].[Production].[ProductReview];

//Antonios Chatzipavlis

Antonios Chatzipavlis

Antonios Chatzipavlis

Antonios is a Data Solutions Consultant and Trainer. He has been working in IT since 1988. In his career, he has worked as senior developer, IT Manager, Solutions Architect and IT Consultant. Since 1995 he has been devoted on new technologies and software development tools, mainly by Microsoft, either by training company staff and colleagues or assisting them in design, development and implementation as a consultant or chief developer. He has focused in Databases and Data Science since 1995. He specialized in Microsoft SQL Server since version 6.0 in areas like SQL Server Internals, Database Design and Development, Business Intelligence and in 2010 he has started working with Azure Data Platform, NoSQL databases, Big Data Technologies and Machine Learning. He is an active member of many IT communities in Greece, answering colleagues' questions and writing articles in his web site. He is the owner of SQLschool.gr which is a community portal with a lot of information about Microsoft SQL Server. He has been a Microsoft Certified Trainer (MCT) since 2000. Microsoft honored him as MVP on Data Platform due to his activities in SQL Server since 2010. He holds a large number of Microsoft Certifications and Microsoft SQL Server Certifications since version 6.5.


What's New in SQL Server 2022 - Episodes

More Tips...

Become a member

If you want to receive updates from us become a member to our community.




sqlschool.gr © 2010-2024 All rights reserved

This site uses cookies for operational and analytics purposes only. By continuing to browse this site, you agree to their use.