أكثر

الجملة MapBasic لتحديث العمود الموجود في جدول كائن

الجملة MapBasic لتحديث العمود الموجود في جدول كائن


كنت أبحث عن جملة MapBasic لتحديث جدول MapInfo. لدي جدولين وأريد تحديث أحدهما (POINTS) بسمة أخرى (REGIONS). أرغب في تحديث النقاط بأسماء المناطق الواردة. أعني ، لدي جدولين في MapInfo ، وجدول مضلعات وجدول نقاط. أريد ملء عمود "البلدية" بأسماء المضلعات التي تحتوي على النقاط.

كنت أحاول بإمكانيات مختلفة ، باستخدام الأمر "update" مثل

تحديث {Text Table} Set {Column} = ObjectInfo (Obj، 3) حدد * من {Text Table} حيث Str $ (Obj) = ”TEXT”

جدول POINTS (مع العمود REGION_NAME) ،

الجدول REGIONS (مع العمود NAME)

أضف العمود "POINTS" (REGION_NAME) من REGIONS اضبط إلى NAME حيث يحتوي

يجب استبدال أسماء الجداول والأعمدة الفعلية الخاصة بك.


كيف يتم إرسال البيانات من الجدول القابل للتكرار في شكل infopath إلى قائمة SharePoint؟

لدي نموذج مسار معلومات تم إنشاؤه من نوع محتوى قائمة SharePoint. في هذا النموذج ، أحتاج إلى إضافة جدول قابل للتكرار لإرسال البيانات إلى قائمة SharePoint أخرى. لذلك عندما يرسل الأشخاص هذا النموذج ، سيتم تحديث القائمة الأصلية التي يستند إليها النموذج وكذلك القائمة الثانية. كيف يمكنني إرسال البيانات إلى قائمة SharePoint الثانية؟

لقد قمت بالفعل بإنشاء خدمة ويب WCF والتي يمكنها إضافة عناصر إلى قائمة ولكنها لا تعمل مع مسار المعلومات.

هل يمكن لأي شخص أن يريني بعض الإرشادات حول كيفية إنشاء أو استخدام خدمة ويب تسمح لي بإرسال الحقول إلى قائمة SharePoint ثم استخدامها في infopath 2010؟


1 إجابة 1

هل هناك طريقة أفضل؟
هل يوفر إطار الكيان بالفعل آلية لتحقيق ذلك؟

في الحقيقة هذا سؤال واحد إذا كانت EF ستوفر آلية ، فهذا بلا شك سيكون أفضل ، لأنك تعلم بالتأكيد أنها ستنتج شيئًا تسعده EF. لسوء الحظ ، لا ، لم يكن لدى EF مثل هذه الآلية.

بقدر ما يتحقق EF من اتساق قاعدة البيانات مع نموذج موجود ، فإنه يقارن فقط تجزئة النموذج المخزن مسبقًا في قاعدة البيانات مع تجزئة النموذج الحالي. لا تقارن أبدًا كائنات قاعدة البيانات الفعلية. قد يستغرق ذلك وقتًا طويلاً جدًا في التحقق مما إذا كان يجب تطبيق الترحيل. وبعد ذلك ، كل هذه الأساليب داخلية.

ومع ذلك ، هناك طريقة أقصر وأكثر موثوقية للحصول على أسماء الكيانات والممتلكات من سياق. أكثر موثوقية ، لأنك ستحصل فقط على الكيانات والخصائص المعينة دون الحاجة إلى القفز عبر الأطواق لاستبعاد تلك التي لم يتم تعيينها. سأعطيك قلبه ، حتى تتمكن من ملاءمته بشكل مناسب.

هل سيكون هذا أفضل في طبقة البيانات أم في تجميع آخر؟

أود أن أجعل الجزء الذي يوفر أسماء الجداول والأعمدة جزءًا من طبقة البيانات ، لأن لديك جميع المراجع المطلوبة. لن أقوم بتضمين الجزء الذي يستعلم عن قاعدة البيانات ، لأنه يتم باستخدام Dapper و.

هل إضافة Dapper (لهذا الغرض فقط) مبالغة ، هل يضيف تعقيدًا غير ضروري إلى المشروع؟

لا ، Dapper رائع. ولكن نظرًا لأن هذه تبعية لجهة خارجية ، فسوف أستخدمها في تجميع منفصل يحتوي على مرجع إلى DAL الخاص بك (للحصول على أسماء كائنات قاعدة البيانات) ، لذلك لا يحتوي DAL الخاص بك على هذه التبعية.


