यहाँ मूल सवाल का जवाब देने के लिए मेरे सबसे अच्छे जवाब है:
इस प्रयास करें:
/* create a deterministic schema bound function */
CREATE FUNCTION FloorDate(@dt datetime)
RETURNS datetime
WITH SCHEMABINDING
AS
BEGIN
RETURN CONVERT(datetime, FLOOR(CONVERT(float, @dt)))
END
GO
, परीक्षण निम्नलिखित की कोशिश करने के लिए। बाद में कृपया गणना स्तंभ और के उपयोग के लिए "कायम" के उपयोग पर ध्यान दें [dbo।] जब समारोह
/*create a test table */
CREATE TABLE [dbo].[TableTestFloorDate](
[Id] [int] IDENTITY(1,1) NOT NULL,
[TestDate] [datetime] NOT NULL,
[TestFloorDate] AS ([dbo].[FloorDate]([TestDate])) PERSISTED,
CONSTRAINT [PK_TableTestFloorDate] PRIMARY KEY CLUSTERED
(
[Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON)
)
अब आप गणना स्तंभ पर एक सूचकांक से जोड़ने के लिए सक्षम होना चाहिए की चर्चा करते हुए (लेकिन देख पकड़ लिया)
CREATE INDEX IX_TestFloorDate ON [dbo].[TableTestFloorDate](TestFloorDate)
कई बार के रूप में कुछ यादृच्छिक डेटा सम्मिलित करें के रूप में आप चाहते हैं, लेकिन अधिक (1000+) आप सूचकांक उपयोग का परीक्षण करना चाहते हैं तो बेहतर है/निष्पादन की योजना बना रही
INSERT INTO TableTestFloorDate (TestDate) VALUES(convert(datetime, RAND()*50000))
जाओ परिणाम
SELECT * FROM TableTestFloorDate WHERE TestFloorDate='2013-2-2'
अब यहां GOTCHA है ... गणना की गई कॉलम पर बनाई गई अनुक्रमणिका का उपयोग नहीं किया जाता है! इसके बजाए, लगातार फ़ील्ड टेस्टफ्लोरडेट पर डेटा चुनते समय, SQL सर्वर (या कम से कम मेरा संस्करण) टेस्टडेट पर एक इंडेक्स पसंद करता है।
CREATE INDEX IX_TestFloorDate ON [dbo].[TableTestFloorDate](TestDate)
मैं यकीन है कि (स्मृति से) अभिकलन सूचक, कायम थीं कि कॉलम एक प्रदर्शन के नजरिए से लाभ के हैं हूँ - मुझे लगता है कि तुम सिर्फ अपने स्वयं के विशिष्ट उपयोगों के लिए कोशिश/परीक्षण करना होगा
(आशा है कि मैंने मदद की है!)
हां यह है। लेकिन त्रुटि कहां से आती है? – Tomalak
getDate गैर-निर्धारिती है, मुझे विश्वास है कि – kristof
कारण होगा हाँ हां यही कारण है! –