এই দুটি প্রশ্নের যুক্তিযুক্তভাবে সমতুল্য?


10

এই দুটি প্রশ্নের যুক্তিযুক্তভাবে সমতুল্য?

DECLARE @DateTime DATETIME = GETDATE()

প্রশ্ন ঘ

SELECT *
FROM   MyTable
WHERE  Datediff(DAY, LogInsertTime, @DateTime) > 7   

প্রশ্ন 2

SELECT *
FROM   MyTable
WHERE  LogInsertTime < @DateTime - 7 

যদি সেগুলি যৌক্তিকভাবে সমতুল্য না হয় তবে আপনি কি আমাকে প্রথম ক্যোয়ারির লজিক্যাল সমতুল্য দিতে পারেন যাতে পুরো ধারাটি কার্যকরভাবে একটি সূচক ব্যবহার করতে পারে (অর্থাত ফাংশন মোড়ানোর কাজটি বাদ দেয়)?


কি ধরণের LogInsertTime?
dezso

1
দেখে নিন knowdotnet.com/articles/getdatereturn.html
a1ex07

লগইনসার্টটাইম একটি তারিখ
আলফ 47

উত্তর:


15

আপনার পোস্ট করা দুটি প্রশ্নের যুক্তিযুক্তভাবে সমতুল্য কিনা তা; আপনার এগুলির কোনওটি ব্যবহার করা উচিত নয়। আমি আপনাকে কয়েকটি জিনিস থেকে দূরে সরিয়ে নেওয়ার চেষ্টা করব:

  1. যখনই সম্ভব, কলামগুলিতে ফাংশন প্রয়োগ এড়াতে চেষ্টা করুন। এই গণনাগুলি স্থির বিরুদ্ধে রাখা এবং কলামগুলি না রাখাই সর্বদা হিসাবে ভাল এবং বেশিরভাগই ভাল - এটি SARGability নষ্ট করতে পারে এবং এই কলামগুলিতে অনর্থক সূচকগুলি রেন্ডার করতে পারে। এই ক্ষেত্রে, আমি অনেকগুলি ক্যোয়ারী 2 পছন্দ করি, বিশেষত যদি LogDateTimeসূচকযুক্ত হয় (বা কখনও হতে পারে)।
  2. আমি শর্টহ্যান্ড ডেট গণিত পছন্দ করি না এবং আমি এর বিরুদ্ধে প্রস্তাব দিই। অবশ্যই, এটি টাইপ করা দ্রুত, তবে একটি DATEডেটা টাইপ দিয়ে চেষ্টা করুন এবং আপনি একটি কুৎসিত ত্রুটি পাবেন। এটির বানানটি আরও ভাল, উদাহরণস্বরূপ:

    WHERE LogInsertTime < DATEADD(DAY, -7, @DateTime);

আমি সম্মত, আমার লক্ষ্য ক্যোয়ারী 1 কে ক্যোয়ারি 2 এর অনুরূপ কিছুতে পরিবর্তন করা ছিল যাতে সূচকগুলি কার্যকরভাবে ব্যবহার করা যায়। আপনার সহায়তার জন্য আপনাকে ধন্যবাদ
Alf47

8

আমি নিম্নলিখিত sargeable ক্যোয়ারী ব্যবহার করব:

SELECT * FROM MyTable WHERE LogInsertTime < DATEADD(DAY, -7, @DateTime)

কারণ: আমি বিশ্বাস করি যে @ ডেটটাইম -7 এর ফলাফল নথিভুক্ত নয়। এমনকি যদি এটি DATEADD (DAY, -7, @ তারিখটাইম) এর সমতুল্য হয়ে থাকে তবে এটি পরে প্রকাশিত হতে পারে।


দুর্দান্ত যে আমি ঠিক তাই খুঁজছিলাম, আপনাকে ধন্যবাদ
Alf47

2
এটা, আসলে, নথিভুক্ত এবং ভাল-সংজ্ঞায়িত : - (Subtract): Subtracts two numbers (an arithmetic subtraction operator). Can also subtract a number, in days, from a date.। তবুও, আমি সম্মত হই যে সুস্পষ্ট তারিখের ফাংশনগুলি ব্যবহারের ফলে ফলাফলটি "ক্যারিটিমেটিক অপারেটর যাদু" এর চেয়ে বেশি পাঠযোগ্য এবং রক্ষণাবেক্ষণযোগ্য করে তোলে।
হেইনজি

6

তারা সমতুল্য নয়। Days দিন আগের রেকর্ডগুলি, তবে দিনের বর্তমান সময়ের আগে - কেবল # 2 প্রশ্নের মধ্যে ফেরত দেওয়া হবে:

যখন ব্যবহার দিন তুলনা DATEADDফাংশন , এটা বিবেচনা করে সময় অংশগ্রহণ করে না । সময়টি নির্বিশেষে রবিবার ও সোমবারের তুলনায় ফাংশনটি 1টি ফিরে আসবে।

ডেমো:

DECLARE @MyTable TABLE(pk INT, LogInsertTime DATETIME);

INSERT @MyTable
VALUES (1, DATEADD(HOUR, 1, CAST(DATEADD(DAY, -7, CAST (GETDATE() AS DATE))AS DATETIME))),
(2, DATEADD(HOUR, 23, CAST(DATEADD(DAY, -7, CAST (GETDATE() AS DATE)) AS DATETIME)));

DECLARE @DateTime DATETIME = GETDATE();

SELECT *
FROM @MyTable
WHERE DATEDIFF(DAY, LogInsertTime, @DateTime) > 7;

-- 0 records.

SELECT *
FROM @MyTable
WHERE LogInsertTime < @DateTime - 7;
-- 1 record.

প্রথম ক্যোয়ারির যৌক্তিক সমতুল্য যা সম্ভাব্য সূচক ব্যবহার সক্ষম করে তা হয় সময়ের অংশটি সরিয়ে ফেলা @DateTimeবা এতে সময় সেট করা 0:00:00:

SELECT *
FROM @MyTable
WHERE LogInsertTime < CAST(@DateTime - 7 AS DATE);

প্রথম ক্যোয়ারিটি কেন সূচকটি ব্যবহার করতে পারে না LogInsertTimeতার কারণ হ'ল কলামটি কোনও ফাংশনের মধ্যেই সমাধিস্থ হয়েছে। ক্যোরি # 2 কলামটিকে একটি ধ্রুবক মানের সাথে তুলনা করে যা অপ্টিমাইজারটিকে একটি সূচক নির্বাচন করতে সক্ষম করে LogInsertTime

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.