1 إجابة 1

هناك حالات معينة حيث يمكن أن يكون إسقاط عمود عملية بيانات وصفية فقط. لا يتم تضمين تعريفات العمود لأي جدول معين في كل صفحة يتم تخزين الصفوف فيها ، ويتم تخزين تعريفات الأعمدة فقط في بيانات تعريف قاعدة البيانات ، بما في ذلك sys.sysrowsets و sys.sysrscols وما إلى ذلك.

عند إسقاط عمود لم تتم الإشارة إليه بواسطة أي كائن آخر ، يقوم محرك التخزين ببساطة بتحديد تعريف العمود على أنه لم يعد موجودًا عن طريق حذف التفاصيل ذات الصلة من جداول النظام المختلفة. يؤدي حذف البيانات الوصفية إلى إبطال ذاكرة التخزين المؤقت للإجراء ، مما يستلزم إعادة التحويل البرمجي كلما أشار استعلام لاحقًا إلى هذا الجدول. نظرًا لأن إعادة التحويل البرمجي لا يُرجع سوى الأعمدة التي حاليا في الجدول ، لا يُطلب من تفاصيل العمود الخاصة بالعمود الذي تم إسقاطه مطلقًا حتى يتخطى محرك التخزين وحدات البايت المخزنة في كل صفحة لهذا العمود ، كما لو لم يعد العمود موجودًا.

عند حدوث عملية DML لاحقة مقابل الجدول ، تتم إعادة كتابة الصفحات المتأثرة بدون بيانات العمود الذي تم إسقاطه. إذا قمت بإعادة إنشاء فهرس متفاوت المسافات أو كومة ، فإن كافة وحدات البايت للعمود الذي تم إسقاطه لا تتم كتابتها بشكل طبيعي مرة أخرى إلى الصفحة الموجودة على القرص. يؤدي هذا إلى توزيع حمل إسقاط العمود بشكل فعال بمرور الوقت ، مما يجعله أقل وضوحًا.

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

من السهل إلى حد ما إظهار ذلك من خلال النظر في محتويات سجل المعاملات بعد إسقاط عمود. يقوم الكود أدناه بإنشاء جدول بعمود حرف واحد بطول 8000. يضيف صفًا ، ثم يسقطه ، ويعرض محتويات سجل المعاملات المطبقة على عملية الإفلات. تعرض سجلات السجل التعديلات على جداول النظام المختلفة حيث يتم تخزين تعريفات الجدول والأعمدة. إذا تم بالفعل حذف بيانات العمود من الصفحات المخصصة للجدول ، فسترى سجلات السجل تسجل بيانات الصفحة الفعلية ولا توجد مثل هذه السجلات.

(الناتج أكبر من أن يظهر هنا ، ولن يسمح لي dbfiddle.uk بالوصول إلى fn_dblog)

تُظهر المجموعة الأولى من المخرجات السجل كنتيجة لإسقاط عبارة DDL العمود. تُظهر المجموعة الثانية من المخرجات السجل بعد تشغيل بيان DML حيث نقوم بتحديث عمود التخلّص. في مجموعة النتائج الثانية ، نرى سجلات السجل تشير إلى حذف مقابل dbo.DropColumnTest ، متبوعًا بإدراج في dbo.DropColumnTest. طول كل سجل سجل هو 8116 ، مما يشير إلى أنه تم تحديث الصفحة الفعلية.

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

للعلم، سيقوم الكود التالي بتفريغ صفحات البيانات للجدول المضمن في التعليمات البرمجية أعلاه ، باستخدام DBCC PAGE ، النمط "3". يشير النمط "3" إلى أننا نريد رأس الصفحة بالإضافة إلى تفسير تفصيلي لكل صف. يستخدم الرمز مؤشرًا لعرض التفاصيل الخاصة بـ كل الصفحة في الجدول ، لذا قد ترغب في التأكد من عدم تشغيل هذا على طاولة كبيرة.

بالنظر إلى إخراج الصفحة الأولى من العرض التوضيحي الخاص بي (بعد إسقاط العمود ، ولكن قبل تحديث العمود) ، أرى هذا:

لقد قمت بإزالة معظم تفريغ الصفحة الأولية من الإخراج الموضح أعلاه للإيجاز. في نهاية الإخراج ، سترى هذا لعمود التخلص:

يعرض السطر الأخير أعلاه ، rid = 1 ، اسم العمود والقيمة الحالية المخزنة في العمود بالصفحة.

