मैं इसे एक नए उत्तर के रूप में रखता हूं, क्योंकि यह वास्तव में एक उत्तर नहीं है बल्कि विभिन्न दृष्टिकोणों की तुलना है:
निष्कर्ष:
- XML को छोड़कर सभी दृष्टिकोण काफी रैखिक पैमाने पर हैं
- XML छोटी पंक्तियों की संख्या के साथ सबसे तेज़ है लेकिन उच्च पंक्ति संख्या के साथ बदतर हो जाती है
एक परीक्षण परिदृश्य बनाएं
CREATE TABLE #tbl (ID INT IDENTITY,sortColumn VARCHAR(100));
INSERT INTO #tbl VALUES
('A-1')
,('A-10')
,('A-2')
,('A-3')
,('A-4')
,('A-5')
,('A-6')
,('A-7')
,('A-8')
,('A-9')
,('A-3a')
,('A-3b')
,('A-3c')
,('B-1')
,('B-10')
,('B-11')
,('B-12')
,('B-12a')
,('B-12b')
,('B-13')
,('B-2')
,('B-3')
,('B-4')
,('B-5')
,('B-6')
,('B-7')
,('B-8')
,('A-8a')
,('B-8')
,('B-9'); --30 rows
GO 1000 -- x 1.000 = 30.000 rows
मैट का दृष्टिकोण (आवश्यक के अनुसार साफ किया गया)
- 3 मील पंक्तियों पर 46 सेकंड
- 300,000 पंक्तियों पर 4.5 सेकंड
- 30,000 पंक्तियों पर 1.3 सेकंड
- 3.000 पंक्तियों पर 0.7 सेकंड
कोड
SELECT ID,sortColumn
FROM
#tbl
ORDER BY
LEFT(sortColumn,CHARINDEX('-',sortColumn) -1)
,CAST((CASE
WHEN ISNUMERIC(SUBSTRING(sortColumn,CHARINDEX('-',sortColumn) + 1,3)) = 1 THEN SUBSTRING(sortColumn,CHARINDEX('-',sortColumn) + 1,3)
WHEN ISNUMERIC(SUBSTRING(sortColumn,CHARINDEX('-',sortColumn) + 1,2)) = 1 THEN SUBSTRING(sortColumn,CHARINDEX('-',sortColumn) + 1,2)
WHEN ISNUMERIC(SUBSTRING(sortColumn,CHARINDEX('-',sortColumn) + 1,1)) = 1 THEN SUBSTRING(sortColumn,CHARINDEX('-',sortColumn) + 1,1)
ELSE NULL
END) AS INT)
,RIGHT(sortColumn,
LEN(sortColumn) -
LEN(LEFT(sortColumn,CHARINDEX('-',sortColumn) -1))
- LEN(CASE
WHEN ISNUMERIC(SUBSTRING(sortColumn,CHARINDEX('-',sortColumn) + 1,3)) = 1 THEN SUBSTRING(sortColumn,CHARINDEX('-',sortColumn) + 1,3)
WHEN ISNUMERIC(SUBSTRING(sortColumn,CHARINDEX('-',sortColumn) + 1,2)) = 1 THEN SUBSTRING(sortColumn,CHARINDEX('-',sortColumn) + 1,2)
WHEN ISNUMERIC(SUBSTRING(sortColumn,CHARINDEX('-',sortColumn) + 1,1)) = 1 THEN SUBSTRING(sortColumn,CHARINDEX('-',sortColumn) + 1,1)
ELSE NULL
END)
- 1 --the '-'
),ID;
CROSS APPLY
में चरणबद्ध गणना s, परिकलित स्तंभों पर क्रमित करना
- 3 मील पंक्तियों पर 44 सेकंड
- 300,000 पंक्तियों पर 4.4 सेकंड
- 30,000 पंक्तियों पर 0.9 सेकंड
- 3.000 पंक्तियों पर 0.3 सेकंड
कोड
SELECT ID,sortColumn
FROM #tbl
CROSS APPLY(SELECT CHARINDEX('-',sortColumn) AS posMinus) AS pos
CROSS APPLY(SELECT SUBSTRING(sortColumn,1,posMinus-1) AS part1
,SUBSTRING(sortColumn,posMinus+1,1000) AS part2
) AS parts
CROSS APPLY(SELECT ISNUMERIC(part2) AS p2isnum) AS checknum
CROSS APPLY(SELECT CASE WHEN p2isnum=1 THEN '' ELSE RIGHT(part2,1) END AS part3
,CASE WHEN p2isnum=1 THEN part2 ELSE SUBSTRING(part2,1,LEN(part2)-1) END AS part2New
) AS partsNew
ORDER BY part1,part2new,part3,ID;
CROSS APPLY
में चरणबद्ध गणना s, संयोजित गद्देदार स्ट्रिंग पर छँटाई
- 3 मील पंक्तियों पर 42 सेकंड
- 300,000 पंक्तियों पर 4.2 सेकंड
- 30,000 पंक्तियों पर 0.7 सेकंड
- 3.000 पंक्तियों पर 0.4 सेकंड
कोड
SELECT ID,sortColumn
FROM #tbl
CROSS APPLY(SELECT CHARINDEX('-',sortColumn) AS posMinus) AS pos
CROSS APPLY(SELECT SUBSTRING(sortColumn,1,posMinus-1) AS part1
,SUBSTRING(sortColumn,posMinus+1,1000) AS part2
) AS parts
ORDER BY RIGHT('.....' + part1,5) + RIGHT('.....' + part2,5 - ISNUMERIC(RIGHT(part2,1)))
,ID;
XML के साथ विभाजन, संयोजित गद्देदार स्ट्रिंग पर छँटाई करना
- 3 मील पंक्तियों पर 67 सेकंड
- 300,000 पंक्तियों पर 6.2 सेकंड
- 30,000 पंक्तियों पर 0.7 सेकंड
- 3.000 पंक्तियों पर 0.3 सेकंड
कोड
SELECT ID,sortColumn
FROM
(
SELECT CAST('<r>' + REPLACE(sortColumn,'-','</r><r>') + '</r>' AS XML) AS SortColumnSplitted
,*
FROM #tbl
) AS tbl
ORDER BY RIGHT('.....' + SortColumnSplitted.value('r[1]','varchar(max)'),5) + RIGHT('.....' + SortColumnSplitted.value('r[2]','varchar(max)'),5 - ISNUMERIC(RIGHT(SortColumnSplitted.value('r[2]','varchar(max)'),1)))
,ID;