سؤال

أنا انضم إلى جدول العشرات من الأوقات المختلفة، وفي كل مرة، انضم إلي (أو مرشح) استنادا إلى نتائج فرعية واحدة من الأعمدة (إنها سلسلة، لكن الأيسر مبطن بالأزهار، ولا " ر يهتم بأرقام الأربعة الماضية). نتيجة لذلك، على الرغم من أن هذا العمود مفهرسا وسيستخدم الاستعلام الخاص بي الفهرس، إلا أنه يقوم بمسح الجدول نظرا لأن Substring نفسها غير مفهرسة، لذلك يجب على SQL Server حسابه لكل صف قبل الانضمام إليه.

أبحث عن أي أفكار حول كيفية تسريع هذه العملية. حاليا، هناك طريقة عرض على الطاولة (إنها "تحديد * من"، فقط لإعطاء الجدول اسم ودية)، وأنا أفكر في إضافة عمود إلى طريقة العرض التي تم حسابها، ثم فهرسة ذلك. أنا منفتح على اقتراحات أخرى، على الرغم من - أي أفكار؟

تفاصيل اكثر:كان يجب أن أشارك هذا لتبدأ. يتلقى الجدول النسخ المتماثل من نظام الفواتير لدينا، لذلك تحرير الجدول الأساسي لإضافة عمود محسوب ليس خيارا. يجب إضافة أي عمود محسوب إلى العرض على الطاولة. أيضا، فإن الأصفار الرائدة لا تقود دائما الأصفار - فهي في بعض الأحيان بيانات أخرى غير مهتم بها. أفترض أن السؤال الحقيقي هو "كيف يمكنني الانضمام إلى البيانات في منتصف عمود Varchar أثناء الاستفادة من مؤشر؟ البحث عن النص الكامل؟"

توضيح مثالتيأنا تبسيط، ولكن أساسا، دعنا نقول أنني أحاول البحث عن القيم في عمود مع القيم التالية:

00000012345MoreStuff
00000012345Whatever
19834212345
Houses12345837443GGD
00000023456MoreStuff

أنا مهتم بالصفوف حيث السلسلة الفرعية (7،5) = "12345"، لذلك أريد الصفوف 1-4، ولكن ليس صف 5. ما أقترحه هو إضافة عمود إلى "تحديد *" عرض ذلك لديه هذه الفرعية في ذلك، ثم الفهرسة بناء على ذلك. هل هذا أكثر منطقية؟

هل كانت مفيدة؟

المحلول

على افتراض أن لديك حقولك في هذا التنسيق:

00Data0007
000000Data0011
0000Data0015

, ، يمكنك القيام بما يلي:

  • إنشاء عمود محسوب: ndata AS RIGHT(REVERSE(data), LEN(data) - 4)

    سيؤدي ذلك إلى تحويل أعمدةك إلى ما يلي:

    ataD00
    ataD000000
    ataD0000
    
  • إنشاء فهرس على هذا العمود

  • قم بإصدار هذا الاستعلام للبحث عن السلسلة Data:

    SELECT  *
    FROM    mytable
    WHERE   ndata LIKE N'ataD%'
            AND SUBSTRING(ndata, LEN(N'ataD') + 1, LEN(ndata)) = REPLICATE('0', LEN(ndata) - LEN('ataD'))
    

    الحالة الأولى ستستخدم فهرس للتصفية الخشنة.

    ستتأكد الثانية من أن جميع الشخصيات الرائدة (التي أصبحت الأحرف الزائدة في العمود المحسوب) ليست سوى الأصفار.

انظر هذا الإدخال في مدونتي للحصول على تفاصيل الأداء:

تحديث

إذا كنت تريد فقط فهرس SUBSTRING دون تغيير المخطط الخاص بك، فإن إنشاء عرض هو خيار.

CREATE VIEW v_substring75
WITH SCHEMABINDING
AS
SELECT  s.id, s.data, SUBSTRING(data, 7, 5) AS substring75
FROM    mytable

CREATE UNIQUE CLUSTERED INDEX UX_substring75_substring_id ON (substring75, id)

SELECT  id, data
FROM    v_substring75
WHERE   substring75 = '12345'

نصائح أخرى

أضف العمود المحسوب إلى طاولتك وإنشاء فهرس على هذا العمود.

ALTER TABLE MyTable
Add Column CodeHead As LEFT(Code,Len(Code)-4)

ثم قم بإنشاء فهرس على هذا.

CREATE INDEX CodeHeadIdx ON MyTable.CodeHead

يمكنك إعادة عبارة معايير المرشح الخاصة بك من حيث بيان مثل "شيء٪٪"؟ (هذا ينطبق على فهرس)

قم بتغيير العمود إلى أعمدة - البيانات التي تنضم إليها و 4 أحرف إضافية. استخدام أجزاء من العمود يبطئ الأمور كما كنت رأيت

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top