يُظهر الإخراج أن Slot 0 تحتوي على عمود محذوف ، بموجب النص المحذوف حيث يكون اسم العمود عادةً. يتم إرجاع قيمة العمود فارغة منذ حذف العمود. ومع ذلك ، كما ترى في البيانات الأولية ، فإن القيمة التي يبلغ طولها 8000 حرف ، REPLICATE ('Z' ، 8000) ، لهذا العمود لا تزال موجودة على الصفحة. هذه عينة من ذلك الجزء من إخراج DBCC PAGE:


4 إجابات 4

الخيار رقم 2 ، باستخدام الجداول المرجعية ، هو الطريقة القياسية للقيام بذلك. تم استخدامه من قبل ملايين المبرمجين ، ومن المعروف أنه يعمل. إنها نمط، لذلك فإن أي شخص آخر ينظر إلى أشيائك سيعرف على الفور ما يحدث. توجد مكتبات وأدوات تعمل على قواعد البيانات ، مما يوفر عليك الكثير والكثير من العمل ، والتي ستتعامل معها بشكل صحيح. فوائد استخدامه لا حصر لها.

هل هو إسراف؟ نعم ، ولكن بشكل طفيف فقط. ستحتفظ أي قاعدة بيانات غير لائقة دائمًا بهذه الجداول الصغيرة التي يتم ربطها بشكل متكرر في ذاكرة التخزين المؤقت ، وبالتالي فإن النفايات غير محسوسة بشكل عام.

جميع الخيارات الأخرى التي وصفتها مخصصة وهادئة ، بما في ذلك تعداد MySQL ، لأنها ليست جزءًا من معيار SQL. (بخلاف ذلك ، فإن ما يميز Enum هو تطبيق MySQL ، وليس الفكرة نفسها. لا أمانع في رؤيتها يومًا ما كجزء من المعيار).

خيارك الأخير رقم 3 باستخدام عدد صحيح هو خاصة مبتذل. تحصل على أسوأ ما في العوالم: لا تكامل مرجعي ، ولا قيم مسماة ، ولا توجد معرفة نهائية داخل قاعدة البيانات لما تمثله القيمة ، فقط أعداد صحيحة عشوائية تم إلقاؤها في كل مكان. من خلال هذا الرمز المميز ، يمكنك أيضًا إنهاء استخدام الثوابت في التعليمات البرمجية الخاصة بك ، والبدء في استخدام القيم المشفرة بدلاً من ذلك. المحيط = نصف القطر * 6.28318530718. ماذا عن ذلك؟

أعتقد أنه يجب عليك إعادة فحص سبب كونك تجد الجداول المرجعية مرهقة. لا أحد يجدهم مرهقين ، على حد علمي. هل يمكن أن يكون ذلك بسبب عدم استخدامك للأدوات المناسبة للوظيفة؟

تخبرني جملتك حول الحاجة إلى "ترميز الأشياء والتعامل مع الأعداد الصحيحة" ، أو الاضطرار إلى "إنشاء بنيات برمجة متقنة" ، أو "إنشاء كيانات جديدة موجهة للكائنات على جانب البرمجة" ، ربما كنت تحاول القيام بعلاقة كائن رسم الخرائط (ORM) بسرعة متناثرة في جميع أنحاء كود التطبيق الخاص بك ، أو في أفضل الأحوال قد تحاول تشغيل آلية رسم الخرائط الارتباطية الخاصة بك ، بدلاً من استخدام أداة ORM موجودة للمهمة ، مثل Hibernate. كل هذه الأشياء سهلة مع السبات. يستغرق الأمر بعض الوقت لتتعلمه ، ولكن بمجرد أن تتعلمه ، يمكنك التركيز حقًا على تطوير التطبيق الخاص بك ونسيان الآليات الجوهرية لكيفية تمثيل الأشياء في قاعدة البيانات.

أخيرًا ، إذا كنت تريد أن تجعل حياتك أسهل عند العمل مباشرةً مع قاعدة البيانات ، فهناك شيئان على الأقل يمكنك القيام بهما ، ويمكنني التفكير فيهما الآن:

قم بإنشاء طرق عرض تربط الجداول الرئيسية بأي جداول مرجعية تشير إليها ، بحيث لا يحتوي كل صف على معرفات المراجع فحسب ، بل يحتوي أيضًا على الأسماء المقابلة.

