के लिए उपयोगकर्ता की जांच करना चाहते कहो लिखने के लिए बहुत आसान है
उन लोगों के लिए जो किसी का दावा करते हैं() आगे बढ़ने का तरीका है मैंने लिंकपैड में कॉमनपैसवर्ड के एसक्यूएल डेटाबेस के खिलाफ एक सरल परीक्षण किया है, 14 मिलियन दे या ले लो। कोड:
var password = "qwertyuiop123";
var startTime = DateTime.Now;
"From DB:".Dump();
startTime = DateTime.Now;
if (CommonPasswords.Any(c => System.Data.Linq.SqlClient.SqlMethods.Like(c.Word, password)))
{
$"FOUND: processing time: {(DateTime.Now - startTime).TotalMilliseconds}\r\n".Dump();
}
else
{
$"NOT FOUND: processing time: {(DateTime.Now - startTime).TotalMilliseconds}\r\n".Dump();
}
"From DB:".Dump();
startTime = DateTime.Now;
if (CommonPasswords.Where(c => System.Data.Linq.SqlClient.SqlMethods.Like(c.Word, password)).Count() > 0)
{
$"FOUND: processing time: {(DateTime.Now - startTime).TotalMilliseconds}\r\n".Dump();
}
else
{
$"NOT FOUND: processing time: {(DateTime.Now - startTime).TotalMilliseconds}\r\n".Dump();
}
"From DB:".Dump();
startTime = DateTime.Now;
if (CommonPasswords.Where(c => c.Word.ToLower() == password).Take(1).Any())
{
$"FOUND: processing time: {(DateTime.Now - startTime).TotalMilliseconds}\r\n".Dump();
}
else
{
$"NOT FOUND: processing time: {(DateTime.Now - startTime).TotalMilliseconds}\r\n".Dump();
}
यहाँ अनुवाद एसक्यूएल है:
-- Region Parameters
DECLARE @p0 NVarChar(1000) = 'qwertyuiop123'
-- EndRegion
SELECT
(CASE
WHEN EXISTS(
SELECT NULL AS [EMPTY]
FROM [Security].[CommonPasswords] AS [t0]
WHERE [t0].[Word] LIKE @p0
) THEN 1
ELSE 0
END) AS [value]
GO
-- Region Parameters
DECLARE @p0 NVarChar(1000) = 'qwertyuiop123'
-- EndRegion
SELECT COUNT(*) AS [value]
FROM [Security].[CommonPasswords] AS [t0]
WHERE [t0].[Word] LIKE @p0
GO
-- Region Parameters
DECLARE @p0 NVarChar(1000) = 'qwertyuiop123'
-- EndRegion
SELECT
(CASE
WHEN EXISTS(
SELECT NULL AS [EMPTY]
FROM (
SELECT TOP (1) NULL AS [EMPTY]
FROM [Security].[CommonPasswords] AS [t0]
WHERE LOWER([t0].[Word]) = @p0
) AS [t1]
) THEN 1
ELSE 0
END) AS [value]
आप देख सकते हैं कि किसी भी प्रश्न कोड की एक और परत में लपेटता कहाँ तो मौजूद है 1 एक मामला ऐसा करने के लिए जहां काउंट का() बस एक गणना कमांड में जोड़ता है। इन दोनों के साथ समस्या आप एक शीर्ष (1) ऐसा नहीं कर सकते, लेकिन मैं शीर्ष का उपयोग कर एक बेहतर तरीका नहीं देख सकता है (1)
परिणाम:
डीबी से: पाया: प्रसंस्करण समय: 13.3962
डीबी से
: पाया: प्रसंस्करण समय: 12,0933
डीबी से: पाया: प्रसंस्करण समय: 787,8801
फिर:
डीबी से: पाया: प्रसंस्करण समय: 13,3878
डीबी से: पाया: प्रसंस्करण समय: 12,6881
डीबी से: पाया: प्रसंस्करण समय: 780,2686
फिर:
डीबी से: फाउंड: प्रसंस्करण समय: 24.7081
डीबी से: पाया: प्रसंस्करण समय: 23,6654
डीबी से: पाया: प्रसंस्करण समय: 699,622
सूचकांक के बिना:
डीबी से: पाया: प्रसंस्करण समय: 2395।1988
डीबी से: पाया: प्रसंस्करण समय: 390,6334
डीबी से: पाया: प्रसंस्करण समय: 664,8581
अब आप में से कुछ सोच सकते है कि यह केवल एक या दो मिलीसेकंड है। हालांकि इससे पहले कि मैं इस पर एक इंडेक्स डालूं, भिन्नता बहुत अधिक थी; कुछ सेकंड तक।
आखिरी गणना वहां है क्योंकि मैंने इस धारणा के साथ शुरुआत की है कि ToLower() LIKE से तेज़ होगा, और जब तक मैंने गिनने की कोशिश नहीं की और तब तक एक इंडेक्स डाला, तब तक मैं सही था। मुझे लगता है कि लोअर() सूचकांक को अपरिवर्तनीय बनाता है।
आपके लिए अतिरिक्त अपवोट सिर्फ इसलिए कि मुझे कभी एहसास नहीं हुआ कि लिंक से एसक्यूएल के लिए एक एसक्यूएल लॉगिंग सुविधा थी। मुझे इस पूरे समय एसक्यूएल प्रोफाइलर चलाने के लिए किया गया है। – David
@ डेविड - वास्तव में। मैं एमएस डेटा टीम को ईएफ के लिए जोड़ने के लिए कहता हूं ;- –
क्या होगा यदि आप डेटाबेस के लिए दूसरी क्वेरी लिखने के बजाय ** बाद में उपयोगकर्ताओं का उपयोग करना चाहते हैं? [यह] जांचें (http://stackoverflow.com/a/1071063/2218697), उम्मीद किसी की मदद करती है। – stom