بدلاً من استخدام رقم صحيح للجدول المرجعي ، استخدم عمود CHAR (4) ، مع اختصارات مكونة من 4 أحرف. لذلك ، فإن معرفات الفئات الخاصة بك ستصبح "TEST" ، "DSGN" ، "PROG" ، "OTHR". (هم الأوصاف ستبقى كلمات إنجليزية مناسبة ، بالطبع.) سيكون أبطأ قليلاً ، لكن صدقني ، لن يلاحظ أحد.

أخيرًا ، عندما يكون هناك نوعان فقط ، يستخدم معظم الأشخاص العمود المنطقي فقط. لذلك ، سيتم تنفيذ العمود "القياسي / الاستثناء" باعتباره عمودًا منطقيًا وسيطلق عليه "IsException".


قيود الجدول

تخضع جداول BigQuery للقيود التالية:

  • يجب أن تكون أسماء الجداول فريدة لكل مجموعة بيانات.
  • تدعم Cloud Console نسخ جدول واحد فقط في كل مرة.
  • عند نسخ الجداول ، يجب أن تكون مجموعة البيانات الوجهة موجودة في نفس موقع الجدول الذي يتم نسخه. على سبيل المثال ، لا يمكنك نسخ جدول من مجموعة بيانات في الاتحاد الأوروبي إلى مجموعة بيانات مقرها الولايات المتحدة.
  • عند نسخ جداول مصدر متعددة إلى جدول وجهة باستخدام أداة سطر الأوامر bq أو واجهة برمجة التطبيقات أو مكتبات العميل ، يجب أن تحتوي جميع الجداول المصدر على مخططات متطابقة.
  • عند تصدير بيانات الجدول ، فإن الوجهة الوحيدة المدعومة هي التخزين السحابي.
  • عند استخدام استدعاء API ، يتباطأ أداء التعداد كلما اقتربت من 50000 جدول في مجموعة بيانات.
  • يمكن لوحدة التحكم السحابية عرض ما يصل إلى 50000 جدول لكل مجموعة بيانات.

2 إجابات 2

ليس في عبارة واحدة ، سيتعين عليك وضع المؤشر حول الطاولات وإنشاء SQL ديناميكي للتحقق من كل منها بدوره مثل:

المؤشر الأول مشابه لاستعلامك ، والفرق الوحيد المهم هو أنه يتحقق من "لا توجد أعمدة ليست كذلك nullable "بدلاً من" ، هناك بعض تلك التي تكون خالية "لأنه إذا كان هناك عمود واحد على الأقل غير قابل للقيم لا يمكن أن يكون لديك أي صفوف لا تحتوي على قيم غير فارغة (إذا كنت بحاجة إلى سرد الجداول التي تحتوي على أعمدة غير قابلة للقيم ولكن لا تحتوي على صفوف صفرية) ، نظرًا لأنها تحتوي على صفوف صفرية بقيم غير خالية ، فأنت بحاجة إلى إجراء بعض التغييرات على ما سبق).

في الحلقة عبر المؤشر ، نستخدم SQL الديناميكي لإضافة عدد الصفوف في الجدول إلى متجرنا المؤقت ، ثم يضع المؤشر الداخلي لغة SQL ديناميكية معًا تضيف إلى هذا عدد الصفوف التي لا تحتوي على قيم غير فارغة. أضف PRINTSQL قبل EXEC (SQL) لمعرفة ما ينتج عن ذلك لكل جدول (أو بدلاً من الاستدعاء إلى EXEC إذا كنت تريد فقط رؤية الكود دون تشغيله).

سيستغرق هذا بعض الوقت للتشغيل على جداول بها الكثير من الصفوف حيث من شبه المؤكد أنه سيجري مسحًا للجدول على كل جدول مرشح.

ملاحظة: يشير الجدول الذي يحتوي على جميع القيم الفارغة إلى أنه لا يحتوي على مفتاح أساسي (حيث يجب تحديد هذه الأعمدة على الأعمدة غير القابلة للإلغاء) مما يشير إلى وجود مشكلة في تصميم قاعدة البيانات في مكان ما.

ملاحظة: إذا كنت تستخدم SQL Server 2017 أو أحدث ، يمكنك استبدال المؤشر الداخلي الذي ينشئ SQL الديناميكي باستعلام واحد باستخدام STRING_AGG (). في الواقع ، بالنسبة للإصدارات السابقة ، يمكنك استخدام الاختراق "العادي" لـ XML لإجراء تسلسل مماثل وتجنب المؤشر الداخلي ، على الرغم من أن هذا لن يحسن الوضوح بقدر ما تفعله GROUP البسيط واستخدام STRING_AGG ().


6 إجابات 6

يمكنك استخدام xts. فهرس مون. يشبه إنشاء كائن xts إنشاء كائن حديقة حيوان. بافتراض أن xData هو كائن xts الخاص بك ، فإن شيئًا مثل xData [.indexmon (xData)٪ في٪ c (5،6،7)] يجب أن يفعل ما تريد.

أحد الخيارات هو استخدام دالة cycle () التي تعطي الموقع في دورة كل ملاحظة. فمثلا:

ثم لتقسيم شهر معين ، استخدم فهرس ذلك الشهر:

يجب أن أشير إلى أن هذا يعيد متجهًا رقميًا ، والذي قد يمثل مشكلة بالنسبة لك وقد لا يكون بناءً على ما تريد القيام به من هناك. أشعر بالفضول لرؤية حلول أخرى أيضًا.

يمكنك استخراج الأشهر من عمود اليوم / الشهر / السنة إلى عمود جديد يسمى "الشهر" باستخدام سلسلة فرعية () على سبيل المثال ،

يجب أن يؤدي هذا إلى إنشاء عمود يحتوي على الأشهر فقط.

ثم مجموعة فرعية بناءً على قيم $ month

شكرا جزيلا لك على مساعدتك. اسمحوا لي أن أكتب الحلول الثلاثة التي تناسبني.

أولها هو إجابة جوشوا أولريش:

اقرأ البيانات وأنشئ كائن xts واستخدم indexmon

هنا قطعة من mdat

الحل الثاني جاء من القائمة البريدية الإسبانية R ويستخدم حزمة lubridate:

حبكة داتاز:

وآخر واحد أيضًا من القائمة البريدية الإسبانية يستخدم POSIXct لمراعاة التاريخ والوقت


4 إجابات 4

إذا كانت الاستعلامات في الإجراءات المخزنة ، أو يمكنك الحصول عليها في قاعدة بيانات مؤقتة كإجراءات مخزنة ، فإن نظام SP sp_depends وطرق عرض الكتالوج ذات الصلة سيساعدان. على أقل تقدير سوف يضيقون البحث.

إذا كانت الاستعلامات في الملفات ، فسيقوم القليل من Powershell بإنشاء SPs في أي وقت من الأوقات.

إذا كانت مضمنة في التطبيق أو ، heaven forfend ، التي تم إنشاؤها ديناميكيًا في وقت التشغيل أثناء تشغيل اختبار انحدار التطبيق ، فقد يعمل التقاط SQL المقدم والمتابعة على النحو الوارد أعلاه.

لقد نجحنا في استخدام مكتبة تحليل .Net SQL. اسمها بعيد المنال لي الآن. هل يجب أن أجدها سأقوم بتحريرها في هذه الإجابة. لا يزال يتعين عليك سحب SQL من التطبيق الخاص بك ، بالطبع.

ليس حل "جاهز للاستخدام" ، ولكن قد يكون هو ما تحتاجه: http://www.sqlparser.com

كما أوضحت في التعليق ، هذا إطار عمل ، وليس جاهزًا لاستخدام الحل ، ولكنه يحتوي على مجموعة جيدة جدًا من أمثلة التعليمات البرمجية ، بالإضافة إلى العرض التوضيحي المباشر.

أنت تذكر أن "بعض من الأعمدة والجداول يمكن إعادة تسميتها أو تختفي تمامًا. "سأفسر النتيجة الطبيعية لذلك هي: عظم من الأعمدة والجداول تظل كما كانت.

لذلك ، بافتراض أن هذا التقييم صحيح ، بدلاً من محاولة تحديد كل شيء ، يجب عليك إنشاء قاعدة بيانات اختبار لإجراء التغييرات.

قم باستعادة نسخة من قاعدة البيانات الخاصة بك وقم بتسميتها [Databasename_RevisionTest]. ثم قم بإجراء التغييرات في قاعدة بيانات الاختبار.

بمجرد تغيير الجداول والعروض (والأسماء المستعارة؟) ، استخدم بعض البرامج لمقارنة الجداول في [Databasename] مع [Databasename_RevisionTest] والإبلاغ عن التغييرات.

هناك الكثير من الأدوات لإجراء المقارنة. تصادف أن أستخدم SQL Compare الخاص بـ Red Gate ، ولكن هناك الكثير من المنتجات الأخرى. حتى أنني أرى أداة مقارنة "مجانية" على http://dbcomparer.com/.

يمكن أن يؤدي استخدام هذه الأداة إلى الإبلاغ عن جميع التغييرات التي تم إجراؤها ويمكن أن يبسط عملك من خلال التركيز فقط على ما تم تغييره.

بالطبع ، سوف ترغب في تغيير التعليمات البرمجية الخاصة بك لمطابقة تعريفات الجدول والأعمدة الجديدة. إحدى الطرق البسيطة ولكنها مملة هي لصق الكود (البرامج النصية ، والإجراءات المخزنة ، وما إلى ذلك) في جزء استعلام SSMS وتشغيل أمر الاستعلام / التحليل.

لم أستخدم مشروع الكود ، لكن ربما ستجده مفيدًا.

تعديل: لقد اقترحت نسخة من قاعدة البيانات ، ولكن نظرًا لأن البيانات الوصفية هي كل ما تحتاجه للاختبار ، فربما تكون المنظمة على استعداد لإنشاء قاعدة بيانات [Databasename_RevisionTest] لا تحتوي على بيانات.


10 إجابات 10

فكر فيما ستسترده وكيف تربطه بالمتغيرات في شفرتك.

فكر الآن فيما يحدث عندما يقوم شخص ما بتحديث مخطط الجدول لإضافة (أو إزالة) عمود ، حتى لو لم تستخدمه بشكل مباشر.

يعد استخدام select * عند كتابة الاستعلامات يدويًا أمرًا جيدًا ، وليس عند كتابة استعلامات عن التعليمات البرمجية.

تغييرات المخطط

  • الجلب حسب الطلب - إذا كان الرمز يجلب العمود # كطريقة للحصول على البيانات ، فإن التغيير في المخطط سيؤدي إلى إعادة ضبط أرقام الأعمدة. سيؤدي ذلك إلى إفساد التطبيق وستحدث أشياء سيئة.
  • الجلب بالاسم - إذا كانت الشفرة تجلب العمود بالاسم مثل foo ، ويضيف جدول آخر في الاستعلام عمودًا foo ، فقد تتسبب الطريقة التي يتم بها التعامل مع هذا في حدوث مشكلات عند محاولة الحصول على حق عمود فو.

في كلتا الحالتين ، يمكن أن يتسبب تغيير المخطط في مشاكل في استخراج البيانات.

ضع في اعتبارك أيضًا ما إذا كان العمود الذي تم استخدامه أم لا إزالة من الطاولة. حدد * من. لا يزال يعمل ولكن الأخطاء عند محاولة سحب البيانات من مجموعة النتائج. إذا تم تحديد العمود في الاستعلام ، فسيتم عرض ملف استفسار سوف يخطئ بدلاً من ذلك يعطي إشارة واضحة على ماهية وأين تكمن المشكلة.

عبء البيانات

يمكن أن تحتوي بعض الأعمدة على قدر كبير من البيانات المرتبطة بها. اختيار الخلف * سوف يسحب الكل البيانات. نعم ، هذا هو varchar (4096) الموجود على 1000 صف قمت بتحديده مرة أخرى ، مما يمنحك 4 ميغا بايت إضافية من البيانات التي لا تحتاجها ، ولكن يتم إرسالها عبر السلك على أي حال.

فيما يتعلق بتغيير المخطط ، قد لا يكون varchar موجودًا هناك عندما أنشأت الجدول لأول مرة ، ولكنه الآن موجود هناك.

عدم نقل النية

عندما تختار رجوعًا * وتحصل على 20 عمودًا ولكنك تحتاج فقط إلى عمودين ، فأنت لا تنقل الغرض من الكود. عند النظر إلى الاستعلام الذي يقوم بتحديد * لا يعرف المرء ما هي الأجزاء المهمة منه. هل يمكنني تغيير الاستعلام لاستخدام هذه الخطة الأخرى بدلاً من ذلك لجعلها أسرع بعدم تضمين هذه الأعمدة؟ لا أعرف لأن القصد من ما يعرضه الاستعلام غير واضح.

دعونا نلقي نظرة على بعض عبارات SQL التي تستكشف تلك تغييرات المخطط اكثر قليلا.

والأعمدة التي تحصل عليها هي oneid = 1 ، والبيانات = 42 ، و twoid = 2 ، والأخرى = 43.

الآن ، ماذا يحدث إذا أضفت عمودًا إلى الجدول الأول؟ http://sqlfiddle.com/#!2/cd0b0/1

ونتائجي من نفس الاستعلام السابق هي oneid = 1 ، و data = 42 ، و twoid = 2 ، و other = foo.

يؤدي التغيير في أحد الجداول إلى تعطيل قيم التحديد * وفجأة سيؤدي ارتباطك بـ "الآخر" إلى عدد صحيح إلى حدوث خطأ ولا تعرف السبب.

إذا كانت عبارة SQL الخاصة بك بدلاً من ذلك

لن يؤدي التغيير إلى الجدول الأول إلى تعطيل بياناتك. يتم تشغيل هذا الاستعلام بنفس الطريقة قبل التغيير وبعد التغيير.

الفهرسة

عندما تقوم بتحديد * من أنت تسحب الكل شكل الصفوف الكل الجداول التي تطابق الشروط. حتى الطاولات التي لا تهتم بها حقًا. في حين أن هذا يعني نقل المزيد من البيانات ، فهناك مشكلة أخرى في الأداء تكمن في أسفل المكدس.

إذا كنت تقوم بسحب الكثير من الأعمدة ، فإن مُحسِّن خطة قاعدة البيانات مايو تجاهل استخدام الفهرس لأنك ما زلت بحاجة إلى جلب كل هذه الأعمدة على أي حال وسيستغرق الأمر وقتًا أطول لاستخدام الفهرس ثم جلب جميع الأعمدة في الاستعلام أكثر من مجرد إجراء مسح كامل للجدول.

إذا كنت تقوم فقط بتحديد ، على سبيل المثال ، الاسم الأخير للمستخدم (وهو ما تفعله كثيرًا ولديك فهرس عليه) ، فيمكن لقاعدة البيانات إجراء فحص فهرس فقط (postgres wiki index only scan ، mysql full table scan vs full فحص الفهرس ، فحص الفهرس فقط: تجنب الوصول إلى الجدول).

هناك قدر كبير من التحسينات حول القراءة من الفهارس فقط إن أمكن. يمكن سحب المعلومات بشكل أسرع في كل صفحة فهرس لأنك تسحب القليل منها أيضًا - فأنت لا تسحب كل تلك الأعمدة الأخرى للاختيار *. يمكن لفحص فهرس فقط إرجاع النتائج بترتيب 100x أسرع (المصدر: تحديد * سيء).

هذا لا يعني أن فحص الفهرس الكامل أمر رائع ، فهو لا يزال فحصًا كاملاً - ولكنه أفضل من فحص الجدول الكامل. بمجرد أن تبدأ في مطاردة جميع الطرق التي يؤدي تحديدها * إلى الإضرار بالأداء ، فإنك تستمر في العثور على طرق جديدة.

القراءة ذات الصلة

مصدر قلق آخر: إذا كان استعلام JOIN وكنت تستعيد نتائج الاستعلام في مصفوفة ترابطية (كما هو الحال في PHP) ، فهي عرضة للخطأ.

  1. إذا كان الجدول foo يحتوي على معرّف واسم أعمدة
  2. إذا كان شريط الجدول يحتوي على معرف الأعمدة والعنوان ،
  3. وفي الكود الخاص بك ، تستخدم SELECT * FROM foo JOIN bar ON foo.id = bar.id

خمن ماذا يحدث عندما يضيف شخص ما اسم عمود إلى الجدول الشريطي.

سيتوقف الرمز فجأة عن العمل بشكل صحيح ، لأنه يظهر الآن عمود الاسم في النتائج مرتين وإذا كنت تخزن النتائج في مصفوفة ، فستحل البيانات من الاسم الثاني (bar.name) محل الاسم الأول (foo.name)!

إنها حشرة سيئة للغاية لأنها غير واضحة تمامًا. قد يستغرق الأمر بعض الوقت لمعرفة ذلك ، ولا توجد طريقة يمكن أن يتوقعها الشخص الذي يضيف عمودًا آخر إلى الجدول مثل هذا التأثير الجانبي غير المرغوب فيه.

لذلك ، لا تستخدم * ، كن متحكمًا في الأعمدة التي تسترجعها واستخدم الأسماء المستعارة عند الاقتضاء.

قد يكون الاستعلام عن كل عمود شرعيًا تمامًا ، في كثير من الحالات.

دائما الاستعلام عن كل عمود ليس كذلك.

إنه المزيد من العمل لمحرك قاعدة البيانات الخاص بك ، والذي يجب أن ينطلق ويبحث في البيانات الوصفية الداخلية لتحديد الأعمدة التي يحتاج إلى التعامل معها قبل أن يتمكن من متابعة العمل الحقيقي المتمثل في الحصول على البيانات فعليًا وإرسالها إليك مرة أخرى. حسنًا ، إنها ليست أكبر عبء في العالم ، لكن كتالوجات النظام يمكن أن تكون عنق الزجاجة بشكل ملحوظ.

إنه عمل أكثر لشبكتك ، لأنك تتراجع أي رقم من الحقول عندما تريد واحدًا أو اثنين منها فقط. إذا ذهب شخص ما [آخر] وأضف بضع عشرات من الحقول الإضافية ، وكلها تحتوي على أجزاء كبيرة من النص ، فإن معدل نقل البيانات يمر فجأة عبر الأرضية - بدون سبب واضح. يزداد هذا الأمر سوءًا إذا لم تكن عبارة "where" الخاصة بك جيدة بشكل خاص وكنت تقوم بسحب الكثير من الصفوف أيضًا - فمن المحتمل أن يكون هناك الكثير من البيانات التي تنتقل عبر الشبكة إليك (أي أنها ستكون بطيئة).

إنه عمل أكثر لتطبيقك ، حيث يتعين عليك التراجع وتخزين كل هذه البيانات الإضافية التي ربما لا يهتم بها التطبيق.

أنت تخاطر بتغيير الأعمدة لترتيبها. حسنًا ، لا داعي للقلق بشأن هذا (وأنت متعود إذا حددت الأعمدة التي تحتاجها فقط) ولكن ، إذا ذهبت احصل عليها جميعًا مرة واحدة وقرر شخص ما [آخر] إعادة ترتيب ترتيب الأعمدة داخل الجدول ، والذي تم إعداده بعناية ، وتصدير ملف CSV الذي تقدمه للحسابات أسفل القاعة فجأة الكل في وعاء - مرة أخرى ، بدون سبب واضح بسهولة.

راجع للشغل ، لقد قلت "شخص ما [آخر]" عدة مرات أعلاه. تذكر أن قواعد البيانات بطبيعتها متعددة المستخدمين ، وقد لا يكون لديك التحكم فيها كما تعتقد.


"sklearn.datasets" هي حزمة scikit ، حيث تحتوي على طريقة load_iris ().

load_iris ()، بشكل افتراضي إرجاع الكائن الذي يحمل البيانات ، الهدف وأعضاء آخرين فيه. من أجل الحصول على القيم الفعلية ، يجب عليك قراءة ملف البيانات والهدف المحتوى نفسه.

في حين أن "iris.csv" يحمل الميزة والهدف معًا.

لمعلوماتك: إذا قمت بتعيين return_X_y كصحيح في load_iris ()، ثم ستحصل على الميزات والهدف مباشرة.

إذا تم تشغيل برنامج المقتطف الثاني الخاص بك (استمرارًا) على نفس النواة حيث قمت بتشغيل برنامج المقتطف الأول ، فستحصل على هذا الخطأ لأن قزحية مجموعة البيانات قد تم تحديدها مسبقًا بواسطتك وتحتوي على بيانات طريقة مضمنة بالفعل ، مقدمة من Scikit- يتعلم.

عند العمل مع مخصص CSV الملفات ، الباندا لها طرق مختلفة يمكنك استخدامها ، مثل:

يرجى تأكيد ما إذا كان البرنامج الخاص بك قد جلب هذا الخطأ أو نواة منفصلة. وإلا إذا كان هذا الحل يناسب متطلباتك ، فيمكنك اختيار وضع علامة عليه كإجابة للمتعلمين الآخرين للاستفادة منها عند الشك.

عندما نقوم بتحميل بيانات القزحية مباشرة من مجموعات بيانات sklearn، لا داعي للقلق بشأن تقسيم الأعمدة للبيانات والهدف لأن sklearn نفسها كانت ستنظم البيانات بطريقة يمكننا استخدامها لتغذية النموذج مباشرة.

ولكن عندما نقوم بالتحميل من البيانات من ملف csv ، يتعين علينا تقسيم الأعمدة حسب احتياجاتنا وتنظيمها بطريقة بحيث يمكن إدخالها في النموذج. عند تنفيذ الأسطر التالية بعد قراءة ملف csv باستخدام read_csv في الباندا

أنت تشير بالفعل إلى سمات إطار بيانات الباندا وليس البيانات الفعلية وقيم العمود الهدف كما هو الحال في sklearn. سيتعين عليك استخدام iris ['data']، iris ['target'] للوصول إلى قيم العمود إذا كانت موجودة في مجموعة البيانات.


شاهد الفيديو: تثبيت تجميد الصفوف والاعمدة في اكسل - اكثر من صف وعمود